单片机课程设计完整版《PWM直流电动机调速控制系统》演示教学Word下载.docx
《单片机课程设计完整版《PWM直流电动机调速控制系统》演示教学Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计完整版《PWM直流电动机调速控制系统》演示教学Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
(6)实现数字PID调速功能。
1.2主要技术指标
(1)参考L298说明书,在系统中扩展直流电动机控制驱动电路。
(2)使用定时器产生可控PWM波,定时时间建议为250us。
(3)编写键盘控制程序,实现转向控制,并通过调整PWM波占空比,实现调速;
(4)参考Protuse仿真效果图:
图
(1)
图
(1)
2设计过程
本文设计的直流PWM调速系统采用的是调压调速。
系统主电路采用大功率GTR为开关器件、H桥单极式电路为功率放大电路的结构。
PWM调制部分是在单片机开发平台之上,运用汇编语言编程控制。
由定时器来产生宽度可调的矩形波。
通过调节波形的宽度来控制H电路中的GTR通断时间,以达到调节电机速度的目的。
增加了系统的灵活性和精确性,使整个PWM脉冲的产生过程得到了大大的简化。
本设计以控制驱动电路L298为核心,L298是SGS公司的产品,内部包含4通道逻辑驱动电路。
是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。
可驱动2个电机,OUTl、OUT2和OUT3、OUT4之间分别接2个电动机。
5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。
本设计以AT89C52单片机为核心,如下图
(2),AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
图
(2)
对直流电机转速的控制即可采用开环控制,也可采用闭环控制。
与开环控制相比,速度控制闭环系统的机械特性有以下优越性:
闭环系统的机械特性与开环系统机械特性相比,其性能大大提高;
理想空载转速相同时,闭环系统的静差(额定负载时电机转速降落与理想空载转速之比)要小得多;
当要求的静差率相同时,闭环调速系统的调速范围可以大大提高。
直流电机的速度控制方案如图(3)所示。
驱动电路
调节器
直流电机
测速装置
转速设定值
偏差
转速输出
+
-
直流电机速度控制方案图(3)
一、以下是直流电机调速3种控制方式选择:
1、电阻网络或数字电位器:
采用电阻网络或数字电位器调整电动机的分压,从而达到调速的目的。
但是电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。
更主要的问题在于一般电动机的电阻很小,但电流很大;
分压不仅会降低效率,而且实现很困难。
2、继电器:
采用继电器对电动机的开或关进行控制。
这个方案的优点是电路较为简单,缺点是继电器的响应时间慢、机械结构易损坏、寿命较短、可靠性不高。
3、H桥组成的高电压大电流双全桥式驱动芯片:
L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。
桥型电路保证了可以简单地实现转速和方向的控制;
电子开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。
兼于上述三种方案调速特性优良、调整平滑、调速范围广、过载能力大,因此本设计采用方案三。
二、以下是PWM脉宽的3种调制方式:
调脉宽的方式有三种:
定频调宽、定宽调频和调宽调频。
采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;
并且在采用单片机产生PWM脉冲的软件实现上比较方便。
最后再以键盘作为输入达到控制直流电机的启停、速度和方向,完成了基本要求和发挥部分的要求。
在设计中,采用了PWM技术对电机进行控制,通过对占空比的计算达到精确调速的目的。
三、驱动电路设计
单片机输出的电机控制PWM信号接在ENA端口,IN1和IN2端口控制电机正反转,通过一个非门实现。
对应的OUT1和OUT2输出接在直流电机两端。
如图(4)所示。
图(4)
2.1题目分析
在进行单片机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。
因此,软件设计在控制系统设计中占重要地位。
键盘向单片机输入相应控制指令,由单片机通过P3.7输出与转速相应的PWM脉冲,另一口输出高电平,驱动H型桥式电动机控制电路,实现电动机转向与转速的控制。
电动机所处速度级以速度档级数表示。
速度分4档,快慢与电动机所处速度级快慢一一对应。
在程序中通过软件产生PWM,送出预设占空比的PWM波形。
PWM(脉冲宽度调制)是一系列周期固定、占空比可调的脉冲系列,由于每个脉冲的高电平时间和低电平时间之和必须等于周期数,所以输出电平的维持时间必须由定时器来控制。
2.2整体构思
本系统采用AT89C51作为控制核心,用按钮来调节电机转速和数码管来显示设定转速和测量转速。
由上述提供的方案和最后选择结果,则用H桥组成的高电压大电流双全桥式驱动芯片L298作为本系统的驱动电路和用带有测速计的电机模型来取得电机的实际转速。
如图(5)所示。
测速计
按钮
LED数码管
显示单元
上位机
AT89C51
单片机
直流电机控制系统总体框图(5)
软件主要由3部分组成:
主程序、键盘扫描程序、中断处理程序。
主程序流程如图(6)所示。
图(6)主程序流程图
‘
2.3具体实现
定时中断处理程序实现
采用定时方式1,因为单片机使用12M晶振,可产生最高约为65.5ms的延时。
对定时器置初值0xFF9C可定时100us。
当100us定时时间到,定时器溢出则响应该定时中断处理程序,完成对定时器的再次赋值。
PWM脉宽控制实现
一个脉冲周期可以由高电平持续时间系数c16TimeH和低电平持续时间系数c16TimeL组成,本设计中采用的脉冲频率为10000Hz,可得c16TimeH+c16TimeL=65536,占空比为c16TimeH/(c16TimeH+c16TimeL),因此要实现定频调宽的调速方式,只需通过程序改变全局变量c16TimeH,c16TimeL的值。
其程序流程框如图(7):
图(7)
3元件说明及相关计算
3.1元件说明:
电动机:
选择电动机参数:
额定电压:
6V额定转速:
6000rpm减速比:
1:
46.7
空载转速:
128rpm10ms/转
单片机选择:
AT89C52是美国ATMEL公司生产的低电压,高性能CMOS
8位单片机,片内含8k
bytes的可反复擦写的只读程序存储器(PEROM)和256
bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C52单片机适合于许多较为复杂控制应用场合。
主要性能参数:
·
与MCS-51产品指令和引脚完全兼容
·
8k字节可重擦写Flash闪速存储器
1000次擦写周期
全静态操作:
0Hz-24MHz
三级加密程序存储器
256×
8字节内部RAM
32个可编程I/O口线
3个16位定时/计数器
8个中断源
可编程串行UART通道
低功耗空闲和掉电模式
功能特性概述:
AT89C52提供以下标准功能:
8k字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
L298电机驱动:
L298是一款单片集成的高电压、高电流、双路全桥式电机驱动,设计用于连接标准TTL逻辑电平,驱动电感负载(诸如继电器、线圈、DC和步进电机)。
L298提供两个使能输入端,可以在不依赖于输入信号的情况下,使能或禁用L298器件。
LED显示屏
PROTEUS设计与仿真平台
3.2相关计算:
设PWM周期为T,高电平时间为TH,低电平时间为TL,电压为VCC,则输出电压的平均值为:
UAV=VCC*TH/(TH+TL)=VCC*TH/T=aVCC,当VCC固定时,其电压值取决于PWM波形的占空比a,而PWM的占空比由单片机软件内部用于控制PWM输出的寄存器值决定。
一个脉冲周期可以由高电平持续时间系数c16TimeH和低电平持续时间系数c16TimeL组成,本设计中采用的脉冲频率为10000Hz,可得c16TimeH+c16TimeL=65536,占空比为c16TimeH/(c16TimeH+c16TimeL),因此要实现定频调宽的调速方式,只需通过程序改变全局变量c16TimeH,c16TimeL的值。
4调试过程
4.1调试过程:
1、初始状态,未调试之前,仿真图如下图(8)。
图(8)
2、启动仿真后,手动控制。
LED显示屏上显示电机转速的设定值和电机转速实际值。
如下图(9)图(10)图(11)所示。
图(9)启动仿真后
图(10)加速调节电机转速
图(11)减速调节电机转速
3、示波器显示PWM方波,状态(电机高速挡反转),显示如下图(12)。
图(12)
4、示波器显示PWM方波,状态(电机高速挡反转),显示如下图(13)。
图(13)
5、电机实际转速获取:
在Proteus中只有一种直流电机集成了测速传感器,在搜索栏里搜索motor-encoder,即可得到这种电机模型。
本设计中设置电机转一圈发出60个脉冲。
根据实际运转情况及结合所编写程序,确定转速公式为:
V=N*15;
V:
速度R/min
N:
每秒采样的脉冲个数
如右图所示,为带测速功能的直流电机模型
4.2遇到问题及解决措施:
问题一:
打开仿真软件读取程序时出现如下图所示的黄色条幅?
当你在测量时仿真必须停止。
也就是说,你想用探针等工具测量参数时,要停止仿真,即,在非仿真状态下,先放好探针等工具,再仿真。
问题二:
运行程序时,仿真软件底部出现如下图黄色字符?
经过上网查阅资料,给出的答案是电路中GND网络中存在逻辑竞争冲突,检查一下每个接地点是否存在接线错误。
或者是逻争征用,是程序里边那里赋值有误。
问题三:
部分源程序不懂,无法进行仿真,直流电机调速3种控制方式选择?
通过上网查阅资料和图书馆借阅图书得到的资料,程序得到了完善基本上达到了设计目的。
实现通过单片机对直流电机的控制,通过合理的设备选型、参数设置和软件设计,提高了直流电机调速运行的可靠性。
直流电机调速方式的选择详见2.1。
5心得体会
经过十天的学习,工作中,通过查阅相关资料了解了PWM直流电机调速系统,加深了对直流电机调速控制系统的认识,熟悉了单片机在控制系统中的运用。
并且在所学知识的基础上,利用已有的直流调速系统设计,尝试了自己的一些研究。
并且,使我将原来所学的知识系统化,理论化,实用化。
对如何使用已有知识及获取相关资料方面的能力又有了提高。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师、同学们的指导下,终于游逆而解。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
这次的课程设计给我很多专业知识以及专业技能上的提升,同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
通过这次课程设计,我掌握了常用元件的识别和测试;
熟悉了常用仪器、仪表;
了解了(PID仿真ISSI)的连线方法;
以及如何提高电路的性能等等,掌握部分程序的编写和仿真,通过查询资料,也了解PWM直流电机调速了系统。
参考文献
[1]李广弟等.单片机基础[M].北京航空航天出版社,2001.
[2]王东峰等.单片机C语言应用100例[M].电子工业出版社,2009.
[3]陈海宴.51单片机原理及应用[M].北京航空航天大学出版社,2010.
[4]刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.
[5]钟富昭等.8051单片机典型模块设计与应用[M].人民邮电出版社,2007.
[6]李平等.单片机入门与开发[M].机械工业出版社,2008.[7]陈伯石.电力拖动自动控制系统[M].北京:
机械工业出版社,2003.
[8]钟富昭.8051单片机典型模块设计与应用[M].北京:
人民邮电出版社,2007
[9]张靖武.单片机系统的PROTEUS设计与仿真[M].北京:
电子工业出版社,2007
[10]杨恢先.单片机原理及应用[M].北京:
人民邮电出版社,2006
[11]孟庆涛.图解电子控制电路[M].北京:
[12]谢维成.单片机原理与应用及C51程序设计[M].北京:
清华大学出版社,2006
[13]周润景.基于PROTEUS的电路及单片机系统设计与仿真[M].北京:
北京航空航天出版社,2006
[14]李光飞.单片机课程设计实例指导[M].北京:
北京航空航天出版社,2004
[15]杜坤梅.电机控制技术[M].哈尔滨:
哈尔滨工业大学出版社,2002
[16]李广第.单片机基础(修订版)[M].北京:
北京航空航天大学出版社,2001
[17]陈光东.单片微型计算机原理与接口技术(第二版)[M].武昌:
华中科技大学出版社,1999
[18]何耀三.电气传动的微机控制[M].重庆:
重庆大学出版社,1997
[19]薛钧义.MCS-51/96系列单片微型计算机及其应用[M].西安:
西安交通大学出版社,1997
[20]陈志强胡辉.单片机应用系统设计实践指南.自编教材
附录一:
电路原理图
附录二:
程序清单
#include<
reg52.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineTHC00xf9
#defineTLC00x0f//2ms
unsignedcharcodeDuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//共阴极数码管,0-9段码表
unsignedcharData_Buffer[8]={0,0,0,0,0,0,0,0};
//显示缓冲
uchari=0;
sbitAddSpeed=P1^1;
sbitSubSpeed=P1^2;
sbitPWM_FC=P1^0;
inte,e1,e2;
//pid偏差
floatuk,uk1,duk;
//pid输出值
floatKp=10,Ki=12,Kd=1.6;
//pid控制系数10,12,1.5
intout=0;
uintSpeedSet=380;
uintcnt=0;
uintInpluse=0,num=0;
//脉冲计数
uintPWMTime=100;
//脉冲宽度
unsignedchararry[];
voidSendString(uintch);
voidPIDControl();
voidSystemInit();
voiddelay(ucharx);
voidPWMOUT();
voidSetSpeed();
voidSegRefre();
/**************主函数************/
voidmain()
{
SystemInit();
while
(1)
{
SetSpeed();
//按键设定速度
SegRefre();
//数码管显示刷新
PWMOUT();
//输出PWM
}
}
voidPIDControl()//pid偏差计算
e=SpeedSet-num;
//误差=设定值-1s采集的脉冲值
duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;
//增量式PID公式/50是对duk进行缩小处理
uk=uk1+duk;
out=(int)uk;
//输出为占空比
if(out>
1000)
out=1000;
elseif(out<
0)
out=0;
uk1=uk;
//变量值移位
e2=e1;
e1=e;
PWMTime=out;
voiddelay(ucharx)
uinti,j;
for(i=x;
i>
0;
i--)
for(j=50;
j>
j--);
voidPWMOUT()//输出PWM脉冲
if(cnt<
PWMTime)//高电平时间为PID输出PWMTime
PWM_FC=1;
else
PWM_FC=0;
if(cnt>
1000)cnt=0;
voidSystemInit()
TMOD=0X21;
TH0=THC0;
TL0=TLC0;
TH1=0xC0;
TL1=0XC0;
ET1=1;
ET0=1;
TR0=1;
TR1=1;
EX0=1;
//中断0用来测量转速
IT0=1;
EA=1;
e=0;
//初始化差值
e1=0;
e2=0;
voidSetSpeed()
if(AddSpeed==0)
delay(200);
//消抖处理
if(AddSpeed==0)
{
SpeedSet+=10;
if(SpeedSet>
1500)
{
SpeedSet=1500;
}
}
if(SubSpeed==0)
if(SubSpeed==0)
SpeedSet-=10;
if(SpeedSet<
0)SpeedSet=0;
voidSegRefre()//显示刷新
Data_Buffer[0]=SpeedSet/1000;
//分离设定值各位
Data_Buffer[1]=SpeedSet%1000/100;
Data_Buffer[2]=SpeedSet%100/10;
Data_Buffer[3]=SpeedSet%10;
Data_Buffer[4]=num/1000;
//分离采集脉冲数各位
Data_Buffer[5]=num%1000/100;
Data_Buffer[6]=num%100/10;
Data_Buffer[7]=num%10;
voidint0()interrupt0
Inpluse++;
//采集外部脉冲
voidt0()interrupt1
staticunsignedcharBit=0;
//静态变量,退出程序值保留
staticunsignedinttime=0;
Bit++;
time++;
//转速测量周期
if(Bit>
8)Bit=0;
P0=0xff;
P2=Duan[Data_Buffer[Bit]];
//显示段码
switch(Bit)//数码管位选
case0:
P0=0X7F;
break;
case1:
P0=0XBF;
case2:
P0=0XDF;
case3:
P0=0XEF;
case4:
P0=0XF7;
case5:
P0=0XFB;
case6:
P0=0XFD;
case7:
P0=0XFE;
if