基于PWM的电机调速系统设计.docx
- 文档编号:6950711
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:13
- 大小:1.11MB
基于PWM的电机调速系统设计.docx
《基于PWM的电机调速系统设计.docx》由会员分享,可在线阅读,更多相关《基于PWM的电机调速系统设计.docx(13页珍藏版)》请在冰豆网上搜索。
基于PWM的电机调速系统设计
基于PWM的电机调速系统
实验目的:
1.学会并掌握可keil软件的使用;
2.学会并掌握protues软件的使用;
3.通过实验巩固单片机相关知识和检验自身动手能力
实验要求:
掌握单片机相关知识,利用调PWM占空比的方式来控制直流电机的转速,并且在led数码管上显示转速。
实验设备和仪器:
1.89c51单片机最小系统
2.直流电机
3.示波器
实验内容:
本次实验设计是由小组五个成员共同完成基于PWM的电机调速系统并完成实物搭建和撰写实验报告。
本次实验小组共提供了两个方案,方案一和方案二,两个方案各自具有优缺点,详细内容会在下面给出。
方案一实验步骤:
1.利用protues画电路图,电路图如图1所示:
图1:
方案一电路图
2.根据电路图编写C语言代码:
代码如下:
#include
sbitPWM=P2^7;
sbitCS3=P2^3;
sbitCS2=P2^2;
sbitCS1=P2^1;
sbitCS0=P2^0;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
unsignedchartimer1;
unsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voidTime1Config();
voidmain(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;
}
elseif(~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;
}
elseif(~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;
}
elseif(~key4)
{if(timer1<100)
{
PWM=1;
}
else
{
PWM=0;
}
CS0=0;CS1=1;CS2=0;CS3=0;
P0=tab[1];
P0=0xff;
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;
}
}
}
voidTime1Config()
{
TMOD|=0x10;//设置定时计数器工作方式1为定时器
//--定时器赋初始值,12MHZ下定时0.5ms--//
TH1=0xFE;
TL1=0x0C;
ET1=1;//开启定时器1中断
EA=1;
TR1=1;//开启定时器
}
voidTime1(void)interrupt3//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
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P3^1;
sbitCLOCK=P2^4;
sbitST=P2^5;
sbitEOC=P2^6;
sbitOE=P2^7;
sbitPWM=P3^7;
uinttemp,temp1;
sbitCS3=P2^3;
sbitCS2=P2^2;
sbitCS1=P2^1;
sbitCS0=P2^0;
uchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharstart;
voiddelayms(uintms)
{
ucharj;
while(ms--)
{
for(j=0;j<120;j++);
}
}
voiddelay(uintzz);
voidmain()
{
P3=0;P0=0xff;
TMOD=0x02;
TH0=0x01;
TL0=0X00;
IE=0x82;
TR0=1;
start=0;
while
(1)
{
start=1;
while(start)
{
ST=0;ST=1;ST=0;//启动ADC0809
while(!
EOC);//查询EOC是否为1;
OE=1;
temp=P1;//读取A/D转化的结果
OE=0;
temp1=temp/2.38;
CS0=0;CS1=1;CS2=0;CS3=0;
P0=tab[temp1/100];
delayms
(1);
P0=0xff;
CS0=0;CS1=0;CS2=1;CS3=0;
P0=tab[temp1%100/10];
delayms
(1);
P0=0xff;
CS0=0;CS1=0;CS2=0;CS3=1;
P0=tab[temp1%10];
delayms
(1);
P0=0xff;
PWM=1;//PWM输出高电平
delay(temp);//正脉冲宽度
PWM=0;//PWM输出低电平
delay(255-temp);//低脉冲宽度
}
}
}
voidclockwave()interrupt1
{
CLOCK=!
CLOCK;
TH0=0x01;
TL0=0X00;
}
voiddelay(uintzz)
{
uintx,y;
for(x=zz;x>0;x--)
for(y=50;y>0;y--);
}
3.实验仿真,部分仿真结果如图6所示:
图6:
方案二仿真结果
4.实物结果如图7所示:
图7:
方案二实物结果
实验总结:
本次实验提供了方案一和方案二两个方案,方案一是通过不同按键设定不同的PWM占空比从而实现对电机调速,其优点是可以设定我们自己需要的转速从而实现相对精确的调速;缺点便是只能调到设定的转速,如需调制其它速度,需要对软件代码进行改写,相对而言比较繁琐。
方案二是通过滑动变阻器改变电压值从而改变PWM占空比实现电机调速,其优点是可以直接从硬件调速,快速方便;缺点就是利用滑动变阻器难以精确控制PWM占空比从而精确控制转速。
方案一和方案二各有优缺点,可以对自己的需求进行选择。
心得体会:
通过本次的实验,小组成员都发现自己的知识面还是非常的狭窄,缺少的东西也有很多,在网上查找一些相关的资料以及在图书馆借阅了几本关于单片机方面的书籍,慢慢的懂了一些关于编程和仿真方面的问题。
通过这次实验,成员们都发现各自还是存在一些问题。
这些不经意的东西虽然看起来不起眼,但是在试验中是不可忽视的问题。
这次试验让我遇到的困难有很多,例如一开始在编程的时候,我们一直在重视如何获取电机的转速并在led上实时显示,失败之后吸取经验从PWM波形入手来显示数值。
这次的实验,学习到的内容也有很多,不求在一个试验中就能让我学到很多的东西,但在以后的学习中,会慢慢的一点点改进,熟练的理解以及掌握相关的知识,希望能在这方面学到的越来越多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PWM 电机 调速 系统 设计