基于PWM的电机调速系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于PWM的电机调速系统
实验目的:
1.学会并掌握可keil软件的使用;
2.学会并掌握protues软件的使用;
3.通过实验巩固单片机相关知识和检验自身动手能力
实验要求:
掌握单片机相关知识,利用调PWM占空比的方式来控制直流电机的转速,并且在led数码管上显示转速。
实验设备和仪器:
1.89c51单片机最小系统
2.直流电机
3.示波器
实验内容:
本次实验设计是由小组五个成员共同完成基于PWM的电机调速系统并完成实物搭建和撰写实验报告。本次实验小组共提供了两个方案,方案一和方案二,两个方案各自具有优缺点,详细内容会在下面给出。
方案一实验步骤:
1.利用protues画电路图,电路图如图1所示:
图1:方案一电路图
2.根据电路图编写C语言代码:
代码如下:
#include
sbit PWM=P2^7;
sbit CS3=P2^3;
sbit CS2=P2^2;
sbit CS1=P2^1;
sbit CS0=P2^0;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
unsigned char timer1;
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Time1Config();
void main(void)
{
Time1Config();
while(1)
{
if(timer1>100) //PWM周期为100*0.5ms
{
timer1=0;
}
if(~key1)
{
if(timer1 <30) //改变30这个值可以改变直流电机的速度
{
PWM=1;
}
else
{
PWM=0;
}
CS0=0;CS1=0;CS2=1;CS3=0;
P0=tab[3];
P0=0xff;
CS0=0;CS1=0;CS2=0;CS3=1;
P0=tab[0];
P0=0xff;
}
else if(~key2)
{if(timer1 <50)
{
PWM=1;
else
{
PWM=0;
}
CS0=0;CS1=0;CS2=1;CS3=0; P0=tab[5];
P0=0xff;
CS0=0;CS1=0;CS2=0;CS3=1; P0=tab[0];
P0=0xff;
}
else if(~key3)
{if(timer1 <80)
{
PWM=1;
}
else
{
PWM=0;
}
CS0=0;CS1=0;CS2=1;CS3=0; P0=tab[8];
P0=0xff;
CS0=0;CS1=0;CS2=0;CS3=1; P0=tab[0];
P0=0xff;
}
else if(~key4)
{if(timer1 <100)
{
PWM=1;
}
else
{
PWM=0;
}
CS0=0;CS1=1;CS2=0;CS3=0; P0=tab[1];
CS0=0;CS1=0;CS2=1;CS3=0;
P0=tab[0];
P0=0xff;
CS0=0;CS1=0;CS2=0;CS3=1;
P0=tab[0];
P0=0xff;
}
}
}
void Time1Config()
{
TMOD|= 0x10; //设置定时计数器工作方式1为定时器
//--定时器赋初始值,12MHZ下定时0.5ms--//
TH1 = 0xFE;
TL1 = 0x0C;
ET1 = 1; //开启定时器1中断
EA = 1;
TR1 = 1; //开启定时器
}
void Time1(void) interrupt 3 //3 为定时器1的中断号{
TH1 = 0xFE; //重新赋初值
TL1 = 0x0C;
timer1++;
}
3.实验仿真,部分仿真结果如图2图3所示:
图2:仿真结果图(1)
图3:仿真结果图(2)
4.实物验证结果如图4所示:
图4:方案一实物验证结果
实物验证可以明显感觉到电机转速的变化,由于每个开发板不同,相比仿真程序,对实物验证程序进行了略微的修改,最终能达到要求。
方案二实验步骤:
1.利用protues画电路图,电路图如图5所示:
图5:方案二protues电路图
2.编写C语言程序代码:
代码如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^1;
sbit CLOCK=P2^4;
sbit ST=P2^5;
sbit EOC=P2^6;
sbit OE=P2^7;
sbit PWM=P3^7;
uint temp,temp1;
sbit CS3=P2^3;
sbit CS2=P2^2;
sbit CS1=P2^1;
sbit CS0=P2^0;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar start;
void delayms(uint ms)
{
uchar j;
while(ms--)