当前位置:文档之家› 直流电机闭环调速控制系统设计报告

直流电机闭环调速控制系统设计报告

目录 (1)一、课设任务 (2)1.1设计内容 (2)1.2具体要求 (2)1.3程序调试建议 (2)二、系统方案 (3)三、硬件设计 (3)3.1数码管显示和行列式键盘电路 (4)3.2数模变换电路 (5)3.3直流电机驱动电路 (6)3.4片选译码电路 (7)3.5 RAM电路 (7)四、软件设计 (8)五、调试及结果 (19)六、心得体会 (19)七、参考文献 (20)八、附录 (20)直流电机闭环调速控制系统设计报告一、课设任务1.1设计内容:以实验室实验装置为设计对象,从中选择出合适的部分,构成一个直流电机恒转速控制系统,具有如下功能:1、可以通过按键设定直流电机转速(转/ 分钟,r/min);2、可以实时显示电机转速,同时显示设定值(各用三位显示);3、运行过程中改变负载可以维持设定的转速稳定后保持不变。

(稳态误差小于等于设定值的5%)4、开始时只显示设定值,采集值显示为0,按运行键后显示实时采集值与设定值,左边三位是设定值,右边三位是实时值;5、设置停止运行键,控制直流电机停止运行;6、其它扩展发挥功能。

1.2具体要求:1、根据功能要求从实验装置上选择合适电路构成系统,用protel软件画出原理图与控制系统结构图,分析系统工作过程;2、根据实验装置具体情况确定接线方法,从而确定各端口的口地址(D/A、键盘、显示等);3、采用PID算法作为恒转速控制算法,对PID算法加以分析说明;4、按照系统工作过程要求编制程序,画出流程图与编写具体程序;5、调试运行,记录运行结果;6、书写课程设计报告,符合学院有关课程报告的要求。

1.3程序调试建议:1、先通过简单程序验证硬件工作正常(D/A输出,带负载能力,显示器正常等等);不正常时及时与实验室老师联系更换器件。

2、调试测速显示子程序;3、调试参数设置程序;4、调试控制算法程序;5、调试综合程序二、系统方案直流电动机具有良好的起、制动性能,宜于大范围内平滑调速,在许多需要调速或快速正反向的电力拖动领域得到了广泛的应用。

采用PID调节的转速单环直流调速系统可以在保证稳定的前提下实现转速无静差。

系统进行信号采集进行D/A转换,使单片机送出脉冲来控制触发器,控制电路输出,驱动电动机工作,再由检测电路带回实际转速给单片机,让单片机根据实际转速和给定的转速进行比较,放大及PID运算等操作,从而控制整流电路α角的大小,进而改变电机电枢电压的大小,达到调节电动机转速的目的。

三、硬件设计3.1 数码管显示和行列式键盘电路数码管显示和行列式键盘电路图3.2数模变换电路数模变换电路图3.3直流电机驱动电路:直流电机驱动电路图3.4片选译码电路:片选译码电路图3.5 RAM电路:RAM 电路图四、软件设计MCS-51 8031ROM 2662DAC 0832 模数 转换LED 显示 PID 调速键盘设 定速度LED 显示判断按键执行跳转图1 结构框图主程序流程图显示程序流程图程序://*********课程设计PID直流电机调速******************** #include <reg51.h>//******************地址定义*********************************xdata unsigned char IN _at_ 0x8001; // 键盘读入口xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char CS0832 _at_ 0x9000; // DA地址约定//********************变量定义***********************************unsigned int VOUT=0 ; // DA输出缓存变量unsigned int FDC=0,FREF=0,DFDC=0,uctrl=0; // 转速检测值FDC,给定值FREFunsigned int PVAL=10,PIVAL=1,IVAL=0;unsigned int ERROR;//********************缓冲区及其长度定义*************************#define LEDLen 6 //数码管数量unsigned char LEDBuf[LEDLen]; // 显示缓冲//****************** 八段管显示码*********************************code unsigned char LEDMAP[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};//****************** 键码定义************************************code unsigned char KeyTable[] = {0x16, 0x15, 0x14, 0xff,0x13, 0x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07};//*********延时程序********************************************* void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}//***********动态显示程序****************************************** void DisplayLED(){unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++){OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}}//***********键闭合程序****************************************** unsigned char TestKey(){OUTBIT = 0; // 输出线置为0return (~IN & 0x0f); // 读入键状态(高四位不用)}//**************得键值程序************************************* unsigned char GetKey(){unsigned char Pos;unsigned char i;unsigned char k;i = 6;Pos = 0x20;do {OUTBIT = ~ Pos;Pos >>= 1;k = ~IN & 0x0f;} while ((--i != 0) && (k == 0));if (k != 0){ i *= 4;if (k & 2)i += 1;else if (k & 4)i += 2;else if (k & 8)i += 3;OUTBIT = 1;do Delay(10);while (TestKey()); // 等键释放return(KeyT able[i]); // 取出键码}else return(0xff);}//****************速度设定程序************************void speedset(){ unsigned char i=0,j=0,k=0,s,KEY,m;unsigned char b=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]; //实现闪烁原来的值;while(m!=20){DisplayLED();m++; } //延时;m=0;DisplayLED();*/if( TestKey() ){ s= GetKey();k= s & 0x0f;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; //第二位设定好,返回第一位;DisplayLED();}}//*************定时器子程序,自动重装模式定时200us******#define T200us (256-100) // 200us时间常数(6M) unsigned int C200us; // 200us记数单元//*********定时器和外部中断初始化***************void InitT(){TMOD=2; //自动重装模式TH0 = T200us; //定时200usTL0 = T200us;ET0=1; //开定时器中断IT0=1; //外部中断下降沿触发EX0=1; //开外部中断TR0=1; //开定时器0EA=1; //开总中断}//********** 定时器0中断子程序,计时************ void T0Int() interrupt 1{C200us++;}//外部中断测速子程序int TDC=0; //电机转动周期寄存器void ExtInt0() interrupt 0{TDC=C200us; // 参数传递C200us = 0; //定时器计数变量清零FDC=5000/TDC;DFDC=FDC*60; //实际周期换算}//*****************转速闭环调节程序************* void PIDTiaoSu(){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<FDC){ ERROR=FDC-FREF;IVAL=IVAL-ERROR;if(IVAL>=0XF5) IVAL=0XF5;uctrl=-PVAL*ERROR+PIVAL*IVAL;VOUT=uctrl;if(VOUT>0xf0) VOUT=0xf0;if(VOUT<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]; //实际转速个位;DisplayLED();}//*************主程序***********************void main(){ unsigned char KEY,i,s;for(i=0;i<=5;i++)LEDBuf[i] = LEDMAP[0];//初始值显示0;while(1){ DisplayLED();if(TestKey()){ s=getkey() ;KEY= s & 0x0f;if(KEY==13) // D键运行;{ InitT();CS0832=0X80;Delay(5);while(KEY!=14) //运行时按E停止键;{s=getkey() ;KEY= s & 0x0f;DisplayLED();CS0832=VOUT;PIDTiaoSu();}}while(KEY==14) //E键停止;{ for(i=2;i<=5;i++)LEDBuf[i] = LEDMAP[0];CS0832=0;s=getkey() ;KEY= s & 0x0f;if(KEY==12) speedset(); //停止后设定速度;DisplayLED();}if(KEY==12) { speedset();} //C键设置速度值;}}}五、调试及结果正确连接硬件电路,打开伟福编译程序,将编写好的程序调出,设置伟福实验装置,点击编译、运行。

相关主题