直流电机闭环调速控制系统设计报告Word下载.docx
《直流电机闭环调速控制系统设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《直流电机闭环调速控制系统设计报告Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
6、书写课程设计报告,符合学院有关课程报告的要求。
1.3程序调试建议:
1、先通过简单程序验证硬件工作正常(D/A输出,带负载能力,显示器正常等等);
不正常时及时与实验室老师联系更换器件。
2、调试测速显示子程序;
3、调试参数设置程序;
4、调试控制算法程序;
5、调试综合程序
二、系统方案
直流电动机具有良好的起、制动性能,宜于大范围内平滑调速,在许多需要调速或快速正反向的电力拖动领域得到了广泛的应用。
采用PID调节的转速单环直流调速系统可以在保证稳定的前提下实现转速无静差。
系统进行信号采集进行D/A转换,使单片机送出脉冲来控制触发器,控制电路输出,驱动电动机工作,再由检测电路带回实际转速给单片机,让单片机根据实际转速和给定的转速进行比较,放大及PID运算等操作,从而控制整流电路α角的大小,进而改变电机电枢电压的大小,达到调节电动机转速的目的。
三、硬件设计
3.1数码管显示和行列式键盘电路
数码管显示和行列式键盘电路图
3.2数模变换电路
数模变换电路图
3.3直流电机驱动电路:
直流电机驱动电路图
3.4片选译码电路:
片选译码电路图
3.5RAM电路:
RAM电路图
四、软件设计
主程序流程图
显示程序流程图
程序:
//*********课程设计PID直流电机调速********************
#include<
reg51.h>
//******************地址定义*********************************
xdataunsignedcharIN_at_0x8001;
//键盘读入口
xdataunsignedcharOUTBIT_at_0x8002;
//位控制口
xdataunsignedcharOUTSEG_at_0x8004;
//段控制口
xdataunsignedcharCS0832_at_0x9000;
//DA地址约定
//********************变量定义***********************************
unsignedintVOUT=0;
//DA输出缓存变量
unsignedintFDC=0,FREF=0,DFDC=0,uctrl=0;
//转速检测值FDC,给定值FREF
unsignedintPVAL=10,PIVAL=1,IVAL=0;
unsignedintERROR;
//********************缓冲区及其长度定义*************************
#defineLEDLen6//数码管数量
unsignedcharLEDBuf[LEDLen];
//显示缓冲
//******************八段管显示码*********************************
codeunsignedcharLEDMAP[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//******************键码定义************************************
codeunsignedcharKeyTable[]={
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
//*********延时程序*********************************************
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;
i!
=0;
i--);
}
//***********动态显示程序******************************************
voidDisplayLED()
unsignedcharPos;
unsignedcharLED;
Pos=0x20;
//从左边开始显示
for(i=0;
i<
LEDLen;
i++)
{
OUTBIT=0;
//关所有八段管
LED=LEDBuf[i];
OUTSEG=LED;
OUTBIT=Pos;
//显示一位八段管
Delay
(1);
Pos>
>
=1;
//显示下一位
}
//***********键闭合程序******************************************
unsignedcharTestKey()
//输出线置为0
return(~IN&
0x0f);
//读入键状态(高四位不用)
//**************得键值程序*************************************
unsignedcharGetKey()
unsignedchark;
i=6;
do{
OUTBIT=~Pos;
k=~IN&
0x0f;
}while((--i!
=0)&
&
(k==0));
if(k!
=0)
{i*=4;
if(k&
2)
i+=1;
elseif(k&
4)
i+=2;
8)
i+=3;
OUTBIT=1;
doDelay(10);
while(TestKey());
//等键释放
return(KeyTable[i]);
//取出键码
elsereturn(0xff);
//****************速度设定程序************************
voidspeedset()
{unsignedchari=0,j=0,k=0,s,KEY,m;
unsignedcharb=0,c=0;
LEDBuf[0]=LEDMAP[0];
LEDBuf[1]=LEDMAP[0];
LEDBuf[2]=LEDMAP[0];
LEDBuf[3]=LEDMAP[0];
LEDBuf[4]=LEDMAP[0];
LEDBuf[5]=LEDMAP[0];
while(k!
=10)//A键为确认键;
/*m=0;
LEDBuf[i]=0x00;
//关闭相应位;
while(m!
=10){DisplayLED();
m++;
}//延时;
m=0;
LEDBuf[j]=LEDMAP[KEY];
//重新放回设定值;
LEDBuf[i]=LEDBuf[i+3];
//实现闪烁原来的值;
=20){DisplayLED();
DisplayLED();
*/
if(TestKey())
{s=GetKey();
k=s&
if((k>
=0)&
(k<
=9))//速度设定,0--9有效;
{KEY=k;
LEDBuf[i]=LEDMAP[KEY];
//高三位保存设定值;
LEDBuf[i+3]=LEDBuf[i];
//保存原值;
if(i==0){b=(KEY%10)*10;
if(i==1){c=(KEY%10);
FREF=b+c;
j=i;
i++;
if(i==2)i=0;
//第二位设定好,返回第一位;
//*************定时器子程序,自动重装模式定时200us******
#defineT200us(256-100)//200us时间常数(6M)
unsignedintC200us;
//200us记数单元
//*********定时器和外部中断初始化***************
voidInitT()
TMOD=2;
//自动重装模式
TH0=T200us;
//定时200us
TL0=T200us;
ET0=1;
//开定时器中断
IT0=1;
//外部中断下降沿触发
EX0=1;
//开外部中断
TR0=1;
//开定时器0
EA=1;
//开总中断
//**********定时器0中断子程序,计时************
voidT0Int()interrupt1
{C200us++;
//外部中断测速子程序
intTDC=0;
//电机转动周期寄存器
voidExtInt0()interrupt0
{TDC=C200us;
//参数传递
C200us=0;
//定时器计数变量清零
FDC=5000/TDC;
DFDC=FDC*60;
//实际周期换算
//*****************转速闭环调节程序*************
voidPIDTiaoSu()
if(FREF>
FDC)
{ERROR=FREF-FDC;
IVAL=IVAL+ERROR/8;
if(IVAL>
=0Xf5)
IVAL=0Xf5;
uctrl=PVAL*ERROR+PIVAL*IVAL;
VOUT=uctrl;
if(VOUT>
0xf0)
VOUT=0xf0;
if(VOUT<
0x80)
VOUT=0x80;
if(FREF<
{ERROR=FDC-FREF;
IVAL=IVAL-ERROR;
=0XF5)IVAL=0XF5;
uctrl=-PVAL*ERROR+PIVAL*IVAL;
0xf0)VOUT=0xf0;
0x8f)VOUT=0x80;
LEDBuf[2]=LEDMAP[DFDC/1000];
//实际转速千位;
LEDBuf[3]=LEDMAP[DFDC%1000/100];
//实际转速百位;
LEDBuf[4]=LEDMAP[DFDC%100/10];
//实际转速十位;
LEDBuf[5]=LEDMAP[DFDC%10];
//实际转速个位;
//*************主程序***********************
voidmain()
{unsignedcharKEY,i,s;
for(i=0;
i<
=5;
i++)
LEDBuf[i]=LEDMAP[0];
//初始值显示0;
while
(1)
{DisplayLED();
if(TestKey())
{s=getkey();
KEY=s&
if(KEY==13)//D键运行;
{InitT();
CS0832=0X80;
Delay(5);
while(KEY!
=14)//运行时按E停止键;
s=getkey();
CS0832=VOUT;
PIDTiaoSu();
while(KEY==14)//E键停止;
{for(i=2;
CS0832=0;
if(KEY==12)speedset();
//停止后设定速度;
if(KEY==12){speedset();
}//C键设置速度值;
五、调试及结果
正确连接硬件电路,打开伟福编译程序,将编写好的程序调出,设置伟福实验装置,点击编译、运行。
按下设置键C,数码管显示000000,然后按键盘上的数字,设置电机速度,如按下32,显示结果250000,点击A键确定,点击启动键D,电机运转,后四位显示电机实际转速,显示结果321940(理论值应是1920,允许有5%的误差)。
E键停止运行。
如果想在设置其他值,点击C,设置新的转速,如果想让电机停转,点击停止键E,并且重新设置电机转速。
运行过程中,如设置新的转速30,运行结果为301800。
但是在程序的编写过程中,由于设置了电机启动电压的上下限,故实际测得的电机转速有一定的范围值,为(22~45)r/s。
超过这个范围,实际测得的电机转速误差很大。
六、心得体会
通过这次期两个星期的课程设计,发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还比较缺乏,理论联系实际的能力还急需提高。
这次的课设我感觉收获很大,虽然遇到了很多困难,但还是被我们一一解决了,它不单是要求你单纯地完成一个题目,而是要求你对所学的知识都要弄懂,并且能将其贯穿起来,综合性比较强。
首先要把设计任务搞清,不能盲目的去做,如果连任务都不清楚从何做起呢,接下来是我们两人一组,然后找相关的资料,将有用的整理出来。
这次的课设我感觉最不好做的还是程序的编程,它需要把所有的电路硬件图以及连线都非常清楚,并根据这些编写相应的程序,最后把这些程序整合到一起进行调试。
在完成这次课设的同时,我们也把前边学过的和其有关的课程复习了一遍,把以前没有弄懂得问题也搞清楚了。
总之,这次课设带给我的收获是没有预料的,当你解决一个问题后,你会有一种成就感,那种心情是无法比拟的。
这次课设我体会到不仅要掌握书本上的基本内容,还要灵活思考,善于变换,这样才能找到最优设计。
只有不断的学习、实践、再学习、再实践才能不被社会淘汰。
当然这次课设离不开老师的耐心教导,没有他给我们灌输的知识,我们根本就无从下手,是老师的教导和我们的努努力才能顺利的完成课设的任务。
七、参考文献
【1】杨学昭王东云单片机原理、接口技术及应用(含C51)西安电子科技大学出版社
【2】张五一,张道光.微型计算机原理与接口技术[M].河南科学技术出版社,2006.
【3】郑秋生.C/C++程序设计教程—面向过程分册[M].电子工业出版社,2007.18-27
【4】王宗培.直流电动机及其控制系统[M].哈尔滨:
哈尔滨工业大学出版社,1985.
【5】马忠梅单片机C语言应用程序设计。
北京:
北京航空航天大学出版社,2003
八、附录