资源描述
滨江学院
专 业 综 合 设 计
题 目 直流电机闭环调速系统控制
院 系 自动控制
专 业 自动化
组 别 第二组
组 长 周未政
指导教师 周旺平
二 0 一 0 年 十二 月 二十八 日
基于单片机的直流电机闭环调速控制系统
摘要:设计以AT89C51单片机控制模块为核心,由单片机控制、红外线光电检测装置、直流电机转速为被测量组成的控制系统。原理是利用红外线光电传感器接收直流电机转速所产生的红外信号转换成电信号传输给单片机,并调节转速的闭环调速控制系统。
1. AT80C51单片机介绍
1.1主电源引脚
Vss—(20脚): 电路地电平
Vcc—(40脚): 正常运行和编程校检(8051/8751)时为+5V电源。
1.2外接晶振或外部振荡器引脚
XTAL1—(19脚): 接外部晶振的一个引脚. 在单片机内部, 它是一个反相放大器的输入端, 这个放大器构成了片内振荡器. 当采用外部振荡器时, 此引脚应该接地.
XTAL2—(18脚): 接外部晶振的另一个引脚. 在片内接至振荡器的反相放大器的输出和内部时钟发生器的输入端. 当采用外部振荡器时, 则此引脚接外部振荡信号的输入。
1.3控制、选通或电源复用引脚
RST/Vpd—(9引脚): RST即Reset(复位)信号输入端。
ALE/PROG—(30引脚): ALE, 允许地址索存信号输出。
PSEN—(29脚): 访问外部程序存储器选通信号, 低电平有效。.
Vpp/EA—(31引脚): EA为访问内部或外部程序存储器选择信号。
1.4多功能I/O口引脚
P0口—(32-39脚):8位漏极开路双向并行I/O接口.
P1口—(1-8脚): 8位准双向并行I/O接口.
P2口—(21-28脚):8位准双向并行I/O接口.
P3口—(10-17脚):具有内部上拉电路的8位准双向并行I/O端口。它还提供第二特殊功能,具体含义为:
P3.0—(10脚)RXD: 串行数据接收端。
P3.1—(10脚)TXD: 串行数据发送端。
P3.2—(10脚)INT0: 外部中断0请求端, 低电平有效。
P3.3—(10脚)INT1: 外部中断1请求端, 低电平有效。.
P3.4—(10脚)T0: 定时器/计数器0外部事件计数输入端。.
P3.5—(10脚)T1: 定时器/计数器1外部事件计数输入端。
P3.6—(10脚)WR: 外部数据存储器写选通, 低电平有效。
P3.7—(10脚)RD: 外部数据存储器读选通, 低电平有效。
2. 设计任务
通过加速、减速按键实现电机的加速与减速,并将当前的转速的设定值反馈回来经PID调解后的转速经LCD显示出来。
电机调速系统框图
3.系统流程图
电机控制软件流程图
上图为积分分离式PID控制算法的流程图。通过80C51给定的转速与红外检测电路测得的经计算后的速度得到偏差ek 。与设定的e max相比较,若e k <e max可以采用PID控制提高系统的控制精度,若ek ≥e max则采用PD控制,可以避免系统产生较大的超调量而且采用PD控制又可以提高系统的灵敏性。
4.电路模块及原理
4.1驱动电路
直流电动机驱动电路图如图1所示。其中L298 的ENA、IN1和IN2引脚 与单片机的输出引脚相连,图中未表示。
图2 直流电动机驱动电路图
L298芯片 管脚说明:
(1) SENSA:电流监测端,H桥的电流反馈脚,不用时可直接接地。
(2) OUT1:输出端,与M1对应。
(3) OUT2:输出端,与M2对应。
(4) VS:电源,用来给电动机供电。
(5) IN1:输入端。
(6) ENA:使能端,和M1、M2配合使用。
(7) IN2:输入端。
(8) GND:接地。
(9) VCC:电源,用来给芯片供电。
(10) IN3:输入端
(11) ENB:使能端,和M3、M4配合使用。
(12) IN2:输入端。
(13) OUT3:输出端,与M3对应。
(14) OUT4:输出端,与M4对应。
(15) SENSB:电流监测端,H桥的电流反馈脚,不用时可直接接地。
电机控制说明如表1所示,其中*值可取1也可取0。
SENSEENA
IN1
IN2
电机效果
0
*
*
停止
1
1
0
正传
1
0
1
反转
1
0
0
停止
PROTEUS仿真加速PWM脉宽如下图
4.2稳压电路L7805cc
其中1接整流器输出的+电压,2为公共地(也就是负极),3就是我们需要的正5V输出电压了
4.3时钟电路
就单片机内部每个部件要想协调一致地工作,必须在统一口令——时钟信号的控制下工作。单片机工作所需要的时钟信号有两种产生方式,即内部时钟方式和外部时钟方式。图是内部时钟方式:单片机内部有一个构成振荡器的增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端,这个放大器与作为反馈元件的片外晶振一起构成自激振荡器。在该图中,电容C1和C2取30pf,晶体的振荡频率取12Mhz,晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快。实际连接如图所示
4.4按键电路
4.5复位电路
8051系列单片机在启动时都需要复位, 使CPU及系统部件处于确定的初始状态, 并从初始状态开始工作. 8051系列单片机的复位信号从RST引脚接入到芯片的施密特触发器中. 当单片机系统处于正常工作状态, 且振荡器稳定后, 在每个机器周期都要对RST引脚的状态进行采样[7].
复位电路有上电复位和手动复位
上电复位: 上电复位电路是一种简单的复位电路, 只要在RST复位引脚接一个电容到Vcc,接一个电阻到低就可以了. 上电复位是指在给系统上电时, 复位电路通过电容加到RST复位引脚一个短暂的高电平信号, 这个复位信号随着Vcc对电容的充电过程而回落, 所以RST复位引脚的高电平维持时间取决于电容的充电时间. 为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间.
手动复位: 手动复位需要人为在复位输入端加高电平让系统复位. 一般采用的方法是在RST端和正电源Vcc之间接一个按键,当按下按键后, Vcc和RST端接通, RST引脚在高电平, 而且按键动作一般是数十毫秒, 大于2个机器周期的时间, 能够安全的让系统复位.
本系统采用的是上电复位方式
4.6检测电路
4.6.1传感器
本设计采用的是红外传感器(由红外线发射管、红外线接收管构成的红外计数电路)
红外线发射管
简介:红外线发射管也称红外线发射二极管,属于二极管类。它是可以将电能直接转换成近红外光(不可见光)并能辐射出去的发光器件,主要应用于各种光电开关及遥控发射电路中。红外线发射管的结构、原理与普通发光二极管相近,只是使用的半导体材料不同。红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装。
产品参数:发射距离、发射角度(15度、30度、45度、60度、90度、120度、180度)、发射的光强度、波长。以上决定红外线发射管产品的主要性能及使用范围。
红外线接收管
特征与原理:
红外线接收管是将红外线光信号变成电信号的半导体器件,它的核心部件是一个特殊材料的PN结,和普通二极管相比,在结构上采取了大的改变,红外线接收管为了更多更大面积的接受入射光线,PN结面积尽量做的比较大,电极面积尽量减小,而且PN结的结深很浅,一般小于1微米。红外线接收二极管是在反向电压作用之下工作的。没有光照时,反向电流很小(一般小于0.1微安),称为暗电流。当有红外线光照时,携带能量的红外线光子进入PN结后,把能量传给共价键上的束缚电子,使部分电子挣脱共价键,从而产生电子---空穴对(简称:光生载流子)。它们在反向电压作用下参加漂移运动,使反向电流明显变大,光的强度越大,反向电流也越大。这种特性称为“光电导”。红外线接收二极管在一般照度的光线照射下,所产生的电流叫光电流。如果在外电路上接上负载,负载上就获得了电信号,而且这个电信号随着光的变化而相应变化。
分类:
红外线接收管有两种,一种是光电二极管,另一种是光电三极管。光电二极管就是将光信号转化为电信号,光电三极管在将光信号转化为电信号的同时,也把电流放大了。因此,光电三极管也分为两种,分别别是NPN型和PNP型。
作用:
红外接收管的作用是进行光电转换,在光控、红外线遥控、光探测、光纤通信、光电耦合等方面有广泛的应用。
如何选择红外线接收管:红外线最重要的参数就是光电信号的放大倍率,一般的有1000-1300 1300-1800 1800-2500,这些对灵敏度有决定作用。
红外计数电路
红外计数电路主要由红外发射和接收电路组成. 红外发射和接收电路: 在电动机上安装一对红外发射和接收管, 当电动机转动时,对红外光反射、散射和折射,穿过红外光的光强瞬间减少, 红外接收管导通程度也在瞬间减小, 因而产生一个脉冲信号; 信号放大比较电路: 电容拾取脉冲信号后由运放LM324进行放大, 放大倍数为10倍, 再将放大的信号由运放LM324比较后输出标准的低电平脉冲信号(undershoot), 其中C1=0. 01μF, R1=11KΩ, R2=500Ω, R3=10KΩ, R4=100KΩ, R5=100KΩ, R6=5KΩ, R7=100KΩ, R6 和R7 起着抗干扰作用[1]. 然后将获得的脉冲信号送到单片机的计数器引脚进行计数, 这样就可以达到计数的目的.
4.6.2光电耦合器抑制尖脉冲和各种杂讯干扰信号
光电耦合器之所以在传输信号的同时能够有效得抑制尖脉冲和各种杂讯干扰,使得通道上的信号杂讯比大为提高,主要有以下几方面的原因:
1. 光电耦合器的输入阻抗很小,只有几百欧姆,而干扰源的阻抗较大,通常为105-106欧姆。据分压原理可知,即使干扰电压的幅度较大,但馈送到光电耦合器输入端的杂讯电压会很小,只能形成很微弱的电流,由于没有足够的能量而不能使二极管发光,从而被抑制掉了。
2. 光电耦合器的输入回路与输出回路之间没有电气联系,也没有共地;之间分布电容极小,而绝缘电阻又很大,因此回路一边的各种干扰杂讯都很难通过光电耦合器馈送到另一边去,避免了共阻抗耦合的干扰信号的产生。
3. 光电耦合器可以起到很好的安全保障作用,即使当外部设备出现故障,甚至输入信号短接时,也不会损坏仪表。因为光电耦合器件的输入回路和输出回路之间可以承受几千伏的高压。
4. 光电耦合器的回应速度极快,其回应延迟时间只有10微秒,适于对回应速度要求很高的场合。
4.7 lm358
LM358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。
LM358 的封装形式有塑封8引线双列直插式和贴片式
LM358
·内部频率补偿
· 直流电压增益高(约100dB)
· 单位增益频带宽(约1MHz)
· 电源电压范围宽:单电源;
双电源(±1.5 一±15V)
· 低功耗电流,适合于电池供电
· 低输入偏流
· 低输入失调电压和失调电流
· 共模输入电压范围宽,包括接地
· 差模输入电压范围宽,等于电源电压范围
· 输出电压摆幅大(0 至Vcc-1.5V)
该装置电路原理见图1。由红外线传感器、信号放大电路、电压比较器、延时电路和音响报警电路等组成。红外线探测传感器IC1探测到前方人体辐射出的红外线信号时,由IC1 的②脚输出微弱的电信号,经三极管VT1 等组成第一级放大电路放大,再通过C2输入到运算放大器IC2中进行高增益、低噪声放大,此时由IC2①脚输出的信号已足够强。IC3作电压比较器,它的第⑤脚由R10、VD1提供基准电压,当IC2①脚输出的信号电压到达IC3的⑥脚时,两个输入端的电压进行比较,此时IC3的⑦脚由原来的高电平变为低电平。IC4 为报警延时电路,R14 和C6 组成延时电路,其时间约为1 分钟。当IC3的⑦脚变为低电平时,C6通过VD2放电,此时IC4 的②脚变为低电平,它与IC4的③脚基准电压进行比较,当它低于其基准电压时,IC4 的①脚变为高电平,VT2 导通,讯响器BL通电发出报警声。人体的红外线信号消失后,IC3的⑦脚又恢复高电平输出,此时VD2 截止。由于C6两端的电压不能突变,故通过R14向C6 缓慢充电,当C6两端的电压高于其基准电压时,IC4的①脚才变为低电平,时间约为1 分钟,即持续1分钟报警。
由VT3、R20、C8 组成开机延时电路,时间也约为1 分钟,它的设置主要是防止使用者开机后立即报警,好让使用者有足够的时间离开监视现场,同时可防止停电后又来电时产生误报。
该装置采用9-12V直流电源供电,由T 降压,全桥U整流,C10 滤波,检测电路采用IC5 78L06供电。本装置交直流两用,自动无间断转换。
4.8液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
根据要求选用1602LCD:
1602LCD尺寸图
1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
1602内部结构
5仿真软件简介
Protues软件:
修改好各组件属性以后就要将程序(HEX文件)载入单片机了。首先双击单片机图标,系统同样会弹出“Edit Component”对话框,,来打开选择程序代码窗口,选中相应的HEX文件后返回,这时,按钮左侧的框中就填入了相应的HEX文件,点击对话框的“OK”按钮,回到文档,程序文件就添加完毕了。
工具条从左到右依次是“Play”、“Step”、“Pause”、“Stop”按钮,即运行、步进、暂停、停止。下面我们点击“Play”按钮来仿真运行,可以看到系统按照程序在运行着,而且我们还能看到其高低电平的实时变化。如果已经观察到了结果就可以点击“Stop”来停止运行。
6编程软件简介
Keil C51单片机软件开发系统的整体结构
C51工具包中的uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE), 可以完成编辑、编译、连接、调试、仿真等整个开发流程. 开发人员可用IDE本身或其它编辑器编辑C或汇编源文件. 然后分别由C51及A51编译器编译生成目标文件(.OBJ). 目标文件可由LIB51创14建生成库文件, 也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS). ABS文件由OH51转换成标准的Hex文件, 以供调试器dScope51或tScope51使用进行源代码级调试, 也可由仿真器使用直接对目标板进行调试, 也可以直接写入程序存贮器如EPROM中.
3、使用独立的Keil仿真器时, 应注意的事项:
(1) 仿真器标配11.0592MHz的晶振, 但用户可以在仿真器上的晶振插孔中换插其他频率的晶振.
(2) 仿真器上的复位按钮只复位仿真芯片, 不复位目标系统.
(3) 仿真芯片的31脚(/EA)已接至高电平, 所以仿真时只能使用片内ROM, 不能使用片外ROM; 但仿真器外引插针中的31脚并不与仿真芯片的31脚相连, 故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用.
优点:Keil C51生成的目标代码效率非常之高, 多数语句生成的汇编代码很紧凑, 容易理解. 在开发大型软件时更能体现高级语言的优势.
所以说, 一台计算机、一套电子仿真软件, 再加上一本虚拟实验教程, 就可相当于一个设备先进的实验室.
(2) 仿真器上的复位按钮只复位仿真芯片, 不复位目标系统.
(3) 仿真芯片的31脚(/EA)已接至高电平, 所以仿真时只能使用片内ROM, 不能使用片外ROM; 但仿真器外引插针中的31脚并不与仿真芯片的31脚相连, 故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用.
优点:Keil C51生成的目标代码效率非常之高, 多数语句生成的汇编代码很紧凑, 容易理解. 在开发大型软件时更能体现高级语言的优势.
所以说, 一台计算机、一套电子仿真软件, 再加上一本虚拟实验教程, 就可相当于一个设备先进的实验室. 以虚代实、以软代硬, 就建立一个完善的虚拟实验室. 在计算机上学习电工基础, 模拟电路、数字电路、单片机应用系统等课程, 并进行电路设计、仿真、调试等。
7 原理图 (见附录1)
8 序列表(见附录2)
9 小结
本系统用单片机AT89C51作为直流电机调速系统的控制核心,利用红外传感器测量直流电机的转速,控制直流电机的转动速度,用PWM调速方式控制直流电机转动的速度,以及停止转动,采用PID自动调节速度至预先设定的速度。整个系统的电路逻辑结构简单,可靠性能高,实现功能强。在设计中牵涉到很多自己不熟悉的知识,学会了自己解决问题.使用中用到了KEIL 软件进行程序的调试,生成可执行文件,并用PROTEUS进行了仿真实验。
10 参考文献
[1] 王高,柳宁,谢存禧.基于DSP的数字PID伺服控制系统设计[J].微计算机信息,2008(24):84-86.
[2] 席鑫宁,潘宏侠.基于DSP的电机控制与状态监测系统设计[J].大电机技术,2009(3):31-33.
[3] 王晓明.电动机的单片机控制[M].北京:北京航空航天大学出版社,2002.
[4] 杨宁,胡学军.单片机与控制技术[M].北京:北京航空航天大学出版社,2004.
[5] 杨加国 单片机原理与应用C51 程序设计[M].北京:清华大学出版社,2008.3
附录一
系统原理图
附录二
程序模块清单
#include <reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define uchar unsigned char
#define uint unsigned int
sbit add=P0^0;
sbit dec=P0^1;
sbit en1=P3^0; /* L298的Enable A */
sbit s1=P3^1; /* L298的Input 1 */
sbit s2=P3^2; /* L298的Input 2 */
uchar t=0; /* 中断计数器 */
uchar m1=0; /* 电机1速度值 */
uchar tmp1; /* 电机当前速度值 */
sbit E=P3^7 ;
sbit RW=P3^6 ;
sbit RS =P3^5 ;
sbit test =P3^4;
int time = 0 ;
int high = 20 ;
int period=0 ;
int change = 0 ;
int flag = 0 ;
int num_medium=0;
int num_display = 0;
int count_speed=0;
uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/* 电机控制函数 index-电机号(1,2); speed-电机速度 (-100—100) */
void motor(uchar index, char speed)
{
if(speed>=0 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed>0)
{
s1=1;
s2=0;
}
}
}
}
void delay1(uint j) /* 简易延时函数 */
{
for(j;j>0;j--);
}
//延时t毫秒
void delay(uchar t)
{
uint i ;
while(t)
{
for(i=0;i<125;i++);
t--;
}
}
void wc51r(uchar j)
{
RS=0;
RW=0;
P1=j;
E=1;
E=0;
delay(3);
}
//写数据函数LCD
void wc51ddr(uchar j)
{
RS=1;
RW=0;
P1=j;
E=1;
E=0;
delay(2);
}
//初始化函数LCD
void init ()
{
wc51r(0x01); //清屏
wc51r(0x38); //使用8位数据,显示两行,使用5*7的字型
wc51r(0x0c); //显示器件,光标开,字符不闪烁
wc51r(0x06); //字符不动,光标自动右移一格
}
/*****************************************************************************/
/***T1中断服务程序**************单位时间(S)方波的个数**********************/
void time1_int(void) interrupt 3
{
count_speed++;
if(count_speed==20)
{ count_speed = 0;
num_display = num_medium;
num_medium = 0;
}
}
/*****************************************************************************/
/***************************************速度显示的数据处理********************/
void datamade()
{
uint data MM,NN;
wc51r(0xc2);
wc51ddr('S');
wc51ddr('p');
wc51ddr('e');
wc51ddr('e');
wc51ddr('d');
wc51ddr(0x3a);
NN = num_display%100;
MM = num_display/100;
wc51ddr(wword[MM]);
MM = NN/10;
NN = NN%10;
wc51ddr(wword[MM]);
wc51ddr(wword[NN]);
}
/*****************************************************************************/
/************************主函数**********************************************/
void main()
{
unsigned char i;
P2 = 0x00;
ET0 = 1;
ET1 = 1;
TMOD = 0x12;
TH0=0x9B; /* 装入定时器的初值 */
TL0=0x9B;
TH1 =0x3c;
TL1 =0xb0;
EA=1; /* 开中断 */
TR0 = 1;
TR1 = 1;
init(); //液晶显示初始化程序
while(1)
{
while(add==0&&i<=100)
{
motor(1,i);
i++;
delay1(5000);
}
while(dec==0&&i>=0)
{
motor(1,i);
i--;
delay1(5000);
}
wc51r(0x84);
wc51ddr('H');
wc51ddr('e');
wc51ddr('I');
wc51ddr('I');
wc51ddr('o');
if(test==0 )
num_medium++;
datamade();
}
}
void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1;
}
if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */
t++;
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}
PID程序:
#include<reg51.h>
#define uchar unsigned char
uchar timecount,PWMH,SpeedSet,SpeedDet;
uchar KP,KI,KD;
int e1,e2,e3,uk,duk;
sbit Dir=P1^0;
sbit PWM=P3^0;
void delay(uchar i)
{
uchar j;
for(;i>0;i--)
{
for(j=29;j>0;j--)
;
;
}
}
void PWMout(uchar q)
{
PWM=1;
delay(q);
PWM=0;
delay(100-q);
}
void timer1() interrupt 3
{
TH1=0x3c; //50ms
TL1=0xb0;
if(--timecount==0)
{
timecount=4;
TR0=0;
SpeedDet=TL0;
TL0=0;
TR0=1;
e1=SpeedSet-SpeedDet;
duk=(KP*(e1-e2)+KI*e1+KD*(e1-2*e2+e3))/10;
uk=uk+duk;
if(uk>100)uk=100;
else if(uk<-100)uk=-100;
if(uk<0)
{
PWMH=-uk;
Dir=0;
}
else
{
PWMH=uk;
Dir=1;
}
e3=e2;
e2=e1;
}
}
void main()
{
TMOD=0x16;
TH0=0;
TL0=0;
TH1=0x3c; //50ms
TL1=0xb0;
timecount=4; //0.2s
PWMH=0;
SpeedSet=80; //设定转速为2000rpm
SpeedDet=0;
e1=0; //对应为PID控制中的e(k),e(k-1),e(k-2)
e2=0;
e3=0;
KP=10; //对应为PID控制中的Kp,Ki,Kd
KI=1;
KD=2;
TR0=1;
TR1=1;
ET1=1;
EA=1;
while(1)
{
PWMout(PWMH);
}
}
展开阅读全文