基于PWM的单片机直流电机速度控制.docx
《基于PWM的单片机直流电机速度控制.docx》由会员分享,可在线阅读,更多相关《基于PWM的单片机直流电机速度控制.docx(21页珍藏版)》请在冰豆网上搜索。
基于PWM的单片机直流电机速度控制
沈阳航空航天大学
课程设计任务书
课程名称计算机控制技术课程设计
院(系)专业
班级学号学生姓名
课程设计题目基于PWM的单片机直流电机速度控制
课程设计时间2013年7月1日至2013年7月12日
课程设计内容及要求:
设计以51单片机为核心的电机调速系统硬件、以C或C++等高级编程语言为控制软件、基于PID控制算法的直流电机速度控制模型,实现直流电机的转速控制。
主要内容有:
1)了解计算机控制系统的组成、计算机控制系统的硬件结构形式和计算机控制系统软件程序的编制。
2)了解51单片机与相关外围器件、电路的工作原理和接口技术,学会进行控制系统软件程序设计。
3)搭建数字直流电机闭环调速系统,了解其功能结构及软硬件实现方式,了解测速电路组成、工作原理等。
4)以模型微型直流电机为控制对象,应用PID控制算法实现直流电机的速度控制,分析结果。
课程设计主要要求有:
1)掌握电机转速测量的基本原理、利用PWM进行控制的方法和闭环调速系统的工作原理,绘制硬件原理图。
2)利用C或C++等高级语言编程,构造数字PID控制器,实现直流电机闭环调速。
3)使用LED数码管显示转速。
进行相应的数据分析,得出结论。
4)整理程序设计文档、按照课程设计要求撰写课程设计报告,字数不少于8000字。
指导教师年月日
负责教师年月日
学生签字年月
目录
0前言1
1转速控制基本原理1
2总体方案设计1
3硬件电路设计2
3.1单片机系统3
3.2测速模块3
3.3电源模块4
3.4L298N驱动模块4
3.5LED数码管显示5
4软件设计8
4.1显示程序设计9
4.2转速测量设计9
4.3PID速度调节设计10
5系统调试和结果分析11
6结论及进一步设想11
参考文献11
课设体会12
附录1电路原理图13
附录2程序清单14
基于PWM的单片机直流电机速度控制
王辉沈阳航空航天大学自动化学院
摘要:
本文设计的是基于PWM单片机的直流电机调速系统,本系统设计以AT89C51单片机为核心,采用PID闭环控制实现对电机转速的控制盒调节。
本设计分成两个模块,一是直流电机控制系统:
此系统采用L298n驱动直流电机,通过控制PWM调节直流电机转速;另一个是转速显示系统:
此系统主要实现对转速的计数,并用LED数码管将其结果显示。
其中采用采用PWM可以较为简单的对直流电机转速的控制;LED数码管可以准确的将转数显示出来,在实际应用中很方便。
关键词:
光电开关;单片机;L298N;PID;LED数码管显示。
0前言
近年来,随着科技的进步,直流电机得到了越来越广泛的应用,直流具有优良的调速特性,调速平滑,方便,调速范围广,过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速起动、制动和反转,广泛的应用使得人们对直流电机调速系统提出了更高的要求,传统的改变电枢回路电阻调速、改变电压调速等技术已远远不能满足现代科技的要求,于是通过PWM方式控制直流电机调速的方法就应运而生。
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。
PID控制器问世至今已有近70年历史,以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
本设计就是通过PID搭建闭环调速系统实现对PWM的控制,进而控制直流电机转速。
本设计采用AT89C51单片机的定时/计数器和外部中断来实现转速测量。
单片机具有体积小、价格低廉、可靠性高、开发较为容易等优点。
测量原理是在单位定时时间里对被测信号脉冲进行计数。
通过PID对转速误差进行调节。
1.转速控制的基本理论
PWM控制转速是通过控制输入直流电机的平均电压来控制电机转速。
PWM脉冲的周期固定,通过改变高低电平所占的时间即占空比来改变平均电压,进而实现对直流电机转速的控制。
PID增量型算法是通过返回误差的极性和大小老控制PWM脉冲的占空比,实现PID闭环控制。
2总体方案设计
针对本课题的设计任务,进行分析得到:
本次设计用光电传感器进行电压脉冲进行测量,定时器T0定时10秒钟,在此期间,光电开关检测光电码盘输出脉冲波,外部中断INT0检测脉冲下降沿并计数测得直流电机的转速。
实际转速返回单片机后与所设定的转速初值进行比较,通过两者的误差实现PID控制转速。
AT89C52单片机为控制核心由软件转换成PWM信号,并由P2.1、P2.2输出,经驱动电路输出给电机,从而控制输入电机的平均电压。
软件采用定时中断进行设计。
单片机上电后,系统进入准备状态。
当按动启动按钮后,根据P2.1为高电平P2.2为低电平实现电机转动,调整P2.1/P2.2输出高低电平时的预定值,从而可以控制P2.1/P2.2输出高低电平时的占空比,进而控制电压的大小。
PID控制程序应用于电机的加减速。
系统整体设计框图如图1所示
图1系统整体设计框图
直流电机由L298N驱动,可实现大转速范围内的无级调速。
转速信号由光电传感器拾取,使用时应先在转子上安装一光电码盘,光电码盘通过光电传感器时,光电传感器输出高电平,反之,输出低电平。
这样,光电传感器就输出矩形脉冲信号,通过89C52内部外部中断INT0对下降沿进行计数并显示在数码管上,组成一个数字式转速测量系统。
3硬件电路的工作原理
打开电源开关,由单片机通过P2.1口输出与转速相应的PWM脉冲,另一口输出低电平,经过L298N控制电路,实现电动机转速的控制。
电动机的转速通过数码管显示出来。
转速设定值为14(每10秒电机转过的圈数),用于PID设定初值,计算误差,然后通过比例、积分和微分调节控制转速,使得直流电机最终的转速接近或等于转速设定值。
3.1单片机系统
单片机(single-chipmicrocomputer)是一块集成芯片,但不是一块实现某一个逻辑功能的芯片,而是在这块芯片当中,集成了一个计算机系统。
如中央处理器(CPU)、存储器(ROM,RAM)、I/O接口、定时器/计数器、中断系统等。
中央处理器是单片机的核心单元,他由运算器和控制器组成,他的主要功能是实现算术运算、逻辑运算、和控制。
51系列是基本型,包括8051、8751、8031、8951这四个机种区别,仅在于片内程序储存器。
8051为4KBROM,8751为4KBEPROM,8031片内无程序储存器,8951为4KBEPROM。
其他性能结构一样,有片内128BRAM,2个16位定时器/计数器,5个中断源。
其中,8031性价比较高,又易于开发,目前应用面广泛。
本系统采用CPU为89C51的单片微机,89C51本身带有8K的内存储器,可以在编程器上实现闪烁式的电擦写达几万次以上,比以往惯用8031CPU外加EPROM为核心的单片机系统在硬件上具有更加简单、方便等优点,而且完全兼容MCS51系列单片机的所有功能。
下面介绍89C52的主要管脚功能如下:
VCC(40):
电源+5V;VSS(20):
接地;XTAL1(19)和XTAL2(18):
外接石英晶体振荡器;P0口(32-39):
双向I/O口,既可作低8位既可作低8位地址和8位数据总线使用,也可作普通I/O口;P1口(1-8):
准双向通用I/O口;P2口(21-28):
既可作高8位地址总线,也可作普通I/O口;P3口(10-17):
多用途端口,既可作普通I/O口,也可按每位定义的第二功能操作;RST(9):
复位信号输入端;ALE/PROG:
地址锁存信号输出端;PSEN:
内部和外部程序存储器选择线。
如图3所示
图389C52
3.2测速模块
本设计中采用对射式光电传感器——光电开关采集信号。
这种传感器是把旋转轴的转速变为相应的脉冲,然后用AT89C51自身的外部中断对外部脉冲下降沿进行计数。
这种测量方法具有简单、可靠、测量精度高的特点,是目前常用的一种测量转速的方法。
从光源发出的光通过光电码盘照射到光电元件上,使光电元件感光。
光电码盘上有n个齿槽,当光电码盘旋转一周,光敏元件就能感受与开孔数相等次数的光次数。
被测电机转动1秒,外部中断计数记得脉冲个数为M,则直流电机的转速为M/N。
光电传感器如图3所示。
图3光电传感器电路图
3.3电源模块
普通直流电机的驱动电压一般为5-12V,集成芯片的工作电压一般为5V,电池电压为7.2V,若要各个模块都能正常工作,必须加入电源模块,将电池电压放大或缩小。
使系统能够正常工作。
本设计电源模块主要是使7.2V电池电压转化为5V稳压,给单片机,光电开关供电。
5V稳压电路的实现通常通过使用7805、2940等稳压芯片实现。
以7805芯片为例,只要把正输入电压加到7805的输入端,7805的公共端接地,其输出端便能输出芯片标称正电压。
在实际应用电路中,芯片输入端和输出端与地之间除分别接大容量滤波电容外,通常还需在芯片引出根部接小容量(0.1~10μF),用于抑制芯片自激振荡,减小高频噪声。
具体取值应随芯片输出电压的高低及应用电路的方式不同而异。
7805稳压电路连接图如图4所示
图47805稳压电路连接图
3.4L298N驱动模块
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。
该芯片采用15脚封装。
主要特点是:
工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。
内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。
使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
L298N驱动直流电机的逻辑表如表1所示
ENA
IN1
IN2
运转状态
0
×
×
停止
1
1
0
正转
1
0
1
反转
1
0
0
停止
表1L298N驱动直流电机的逻辑表
3.4LED数码管显示
显示设计采用LED七段数码管显示,本电路数码管为共阴极接法。
两个74HC573数字锁存器分别对数码管的段选码、位选码锁存,由LE接口控制。
单片机P2.6接口控制段选,P2.7接口控制位选。
LED数码管显示电路如图5
图5 LED数码管显示电路
4软件设计
软件是一系列按照特定顺序组织的计算机数据和指令的集合。
软件在现代仪器中起到了至关重要的作用,在电子设计中硬件与软件是紧密结合起来的,软件不同于硬件,他是计算机系统中的逻辑实体而不是物理实体,具有抽象性。
软件的开发需要用到计算机高级语言。
常用的计算机编程语言有C语言、C++、Java等。
软件的设计减少了硬件设备的使用,既降低了成本,又提高了效率,传统仪器的许多硬件设备已经被软件所取代,使现代仪器更加智能化。
软件的设计包括程序的总体设计和对程序的模块化设计。
按整体功能分为多个不同的模块,单独设计、编程、调试,然后将各个模块装配联调,组成完整的软件。
在本设计中软件起着决定性的作用。
本次设计采用的是C语言编程。
使用Keil软件进行编译。
通过对系统设计的内在逻辑分析大致将本次设计的软件编程分为显示模块、测速模块和调速模块。
下面为本次课设总设计图和各部分软件设计。
总设计图如图6所示
Y
N
图6总设计图
4.1显示程序设计
将转速测量值在LED上显示出来的程序。
51单片机P2^6口为位选口,P2^7口为段选口,数码管显示框图如图7所示
图7数码管显示框图
4.2转速测量设计
直流电机转轴安装光电码盘,光电传感器输出脉冲波送人单片机中,经数据处理显示在数码管上个。
测速流程图如图8
图8测速流程图
4.3PID速度调节设计
直流电机启动之前先给直流电机设定初值,通过PID对转速进行调节。
PID返回误差,通过比例、积分和微分实现直流电机转速快速、无差调节。
被控量的值由传感器或变送器来检测,这个值与给定值进行比较,得到偏差,模拟调节器依一定控制规律使操作变量变化,以使偏差趋近于零,其输出通过执行器作用于过程。
PID调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对控制对象进行控制。
1、PID调节器的微分方程
式中e(t)=r(t)-c(t)
2、PID调节器的传递函数
PID增量式控制算法与采样周期有关。
采样周期越小,数字模拟越精确,控制效果越接近连续控制。
对大多数算法,缩短采样周期可使控制回路性能改善,但采样周期缩短时,频繁的采样必然会占用较多的计算工作时间,同时也会增加计算机的计算负担,而对有些变化缓慢的受控对象无需很高的采样频率即可满意地进行跟踪,过多的采样反而没有多少实际意义。
PID流程图如图9
图9PID流程图
5系统调试和结果分析
由传感器发送来的采样信号通过接口电路传送到单片机里,单片机通过对信号的处理测出直流电机的实际转速。
实际转速与所设定的初值转速进行比较,通过PID控制算法调节转速直到实际转速与设定转速接近或相等。
通过LED将设定转速和实际转速显示出来。
结果分析:
系统正常运行后数码管前两位显示设定初值,电机转动数码管最后两位显示实际转速,当实际转速与设定转速不相等时,进行PID调速,直到转速值于设定值相等。
6结论及进一步设想
根据实验结果,本次实验基本完成了设计要求,实现了转速在LED上的显示。
不过本次实验只是要求了在理想环境下PID调节,并未结合到实地生产生活中进行应用,所以只能作为理论上的模拟。
而且,PID调节更适合于大惯性高速调节,用PID调节直流小电机时,调节速度较慢,精度较低。
在实际设计中需要从多角度出发,让反馈信号成为限制转速的输入信号,还要考虑环境因素对电机转速的影响,调节PID参数,让设计真正的融入到实地的生产生活中。
参考文献
[1]刘复华单片机及其应用系统.北京:
清华大学出版社,1992
[2]楼然苗51系列单片机设计实例北京航空航天出版社2003.3
[3]刘瑞新单片机原理及应用教程机械工业出版社2003.7
[4]吴国经单片机应用技术中国电力出版社2004.1
[5]马忠梅单片机C语言应用程序设计北京航空航天大学出版社2003
[6]周润景基于proteus的电路及单片机设计与仿真(第二版)北京航空航天大学出版社2009.12
课设体会
本次课程设计已经接近尾声,在两周的课设过程中,从构思到方案设计再到硬件连接软件编程,付出了不少的努力,更学到了很多知识。
尤其是在硬件设计和软件编程方面,我下了不少的功夫。
我的实验目的是要用光电传感器和单片机实现转速控制的功能,通过平日里学到的知识和这一个多星期的努力,我有机会亲自动手动脑,自己设计而且顺利完成这项任务,理论与实践相结合,获益匪浅。
本次课程设计不仅用到了近期学的智能仪器单片机方面的知识,还用到了之前掌握的C语言等计算机的应用技术,并且对之前不太熟练掌握keil也有了更加深入的了解和练习。
这是一次综合知识的锻炼,我在进行简单课程的同时,也在思考着对我所设计的产品的进一步开发,让设计适用于社会发展,适用于人们的生活。
虽然我在做课程设计的过程中遇到了很多的挫折,但是通过老师和同学的帮助,成功的功课了许多难题。
作为自动化学生,电子器件是我们每个人都必须掌握的基础知识,不仅要掌握,还要学会使用和新产品的开发。
纸上得来终觉浅,绝知此事要躬行。
本次课程设计就是一个理论结合实际的平台,使我们对于电子产品的使用有了初步的认识,加深兴趣,增强自信,提高综合素养。
最后,向在课设期间给予我帮助关心和悉心教导曲晓光老师和各位同学们衷心的说一声谢谢。
[2012年7月19日完成]
附录1电路原理图
附录2程序清单
#include//包含头文件
#include
#include
#include
sbitdula=P2^6;
sbitwela=P2^7;
sbitint1=P2^1;
sbitint2=P2^2;
unsignedcharzhouqi=100;//定义周期100ms
unsignedcharzhankongbi=100;//定义高电平占空比为50%
intcount=0,shi,ge,zhuansu,i=0,M=0,j=0;
unsignedcharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
structPID{
floatSetSpeed;//定义设定值
floatActualSpeed;//定义实际值
floaterr;//定义偏差值
floaterr_last;//定义上一个偏差值
floaterr_prev;//定义前一个偏差
floatKp,Ki,Kd;//定义比例、积分、微分系数
floaterr_sum;//偏差累加
}pid;
/********************************/
/*延时函数*/
/********************************/
voiddelayms(unsignedintz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************/
/*数码管显示转速函数*/
/********************************/
voiddisplay()
{
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[4];
dula=0;
delayms(5);
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[1];
dula=0;
delayms(5);
wela=1;
P0=0xef;
wela=0;
dula=1;
shi=zhuansu/10;
P0=table[shi];
dula=0;
P0=0xff;
delayms(5);
wela=1;
P0=0xdf;
wela=0;
dula=1;
ge=zhuansu%10;
P0=table[ge];
dula=0;
P0=0xff;
delayms(5);
}
/********************************/
/*测速函数*/
/********************************/
voidcesuinit()
{
TMOD=0x11;//定时器T0,方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;//定时10mS
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;//定时10mS
ET0=1;
TR0=1;
ET1=1;
TR1=1;
EA=1;//打开总中断
EX0=1;//开外部中断
IT0=1;
}
/********************************/
/*PID初始化*/
/********************************/
voidPID_init()
{
pid.SetSpeed=14;
pid.err=0.0;
pid.err_last=0.0;
pid.err_prev=0.0;
pid.Kp=2;
pid.Ki=10;
pid.Kd=2;
}
floatPID_realize()
{
floatderr,err;
err=pid.ActualSpeed-pid.SetSpeed;//偏差
pid.err_sum+=err;//积分
derr=pid.err_last-pid.err;//当前微分
pid.err_prev=pid.err_last;
pid.err_last=pid.err;
return(pid.Kp*err);//比例项
//+pid.Ki*pid.err_sum//积分项
//+pid.Kd*derr);//微分项
}
/********************************/
/*主函数*/
/********************************/
main()
{
int1=1;
int2=0;
cesuinit();
PID_init();
while
(1)
{
pid.ActualSpeed=zhuansu;
display();
}
}
/********************************/
/*定时中断0*/
/********************************/
voidtim0(void)interrupt1using1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;//定时10mS
i++;
if(i==800)
{
i=0;
zhuansu=count/20;
count=0;
if(PID_realize()>0)
zhankongbi=zhankongbi-5;
else
zhankongbi=zhankongbi+5;
}
}
/*******************************
定时中断1
*******************************/
voidtim1(void)interrupt3using1
{
staticunsignedcharcount0=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;//定时1mS
if(count0==zhankongbi)
{
int1=0;
}
count0++;
if(count0