计算机控制技术课程设计报告.docx
《计算机控制技术课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机控制技术课程设计报告.docx(41页珍藏版)》请在冰点文库上搜索。
计算机控制技术课程设计报告
《计算机控制技术》课程设计
单闭环直流电机调速系统
1设计目的
计算机控制技术课程是集微机原理、计算机技术、控制理论、电子电路、自动控制系统、工业控制过程等课程基础知识一体的应用性课程,具有很强的实践性,通过这次课程设计进一步加深对计算机控制技术课程的理解,掌握计算机控制系统硬件和软件的设计思路,以及对相关课程理论知识的理解和融会贯通,提高运用已有的专业理论知识分析实际应用问题的能力和解决实际问题的技能,培养独立自主、综合分析与创新性应用的能力。
2设计任务
2.1设计题目
单闭环直流电机调速系统
实现一个单闭环直流电机调压调速控制,用键盘实现对直流电机的起/停、正/反转控制,速度调节要求既可用键盘数字量设定也可用电位器连续调节,需要有速度显示电路。
扩展要求能够利用串口通信方式在PC上设置和显示速度曲线并且进行数据保存和查看。
2.2设计要求
2.2.1基本设计要求
(1)根据系统控制要求设计控制整体方案;包括微处理芯片选用,系统构成框图,确定参数测围等;
(2)选用参数检测元件及变送器;系统硬件电路设计,包括输入接口电路、逻辑电路、操作键盘、输出电路、显示电路;
(3)建立数学模型,确定控制算法;
(4)设计功率驱动电路;
(5)制作电路板,搭建系统,调试。
2.2.2扩展设计要求
(1)在已能正常运行的微计算机控制系统的基础上,通过串口与PC连接;
(2)编写人机界面控制和显示程序;编写微机通信程序;实现人机实时交互。
3方案比较
方案一:
采用继电器对电动机的开或关进行控制。
这个方案的优点是电路较为简单,缺点是继电器的响应时间慢、机械结构易损坏、寿命较短、可靠性不高。
方案二:
采用电阻网络或数字电位器调整电动机的分压,从而达到调速的目的。
但是电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。
更主要的问题在于一般电动机的电阻很小,但电流很大;分压不仅会降低效率,而且实现很困难。
方案三:
采用由电力电子器件组成的H型PWM电路。
用单片机控制电力电子器件使之工作在占空比可调的开关状态,精确调整电动机转速。
这种电路由于工作在电力电子器件的饱和截止模式下,效率非常高;H型电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。
兼于方案三调速特性优良、调整平滑、调整围广、过载能力大,因此本设计采用方案三。
4单闭环直流电机调速系统设计
4.1单闭环调速原理
4.1.1闭环系统框图
4.1.2调速原理
直流电机转速有:
常数KeKa不变,Ra比较小。
所以调节Ua就能调节n。
4.2系统框图
4.3系统基本原理
通过键盘按键控制电机的启停、正反转、加速和减速,单片机接收键盘信号与反馈信号进行比较处理,也可以通过电位器调速,将模拟调节量转换为数字量后送给单片机处理,电机的速度由传感器测量后回馈给单片机处理,单片机接收到各路信号后控制显示器显示特定的容,同时控制电机驱动电路工作,从而控制直流电机的转速。
5系统硬件电路设计
5.1电机驱动电路
电机驱动电路主要有L298N和四个二极管组成,其中PWM驱动原理如下
i.Ud是有效值,调节占空比就能调节Ud进而调节n.
ii.PWM驱动器由L298来实现的,L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
3
iii.如图4,L298的封装和功能表。
通过改变C、D的状态来改变电机的正反转和急停和调节占空比进而调速;Ven直接接高电位。
是对C、D分别输出0和PWM波或者PWM波和0来进行的,初始化的占空比为50%。
5.2测速电路
图5测速整形电路
测速电路用自制的光电编码盘,通过红外接收发射管和施密特触发器组成。
当接收管接收到发射管发出的低电平信号,再通过施密特整形送给单片机的INT0,进而通过程序进行计算速度。
5.3显示电路
图6LCD显示电路
LCD1602显示电路用于显示转速设定值与当前值。
5.4键盘
图7键盘控制电路
0-9按键为数值的设定,CLR为后退按键,ENT为确定键,KEY为键盘输入按键,REP为电位器调速按键,RUN为运行/正转按键,F为运行/反转按键,STOP为停止按键。
5.5模拟调速电路
图8模拟调速电路
模拟调速电路由电位器分压输出给定电压,再经过AD转换器ADC0831输入的单片机中。
5.6电源电路
5
图9电源电路
6V/0.5A的外部输入电压Vin经过由MC7805ACK与两个由470Pf、一个100uf的电解电容组成的稳压电路,稳压成5V的电压,供系统使用。
5.7串口通信电路
图10串口通信电路
主要用来烧写程序进去单片机。
MAX232将ttl电平转换成可以和电脑串口匹配的电压。
从而与PC机进行通信。
6
图11STC-ISP
上图位stc单片机专用ISp下载软件。
5.8晶振和复位电路
图12晶振和复位电路
左边为复位电路、右边为12M的晶振电路,这两块与单片机组成最小系统。
7
6软件设计
●如图12,主程序是先初始化LCD1602和中断,然后进入转速设定和调节循环。
其中INT0中断是用来测试辅助的,TO和T1配合参数PWM波和调节占空比(其中PWM为一个8位二进制数0-255),转速的反馈调节主要是进行优化的P调节。
●如题13和图14,是T0和T1的中断服务程序,TO设定256us的循环和初始化T1,然后对电机进行正转、反转、停机(急停)三个判断;T1中断服务程序只负责关闭T1中断。
●如图14,外部中断INT0处理调理好的测试脉冲,中断服务程序对每一个测速脉冲对变量n进行加+,返回到主函数的测速程序。
●PWM的优化型P控制算法,对转速比较尽兴分级调节,当实际值无设定值相差超过1000rpm时PWM调整15,相差超过500rpm时调整10,相差超过300时调整6,相差超过100时调整2,相差小于100时调整1。
8
图12主程序程序框图
9
10
7电路与程序仿真和软件调试
7.1Proteus仿真电路
可以导入HXE文件,对编写好的程序和电路图进行仿真。
11
7.2Keil程序编写与编译。
12
8硬件焊接与调试
8.1焊接与高度
●单片机最小系统的焊接,成功后进行下一步。
●串口通信电路焊接,焊完进行串行通信,通过与PC机进行通信、刷写程序进入单片机,成功进行下一步。
●键盘电路与LCD1062显示电路焊接,程序已经写进单片机里面,可以进行参数设置来检查按键与显示是否正常,成功进行下一步。
●模拟调速电路焊接,焊完进行模拟调速设置,从显示器能观察是否正常。
●电机驱动电路焊接,焊完进行调试,发现电机接上之后系统不稳定,经分析发现是电源功率不足,电源是一个6V0.5A的小型电源,正好驱动芯片L298的电源电路分开供电,用另外的电源给电机供电,改装完后系统正常,进行下一步。
●测速电路焊接,连接到单片机后一切正常。
●整体焊接完成后对软件进行实物调试,通过不断的运行测试和重新刷写程序,主要克服的问题有:
调速反应迟钝、速度显示精度、PWM调试算法。
●成品系统。
13
8.2系统参数与实验数据
⏹系统的调试参数:
转速测量误差围:
+—30rpm
所使用电机PWM调压围:
0—7.5V
所使用电机PWM稳定调速围:
正转时390—2460rpm
反转时390—2700rpm
⏹调试结果表格
设定转速
420
610
1000
1200
1600
1800
2000
2400
实际转速
420
600
990
1200
1580
1800
2010
2400
偏差值
0
10
10
0
-20
0
10
0
上述调试结果表明:
实际转速跟设定转速的差值不超过30rpm,效果较好,符合设计要求。
14
9结论
在此次课程设计中,设计了PWM单闭环调速系统,它由STC89C52RC单片机的I/O口输出PWM信号,直接用TTL电平控制驱动芯片L298实现对电动机进行调速,这样能够充分发挥单片机的效能,对于简易速度控制系统的实现提供了一种有效的途径。
软件方面,它采用计数法加软件延时法进行设计的思路,为采用纯软件对电机速度的平滑调节提供了一种不错的解决方案。
运行实验表明,系统硬件接口电路简单,工作稳定可靠,满足了调速的功能要求,有很好的可操作性和维护性,具有较大的理论及实用价值。
10心得体会
通过这次课程设计,我们在收获知识的同时,还收获了阅历,收获了成熟。
在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在课程设计上,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
在如今单一的理论学习中,很少有机会能有实践的机会,但我们可以,而且设计也是一个团队的任务,一起的工作可以让我们有说有笑,相互帮助,配合默契。
我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。
某个人的离群都可能导致导致整项工作的失败。
课程设计中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。
团结协作是我们实习成功的一项非常重要的保证。
而这次实习也正好锻炼我们这一点,这也是非常宝贵的。
对我们而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!
11致
感我们的指导老师,不管在选题阶段,还是在设计阶段,在制作阶段,正是她给予我不断的指导与鼓励,我们才能顺利地完成我的课程设计,她那种对待学生和蔼亲切,对待工作一丝不苟的品质和精神值得我们每一个人学习。
借此,向我们的指导老师毕老师表示衷心的感。
在此我要感我的同学们,在电路设计、程序编写和焊接过程遇到困难时,正是由于同学们的指导我们才能顺利地完成本次课程设计。
15
16
附录
(一)小组分工情况表
17
附录二总电路图
18
附录(三)
元器件清单
序号
名称
型号、规格
数量
1
单片机芯片
STC12C5A08S2
1
2
插座
DIP40
1
3
电解电容
10uf
5
4
排针
2排
5
8位数据线
2
6
MAX232
1
7
插座
DIP16
3
8
串口
1对
9
LCD
LCD1602
1
10
插孔(排孔)
2排
11
电位器
10k
1
12
功率电阻
10欧0.5w
1
13
触电按键
18
14
上拉电阻
10k
10
15
排阻8位
10k
2
16
电位器
20k
1
17
AD芯片
ADC0831
1
18
插座
DIP8
1
19
DC电机
RS-365(10w左右)
1
20
PWM
L298
1
21
施密特触发器
74LS14
1
22
插座
DIP14
2
23
红外对管
2套
24
二极管
1N4007
4
25
电解电容
1uf
5
26
瓷片电容
100n
10
27
瓷片电容
0.1u
5
28
瓷片电容
30p
5
29
万用版
2
30
2位电源插孔及插线
2
31
连接用线
1捆
32
发光二极管
10
33
互锁开关
3
附录(四)
控制程序
#include
#include
#defineLCM_DataP0//数据接口
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeuctech[]={"SSpeed="};
ucharcodenet[]={"RSpeed="};
ucharcodeData[]={'0','1','2','3','4','5','6','7','8','9'};
ucharidataplus[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};
ucharSSpeed[4]={0,0,0,0};
ucharRSpeed[4]={0,0,0,0};
uchark;FLAG;
ucharPWM=0x7f;//赋初值
uintn=0;num=0;//T0中断次数和INT0中断次数
uintspeed;//实际转速
uintSetSpeed;//数字和模拟速度设定值
20
sbitD=P2^0;
sbitA=P2^1;
sbitRun=P2^2;
sbitFan=P2^3;
sbitStop=P2^4;
sbitLCM_E=P2^5;//定义接口
sbitLCM_RW=P2^6;
sbitLCM_RS=P2^7;
sbitIN1=P3^4;//L298两驱动端口
sbitIN2=P3^5;
sbitSCL2=P3^7;//连接ADC0831SCL脚
sbitSDA2=P3^6;//连接ADC0831SDA脚
sbitCS=P3^3;
voidLCM_WriteData(ucharWDLCM);//LCD写数据
voidLCM_WriteCommand(ucharWCLCM,BuysC);//LCD写命令
ucharLCM_ReadData(void);//LCD读数据
ucharLCM_ReadStatus(void);//LCD读状态
voidLCM_Init(void);//LCD初始化
voidDisplayOneChar(ucharX,ucharY,ucharDData);//LCD显示1个字符
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//LCD显示一串字符
voidbreak_Init(void);//定时器和中断初始化
voiddelay200us(void);//延时200us
voiddelay400ms(void);//延时400ms
voiddelay10ms(void);//延时10ms
voidGetch(void);//键值判断函数
voidGetchIt(void);//键值获取函数
voidInputSet(void);//键盘设定函数
voidmotorPWM(void);//PWM调速
voidRSpeeddisplay(void);//实际转速显示
21
ucharad0831read(void);//定义该函数为读取ADC0831的数据
voidVvchange(void);//AD采集与转速转换,同时显示电位器设定转速值
voidmain(void)
{
delay400ms();//启动等待,等LCM讲入工作状态
LCM_Init();//LCM初始化
delay200us();//延时片刻(可不要)
DisplayListChar(1,0,uctech);
DisplayListChar(12,0,"RPM");
DisplayListChar(1,1,net);
DisplayListChar(12,1,"RPM");
LCM_WriteCommand(0x0c,1);//显示关光标设置指令4:
置功能
LCM_WriteCommand(0x0c,1);//显示关光标设置指令4:
置功能
break_Init();//中断初始化
while
(1)
{Run=1;
Fan=1;
D=1;
A=1;
if(D==0)//按数字参数设定键可设定一次参数,此处是为了节省CPU工作资源,使CPU运行效率更高!
{
InputSet();
LCM_WriteCommand(0x0c,1);//显示关及光标设置指令4:
置功能
n=0;
}
22
if(A==0)//按电位器模拟参数设定
{
Vvchange();
n=0}
if(n==745)//每0.2S进行一次实际速度计算,同时显示实际转速,进行一次PWM调速。
{speed=30*num;
num=0;
n=0;
RSpeeddisplay();//显示实际转速
motorPWM();//PWM调速
}
}
}
/**********************************
键盘和转速设定函数
**********************************/
voiddelay10ms(void)//延时程序
{
uchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidGetch()
{unsignedcharX,Y,Z;
P1=0xff;
P1=0x0f;//先对P1置数行扫描
23
if(P1!
=0x0f)//判断是否有键按下
{delay10ms();//延时,软件去干扰
if(P1!
=0x0f)//确认按键按下X=P1;
{
X=P1;//保存行扫描时有键按下时状态
P1=0xf0;//列扫描
Y=P1;//保存列扫描时有键按下时状态
Z=X|Y;//取出键值
switch(Z)//判断键值(那一个键按下)
{
case0xee:
k=1;FLAG=0;break;//对键值赋值,10代表清零,11代表确认
case0xde:
k=2;FLAG=0;break;
case0xbe:
k=3;FLAG=0;break;
case0xed:
k=4;FLAG=0;break;
case0xdd:
k=5;FLAG=0;break;
case0xbd:
k=6;FLAG=0;break;
case0xeb:
k=7;FLAG=0;break;
case0xdb:
k=8;FLAG=0;break;
case0xbb:
k=9;FLAG=0;break;
case0xe7:
k=10;FLAG=0;break;
case0xd7:
k=0;FLAG=0;break;
case0xb7:
k=11;FLAG=0;break;
}
delay400ms();//延时防止连击!
}
}
}
24
voidGetchIt(void)
{FLAG=1;
while(FLAG)
Getch();
}
//键盘数字转速设定函数
voidInputSet(void)//参数设定函数
{ucharn=0,i=8,m=0,j=8,p;
LCM_WriteCommand(0x02,1);//指令2:
光标返回00H
for(p=0;p<8;p++)LCM_WriteCommand(0x14,1);//右移动光标指令5:
置功能
LCM_WriteCommand(0x0e,1);//显示开及光标设置指令4:
置功能
GetchIt();
while((k!
=11)&&(n<4))
{
if(k<10)
{SSpeed[n]=k;
DisplayOneChar(i,0,Data[SSpeed[n]]);
n++;
i++;
if(n==4){LCM_WriteCommand(0x0c,1);//显示关及光标设置指令4:
置功能
LCM_WriteCommand(0x10,1);//左移动光标指令5:
置功能
LCM_WriteCommand(0x0e,1);//显示开光标设置指令4:
置功能
}
GetchIt();
}
25
elseif(k==10)
{if(i!
=8)LCM_WriteCommand(0x10,1);//左移动光标指令5:
置功能
i--;
n--;
GetchIt();
}
}
SetSpeed=1000*SSpeed[0]+100*SSpeed[1]+10*SSpeed[2]+SSpeed[3];
}
/************************
AD采集和转速数学模型函数
************************/
//模拟转速设定函数
ucharad0831read(void)//ad0831读8位AD数据
{
uchari,tmp=0;
SDA2=1;
CS=0;
delay200us();
SCL2=0;
delay200us();
SCL2=1;
delay200us();
SCL2=0;
delay200us();
for(i=0;i<8;i++)
26
{
if(SDA2)tmp++;
tmp<<=1;
SCL2=1;
delay200us();
SCL2=0;
delay200us();
}
CS=1;
returntmp;
}
//电位器电压与转速转换数学模型函数以及显示函数
voidVvchange(void)
{uintASpeed;
uchari,k=8,tmp;
tmp=ad0831read();
ASpeed=10*tmp;
SSpeed[0]=ASpeed/1000;
SSpeed[1]=ASpeed%1000/100;
SSpeed[2]=ASpeed%1000%100/10;
SSpeed[3]=ASpeed%1000%100%10;
for(i=0;i<4;i++)
{DisplayOneChar(k,0,Data[SSpeed[i]]);
k++;
}
delay400ms();
SetSpeed=ASpeed;
27
}
//实际转速显示函数
voidRSpeeddisplay(void)
{ucharl,u=8;
RSpeed[0]=speed/1000;
RSpeed[1]=speed%1000/100;
RSpeed[2]=speed%1000%100/10;