基于单片机的直流电机转速PID控制系统设计毕业设计论文.docx
《基于单片机的直流电机转速PID控制系统设计毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于单片机的直流电机转速PID控制系统设计毕业设计论文.docx(43页珍藏版)》请在冰点文库上搜索。
基于单片机的直流电机转速PID控制系统设计毕业设计论文
基于单片机的直流电机转速PID控制系统设计_毕业设计论文
1
单片机原理课程设计任务书
班级:
自动化07姓名:
指导教师:
曹利钢2010年6月7日
设计题目:
基于单片机的直流电机转速PID控制系统设计
1.直流电机型号自选
2.对直流电机转速实时显示
3.对转速实现恒值控制
设
计4.转速控制范围:
10,,90,,其中为电机额定转速nnnNNN任
务5.稳态精度达:
?
5r/min。
和
要
求
设计说明书一份
设
计
成电路图一份
果
1.胡汉才.单片机原理及接口技术(第2版)[M].北京:
机械工业出版社,2004
2.陈光东,赵性初.单片机微型计算机原理与接口技术(第2版)[M].武汉:
华中科技大参
学出版社,1999考
资
料
教研室主任签字:
年月日
2
第一章直流电机工作原理..................................4
1.1工作原理..........................................4
1.2、直流电机PID控制原理方框图.......................5第二章硬件设计与实现....................................8
2.1硬件设计..........................................8
2.2系统面板图........................................15第三章流程设计.........................................17
3.1软件设计流程图..................................17第四章程序说明.........................................20
4.1直流电机部分程序.................................20
4.2温度检测部分程序.................................28第五章说明及调试.......................................36
6.1调试过程.........................................36
6.2运行结果.........................................37
第六章课程设计体会………………………………………………39
参考文献……………………………………………………39第七章
3
第一章直流电机工作原理1.1工作原理
本设计中的电子钟的核心是AT89C51。
硬件电路主要由六部分构成:
PID控制电路、复位电路、键盘电路、显示电路、串行通信电路以及温度检测电路。
PID控制电路是电子钟硬件电路的核心~没有PID控制电路~直流电机无法正常稳定运行。
本系统电路采用的晶振11.0592MHz~一号单片机定时器采用的是定时器0工作在方式2定时~用于实现一定时间的计时~定时时间为10ms。
复位电路可使单片机回复到初始状态。
键盘可实现对直流电机转速的设定及启动的操作。
温度检测是通过DS18B20芯片实现~在温度显示中还要注意数的转换。
在该设计中还用到定时器1工作在方式2用来产生9600的波特率~用在两片单片机之间串行传送数据。
1、外部中断INT1
当电机转一圈时向外部中断进行一次中断计数~从而实现电机
转速的测量。
2、一号单片机转速显示
当电机转动时~显示部分可以把电机的设定转速或者是通过通信由温度计算的转速显示出来~同时在右侧部分显示电机当下的转速。
二号单片机的温度显示与之类似。
4
3、温度测量
温度测量有专门的芯片DS18B20。
DS18B20可编程温度传感器
有3个管脚。
GND为接地线~DQ为数据输入输出接口~通过
一个较弱的上拉电阻与单片机相连。
VDD为电源接口~既可由
数据线提供电源~又可由外部提供电源~范围3(O,5(5V。
DSI8B20接收到温度转换命令后~开始启动转换。
转换完成当
后的温度值就以16位带符号扩展的二进制补码形式存储在
高速暂存存储器的0~1字节。
单片机可通过单线接口读到该
数据~读取时低位在前~高位在后~数据格式以0(0625?
LSB形式表示。
4、按键选择
一号单片机的键盘采用4×4的按键方式检测按键。
P0、P1口
不断扫描按键的行和列从而计算出所选择的数值~进而执行相
关的程序。
二号单片机原理类似。
5、直流电机驱动部分
一号单片机根据端口采集到的电机的转速~经过PID计算~通
过另一端口发送PWM波~从而使电机改变转速。
1.2、直流电机PID控制原理方框图
5
电机驱报动测速警复键位盘
串行通信
键显89C5189C51盘示显测示温
图2.1直流电机PID控制电路方框图
6
图2.2电路连接图
7
第二章硬件设计与实现2.1硬件设计
直流电机PID控制电路的核心是两块89C51~用两块89C51作控制是为了电机控制和温度检测互不干扰~其中一块控制电机~另一块实现温度检测。
2.1.1按键电路设计
根据功能需要~本控制电路需要设置一下功能键:
按键设定转速。
在键盘中按键数量较多时~为了减少I/O口的占用~通常将按键排列成矩阵形式~如图1所示。
在矩阵式键盘中~每条水平线和垂直线在交叉处不直接连通~而是通过一个按键加以连接。
这样~一个端口,如P1口,就可以构成4*4=16个按键~比之直接将端口线用于键盘多出了一倍~而且线数越多~区别越明显~比如再多加一条线就可以构成20键的键盘~而直接用端口线则只能多出一键,9键,。
由此可见~在需要的键数比较多时~采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些~识别也要复杂一些~下图中~列线通过电阻接正电源~并将行线所接的单片机的I/O口作为输出端~而列线所接的I/O口则作为输入。
这样~当按键没有按下时~所有的输入端都是高电平~代表无键按下。
行线输出是低电平~一旦有键按下~则输入线就会被拉低~这样~通过读入输入线的状态就可得知是否有键按下了。
8
0123
a0
4567
a1
89确定清除
a2
运行
a3
a4
a5
a6
a7
图2.1按键电路
参见表2.1。
按键键名功能属性
0~9设定设定转速值自动复位
确定确定确定设定值自动复位
清除清除去除设定值自动复位
运行运行开始运行自动复位
表2.1按键功能表
按键操作说明如下:
0~9键:
通过此按键设定要求电机转速的设定值。
设定过程中数值依次左移~实现百十个位的设定。
确定键:
该键为自动复位键~当设定完成后按确定键就可以使设
9
定值赋给相应变量。
清除键:
清除已经设定的转速值。
运行键:
设定值完毕则可以点此键进行相应的运行。
2.1.2复位电路
复位是单片机的初始化操作~以便使CPU和系统中其他部件都处于一个确定的初始状态~并从这个状态开始工作。
除了进入系统的正常初始化之外~当单片机系统在运行出错或操作错误使系统处于思索状态时~也可按复位键重新启动。
复位后~PC内容初始化为0000H~使单片机从0000H单元开始执行程序。
89C51单片机复位信号的输入端是RST引脚~高电平有效。
RST端的外部复位电路有两种操作方式:
上电自动复位和按键手
C3
RSTrst
1uF
R1
1k
a0动复位。
按键手动复位有电平方式和脉冲方式两种。
本设计用的是按
a2键电平复位时相当于RST端接高电平。
如图2.2所示。
需要注意的是单片机连接了8255A~复位电路也需与8255A的RESET相连。
电路为上电复位电路~它是利用电容充电来实现的。
在接电瞬间~RESET端的电位与VCC相同~随着充电电流的减少~RESET的电位逐渐下降。
只要保证RESET为高电平的时间大于两个机器周
10
期~便能正常复位。
该电路除具有上电复位功能外~若要复位~只需按RESET键~此时电源VCC经电阻R1、R2分压~在RESET端产生一个复位高电平。
2.1.3显示电路
本设计中使用LED数码管显示电机的设定和实际转速以及温度值。
电路设计如下:
a0
a1RP1
1
23a245678a39U2:
A
RESPACK-8218A0Y0a4416A1Y1614A2Y2a5812A3Y3
a61OEU2:
B
1174HC2409a7A0Y0137A1Y1155A2Y2173A3Y3
19OE
74HC240
图2.3转速的显示电路
温度的显示电路在另一个单片机中完成~图相似。
11
INT1
2.1.4温度检测
系统设置了一路温度检测在该系统中~图4.6是一路温度硬件图。
图2.4DS18B20测温原理框图
P1.1
+5VU2
1939XTAL1P0.0/AD038U3P0.1/AD137P0.2/AD23VCC183638.3XTAL2P0.3/AD32DQ35P0.4/AD41GND34P0.5/AD533P0.6/AD6DS18B20932RSTP0.7/AD7
21P2.0/A822P2.1/A923P2.2/A102924P1.0PSENP2.3/A113025D1D2ALEP2.4/A12AT89C52GND3126P1.2P1.3EAP2.5/A1327P2.6/A1428P2.7/A15
P1.0110P1.0/T2P3.0/RXDP1.1211P1.6P1.1/T2EXP3.1/TXDP1.2312P1.2P3.2/INT0P1.3413P1.3P3.3/INT1P1.4514P1.7P1.4P3.4/T0P1.5615P1.5P3.5/T1+5VP1.6716P1.6P3.6/WRP1.7817P1.7P3.7/RD
图2.5温度检测的硬件图
12
2.1.5串行通讯
该系统用到两片单片机~因此单片机还需要连接串行接口~电路略。
2.1.6晶振电路设计
在AT89S51芯片内部有一个高增益反相放大器~其输入端为芯片引脚XTAL1~输出端为引脚XTAL2。
而在芯片内部~XTAL1和XTAL2之间跨接晶体振荡器和微调电容~从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后~才成为单片机的时钟脉冲信号。
其电路如图2.7。
X1
CRYSTAL
C1C2
1nF1nF
图2.7晶振电路
2.1.7电机驱动电路
通过端口采集电机转速进而输出PWM波完成电机控制。
PWM,PulseWidthModulation,控制技术就是对脉冲的宽度进行调制的技术~即通过对一系列脉冲的宽度进行调制~来等效的获得
13
所需要的波形,含形状和幅值,,面积等效原理是PWM技术的重要基
础理论,一种典型的PWM控制波形SPWM:
脉冲的宽度按正弦规律变
化而和正弦波等效的PWM波形称为SPWM波。
U12(VS)
U1294
5VCCVSIN172IN2OUT1+88.810IN3123IN4OUT26ENA1113ENBOUT3
114SENSAOUT415SENSBGND
8L298
U?
:
A
INT11
3
2
74LS386
图2.7电机驱动电路2.1.8报警电路
当温度过高或者过低时~报警电路会自动报警。
14
+5V
P1.0
R3
470
Q1P1.02N3393
BUZ1
BUZZER
图2.8报警电路
2.2系统面板图
时间控制模块面板图如图2.8~温度测量模块面板图如图2.9。
15
X1
CRYSTAL0123a0C1C21nF1nF4567a1RP11U189确定清除19392XTAL1P0.0/AD0a2383P0.1/AD1374P0.2/AD218365XTAL2P0.3/AD3运行356P0.4/AD4347P0.5/AD5C3a3338P0.6/AD6RSTrst9329RSTP0.7/AD7U2:
A212181uFRESPACK-8P2.0/A8A0Y0a422416P2.1/A9A1Y123614P2.2/A10A2Y2a52924812PSENP2.3/A11A3Y33025R1ALEP2.4/A12a6312611kEAP2.5/A13OEU2:
B27P2.6/A14a72811974HC240P2.7/A15A0Y0137A1Y1a0110155P1.0P3.0/RXDA2Y2a1211173P1.1P3.1/TXDA3Y3a2312P1.2P3.2/INT0a341319P1.3P3.3/INT1OEa4514P1.4P3.4/T0a561574HC240P1.5P3.5/T1a6U12(VS)716P1.6P3.6/WRa7817P1.7P3.7/RD80C51
U12945VCCVSIN172IN2OUT1+88.810IN3123IN4OUT2A6ENA1113ENBOUT3114SENSAOUT4B15SENSBGND8L298U?
:
AINT1132自动温度调节74LS386R2SW11
SW-SPDT
手动温度调节
图2.9直流电机控制模块面板图
X2
CRYSTAL
C4C51nF1nF
+5VP1.1RP31+5VU221939XTAL1P0.0/AD0338U3P0.1/AD1437P0.2/AD23VCC5183638.3XTAL2P0.3/AD32DQ635P0.4/AD41GND734P0.5/AD5833P0.6/AD6DS18B209932RSTP0.7/AD710K21P2.0/A822P2.1/A9+5V23P2.2/A102924P1.0PSENP2.3/A113025D1D2ALEP2.4/A12AT89C52GND3126R3P1.2P1.3EAP2.5/A1327470P2.6/A1428P2.7/A15Q1P1.01102N3393P1.0/T2P3.0/RXDP1.1211P1.6P1.1/T2EXP3.1/TXDP1.2312P1.2P3.2/INT0P1.3413BUZ1P1.3P3.3/INT1P1.4上下限报警切换514P1.7P1.4P3.4/T0P1.5615P1.5P3.5/T1+5VP1.6716P1.6P3.6/WRP1.7817+P1.7P3.7/RDBUZZER-设置完成
图2.10温度测量模块面板图
16
第三章流程设计
3.1软件设计流程图
3.1.1主程序流程图
电机调试程序流程:
开始
初始化计时器中断子程序
检查INT1口键盘扫描
接受另一单片机信息若有高电平则
计数加1
显示转速
返回
温度测量程序流程:
17
开始
初始化计时器中断子程序
检查计时溢出键盘扫描
测量温度若有则向另一
单片机发送信息
显示温度
显示温度
返回
3.1.2速度显示子程序流程图
初始化波特率9600
T1产生波特率
读SBUF内数据
图5.2速度显示子程序流程图
18
存储接收的数据
清中断标志RI
返回
3.1.3温度采集程序流程图
3.3温度采集程序流程图3.4报警子程序流程图
19
3.1.4串行通信接受与发送流程图
初始化波特率9600初始化波特率9600
T1产生波特率T1产生波特率
将发送的数据送A读SBUF内数据
将A中数据送SBUF存储接收的数据
清中断标志TI清中断标志RI
返回返回
第四章程序说明
4.1直流电机部分程序
#include
#defineuintunsignedint
#defineucharunsignedcharsbitp34=P3^4;
sbitp26=P2^6;
sbitp36=P3^6;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};ucharcodechose[]={0x01,0x02,0x04,0x08,0x10,0x20};
uintshu[6]={1,2,3,4,5,6};
ucharq=0,i=0,m=0,n=0;
uintcount,miaoshu,sv,k=0,k2=0,sv1,sv2;//定义计数值,实际温度值,设定的温度值
ucharsec,tcnt,flag,flag1;
intrk,yk,uk,uk_1=0,ek,ek_1=0,ek_2=0;//PID计算参数
signedcharT=20,Kp=30,Td=8,Ti=100,q0,q1,q2;//PID参数其值经反复调试得来
uchardatabuf[4]={0,1,1,1};//字型显示中间变量
/********************************************************************
20
**************/
延时子程序用来产生1ms的延时,用于在程序中的等待/********************************************************************
**************/
//延时1ms子程序
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************************************
**************/
显示子程序用来在数码管中显示电机的设定转速或计算转速以及实际转速
/********************************************************************
**************/
//显示子程序
voiddisplay(uinta,uintb){
chari;
shu[0]=a/100;
shu[1]=a%100/10;
shu[2]=a%10;
shu[3]=b/100;
shu[4]=b%100/10;
shu[5]=b%10;
for(i=0;i<6;i++)
{
P2=chose[i];
P0=table[shu[i]];
delay(5);
}
}
/********************************************************************
**************/
定时器中断子程序用来产生0.1秒的中断,以此来测量电机的转速
21
/********************************************************************
**************/
//定时器中断0子程序
voidt0(void)interrupt1using0//定时T0中断服务函数{
tcnt++;//每过250usttcnt加一
次(1/100秒)时if(tcnt==40)//计满40
{
tcnt=0;//重新再计
sec++;
if(sec==10)//定时0.1秒,在从零开始计时
{
sec=0;
TH0=0x06;//对TH0TL0赋值
TL0=0x06;
miaoshu=count;
count=0;
}
}
}
/********************************************************************
**************/
用来记录中断数,从而得到转速
/********************************************************************
**************/
voidsdf(void)interrupt2using0//外部中断服务函数
{
count=count+1;
}
/********************************************************************
**************/
接收来自另一个单片机的中断并放入一个数组中以便在显示函数中方便调用此数据,其中加了
容错程序,通过一个特殊字符’11’,来区别哪一个是三位数的百位,十位,个位。
/********************************************************************
**************/
22
voidjieshou()//接收子程序
{ucharg;
if(RI==1)
{g=SBUF;
if(g==11)
m=0;
buf[m]=g;
m++;
if(m==4)
m=0;
RI=0;//REN=1;
}
}
/********************************************************************
**************/
检测按键值计算对应的数值/********************************************************************
**************/
//左移一位
voidyishu(ucharnum){
ucharbai,shi,ge;
bai=sv1%100/10;
shi=sv1%10;
ge=num;
sv1=bai*100+shi*10+ge;
k2=sv1;//xinjia
}
/********************************************************************
**************/
检测对应的按键/********************************************************************
**************/
//按键子程序
voidkey()
{
uchari,temp,lie,hang,shu;
for(i=0;i<4;i++)//求出按键值
{
P1=~chose[i];
23
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)