直流电机闭环调试系统.docx
- 文档编号:26962455
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:26
- 大小:165.85KB
直流电机闭环调试系统.docx
《直流电机闭环调试系统.docx》由会员分享,可在线阅读,更多相关《直流电机闭环调试系统.docx(26页珍藏版)》请在冰豆网上搜索。
直流电机闭环调试系统
成绩:
大学
自动化学院综合实验报告
题目:
直流电机闭环调试系统
学生姓名:
班级:
学号:
同组人员:
指导教师:
完成时间:
一、实验名称:
基本情况:
6.具体分工:
7.本人在项目组的作用描述:
在本次试验中我负责的是程序的设计编写和调试,在设计出的硬件为基础上选择了适当的方法来实现功能,程序主要分为三大模块:
PID计算、PWM波的产生、液晶的显示,其中液晶程序是参考同学的设计,PID和PWM为自己编写。
在试验中大家相互交流,共同解决了很多问题,其中程序设计前,我就开始了PID的学习,从完全不懂到逐步理解最后到实践,在上机调试阶段对PID参数的确定遇到一些困难,不过经不懈努力最终找到适合的参数。
二、实验内容(实验原理介绍):
本次试验设计的是直流电机闭环控制系统,闭环控制的优点是控制的精度可以达到很高,而且对外界的干扰和系统的参数变化有很好的抑制作用,且可以通过输出反馈控制系统的控制过程。
缺点是存在稳定性,振荡,超调等一系列问题,对系统的性能分析和设计远比开环控制麻烦。
本次试验应用PID算法控制电机的转速,利用实际转速进行反馈与给定的转速形成对比,进而通过算法输出PWM波形来控制直流电机。
PID算法
输出PWM
直流电机
e(t)
c(t)
测速装置
r(t)
图1控制模型示意图
PID控制是一种线性控制器,它根据给定值r(t)与实际输出值c(t)构成控制偏差:
e(t)=r(t)-c(t)(3.3)
将偏差的比例、积分和微分通过线性组合构成控制量,对被控对象进行控制,故称为PID控制器,其控制规律为:
(3.4)
其中:
KP为比例系数;TI为积分时间常数;TD为微分时间常数。
一般数字控制系统需要将控制信号采样,所以只能根据采样时刻的偏差值计算控制量,因此,式(3.4)中的积分和微分项不能直接使用,需要进行离散化处理。
按模拟PID控制算法的算式(3.3),现以一系列的采样时刻点kT代表连续时间t,以和的形式代替积分,以增量代替微分,则可做如下近似变换:
(3.5)
其中:
T为采样周期。
本次试验使用的是PWM脉宽调制方法。
脉宽调制(PWM)是利用数字输出对模拟电路进行控制的一种有效技术,尤其是在对电机的转速控制方面,可大大节省能量。
PWM具有很强的抗噪性,且有节约空间、比较经济等特点。
模拟控制电路有以下缺陷:
模拟电路容易随时间漂移,会产生一些不必要的热损耗,以及对噪声敏感等。
而在用了PWM技术后,避免了以上的缺陷,实现了用数字方式来控制模拟信号,可以大幅度降低成本和功耗。
PWM对调速系统来说,系统的响应速度和稳定精度等指标比较好;电枢电流的脉动量小,容易连续,而且可以不必外加滤波电抗也可以平稳工作;系统的调速范围宽;使用元件少、线路简单。
三、实验结果分析(含程序、数据记录、控制算法及分析和实验总结等):
3.1.程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSpeed_Max70
#definePwm_Period100
/***************端口初始化********************/
sbitRs=P2^5;
sbitRw=P2^6;
sbitEn=P2^7;
sbitIn2=P1^4;
sbitIn1=P1^6;
sbitPWM=P1^5;
sbitKEY1=P2^0;
sbitKEY2=P2^1;
sbitKEY3=P2^2;
sbitKEY4=P2^3;
/**************变量定义**********************/
uintDuty=0;//占空比
uintNow_Speed=0;
uintSet_Speed=40;
ucharstate=1;
uintCount=0,Count_Period=0,Count_Jishu=0;
ucharFlag=0,Flag_Speed=0,Flag1=0;
uintKp=4,Ki=1,Kd=1;
uintLast_Error;
uintL_Last_Error;
/***************函数初始化**********************/
voiddelay();
voidTimer0_init();
voidTimer1_init();
voidWrite();
voidWrite_date();
voidLcd1602_init();
voidString_display();
voidNumeral_display();
voidFloat_display();
voidkey_scan();
voidSudu_jia();
voidSudu_jian();
voiddisplay_cusor();
voidsys_init();
intdelta_Duty();
voidYejin_init();
intPid_Ctrol();
/*************************************/
voiddelay(uintZ)
{
uintX,Y;
for(X=0;X for(Y=0;Y<110;Y++); } voidTimer0_init(void) { TMOD|=0x05; TH0=0; TL0=0; ET0=1; TR0=1; } voidTimer1_init(void) { TMOD|=0x20; TH1=0x38; TL1=0x38; ET1=1; TR1=1; } voidWrite(ucharShuju) { Rs=0; Rw=0; En=0; delay(5); P0=Shuju; En=1; delay(10); En=0; } voidWrite_date(uchardate) { Rs=1; Rw=0; En=0; delay(5); P0=date; En=1; delay(10); En=0; } /*显示屏的设定,参考1602PDF资料**********/ voidLcd1602_init() { Write(0x38);//设置显示模式16*2显示5*7点阵8位数据接口 Write(0x0c);//开显示,不显示光标 Write(0x06);//当读写一个字符后地址指针加一,且整屏不移动 Write(0x01);//显示清屏 } voidString_display(ucharHang,ucharLie,uchar*p) { uchar_addr; if(Hang==1) _addr=0x80; elseif(Hang==2) _addr=0xc0; Write(_addr+Lie); do { Write_date(*p); p++; }while(*p! ='\0'); } /*液晶参数Hang行Lie列Num要显示的数据3位小数*/ voidNumeral_display(ucharHang,ucharLie,uintNum) { uchar_addr,i; uintdisplay[3]; if(Hang==1) _addr=0x80; elseif(Hang==2) _addr=0xc0; Write(_addr+Lie); display[0]=Num/100; display[1]=(Num%100)/10; display[2]=Num%10; for(i=0;i<3;i++) { Write_date(display[i]+0x30); } } /*液晶参数Hang行Lie列Num要显示的数据2位小数*/ voidFloat_display(ucharHang,ucharLie,uintNum) { uchar_addr; if(Hang==1) _addr=0x80; elseif(Hang==2) _addr=0xc0; Write(_addr+Lie); Write_date(Num/10+0x30); Write_date('.'); Write_date(Num%10+0x30); } voidLcd1602_cursor(ucharHang,ucharLie) { uchar_addr; if(Hang==1) _addr=0x80; elseif(Hang==2) _addr=0xc0; Write(_addr+Lie); Write(0x0f); } /**********************PID算法控制**************/ intPid_Ctrol(intNow_Speed) { uintError,Error1,Error2; intTemp=0; Error=Set_Speed-Now_Speed; Error1=Kp*(Error-Last_Error); Error2=Kd*(Error+L_Last_Error-2*Last_Error); Temp=Error1+Error2+Ki*Error; Temp=Temp/10; L_Last_Error=Last_Error; Last_Error=Error; return(Temp); } /********************1602液晶显示**********/ voidYejin_init(void) { Duty=20; PWM=0; Timer0_init(); Timer1_init(); Lcd1602_init(); In1=1; In2=0; String_display(1,0,"set"); Numeral_display(1,4,Set_Speed); String_display(1,8,"Now"); Numeral_display(1,12,Now_Speed); String_display(2,0,"P"); Float_display(2,1,Kp); String_display(2,5,"I"); Float_display(2,6,Ki); String_display(2,11,"D"); Float_display(2,12,Kd); EA=1; } /*****************按键切换控制******************/ voidkey_scan(void) { if(KEY3==0) { delay(5); if(KEY3==0) { state++; if(state>=7) state=1; } while(! KEY3); } elseif(KEY4==0) { delay(5); if(KEY4==0) { state--; if(state>=255) state=6; } while(! KEY4); } elseif(KEY1==0) { delay(5); if(KEY1==0) { Sudu_jia(); } while(! KEY1); } elseif(KEY2==0) { delay(5); if(KEY2==0) { Sudu_jian(); } while(! KEY2); } } /******************速度设定的增加**********/ voidSudu_jia(void) { switch(state) { case1: Set_Speed+=5; if(Set_Speed>=Speed_Max) Set_Speed=Speed_Max; Numeral_display(1,4,Set_Speed); break; case2: Set_Speed+=5; if(Set_Speed>=Speed_Max) Set_Speed=Speed_Max; Numeral_display(1,4,Set_Speed); break; case3: Set_Speed++; if(Set_Speed>=Speed_Max) Set_Speed=Speed_Max; Numeral_display(1,4,Set_Speed); break; case4: Kp++; if(Kp>=100) { Kp=99; } Float_display(2,1,Kp); break; case5: Ki++; if(Ki>=100) { Ki=99; } Float_display(2,6,Ki); break; case6: Kd++; if(Kd>=100) { Kd=99; } Float_display(2,12,Kd); break; default: break; } } /****************速度设定减*************/ voidSudu_jian(void) { switch(state) { case1: Set_Speed-=5; if(Set_Speed>=65535) Set_Speed=0; Numeral_display(1,4,Set_Speed); break; case2: Set_Speed-=5; if(Set_Speed>=65535) Set_Speed=0; Numeral_display(1,4,Set_Speed); break; case3: Set_Speed--; if(Set_Speed>=65536) Set_Speed=0; Numeral_display(1,4,Set_Speed); break; case4: Kp--; if(Kp>=65535) { Kp=0; } Float_display(2,1,Kp); break; case5: Ki--; if(Ki>=65535) { Ki=0; } Float_display(2,6,Ki); break; case6: Kd--; if(Kd>=65535) { Kd=0; } Float_display(2,12,Kd); break; default: break; } } /********************光标闪烁******************/ voiddisplay_cusor(void) { switch(state) { case1: case2: case3: Lcd1602_cursor(1,7);break; case4: Lcd1602_cursor(2,4);break; case5: Lcd1602_cursor(2,4);break; case6: Lcd1602_cursor(1,15);break; default: break; } } /*******将速度的增量转化为占空比的增量***************/ intdelta_Duty(intdelta_v) { returndelta_v*5;//占空比比例调节 } /**************用于产生PWM脉冲**********************/ voidTimer1(void)interrupt3 { Count++; if(Count<=Duty) PWM=1; elseif(Count>=Pwm_Period) { Count=0; } else PWM=0; /****************定时40ms*******************/ Count_Period++; if(Count_Period>=200) { Count_Period=0; Now_Speed=(TH0*256+TL0)/15; TH0=0; TL0=0; Flag_Speed=1; } Count_Jishu++; if(Count_Jishu>=10000) { Count_Jishu=0; Flag1=1; } } intmain(void) { inttmp; Yejin_init(); for(;;) { key_scan(); if(Flag_Speed==1) { Flag_Speed=0; Numeral_display(1,12,Now_Speed); tmp=Duty; tmp+=delta_Duty(Pid_Ctrol(Now_Speed)); if(tmp>=100) tmp=99; elseif(tmp<=0) tmp=0; Duty=tmp; } if(Flag1==1) { Flag1=0; display_cusor(); } } return0; } 调试手段 a.确定比例增益P 确定比例增益P时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。 输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。 比例增益P调试完成。 b.确定积分时间常数Ti 比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。 记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。 积分时间常数Ti调试完成。 c.确定积分时间常数Td 积分时间常数Td一般不用设定,为0即可。 若要设定,与确定P和Ti的方法相同,取不振荡时的30%。 d.系统空载、带载联调,再对PID参数进行微调,直至满足要求。 PID算法: /**********************PID算法控制**************/ intPid_Ctrol(intNow_Speed) { uintError,Error1,Error2; intTemp=0; Error=Set_Speed-Now_Speed;//偏差 Error1=Kp*(Error-Last_Error);//比例项 Error2=Kd*(Error+L_Last_Error-2*Last_Error);//积分项 Temp=Error1+Error2+Ki*Error; Temp=Temp/10; L_Last_Error=Last_Error; Last_Error=Error; return(Temp); } 控制算法分析: PID控制器(按闭环系统误差的比例、积分和微分进行控制的调节器)自30年代末期出现以来,在工业控制领域得到了很大的发展和广泛的应用。 它的结构简单,参数易于调整,在长期应用中已积累了丰富的经验。 特别是在工业过程控制中,由于被控制对象的精确的数学模型难以建立,系统的参数经常发生变化,运用控制理论分析综合不仅要耗费很大代价,而且难以得到预期的控制效果。 在应用计算机实现控制的系统中,PID很容易通过编制计算机语言实现。 由于软件系统的灵活性,PID算法可以得到修正和完善,从而使数字PID具有很大的灵活性和适用性。 实现PID控制的计算机控制系统如图1所示,其中数字PID控制器是由软件编程在计算机内部实现的。 图1模拟PID控制 1、PID控制规律的离散化 PID控制器是一种线性调节器,这种调节器是将系统的给定值r与实际输出值y构成的控制偏差 的比例(P)、积分(I)、微分(D),通过线性组合构成控制量,所以简称PID控制器。 连续控制系统中的模拟PID控制规律为: (式1) 式中 是控制器的输出, 是系统给定量与输出量的偏差, 是比例系数, 是积分时间常数, 是微分时间常数。 其相应传递函数为: (式2) 比例调节器、积分调节器和微分调节器的作用: (1)比例调节器: 比例调节器对偏差是即时反应的,偏差一旦出现,调节器立即产生控制作用,使输出量朝着减小偏差的方向变化,控制作用的强弱取决于比例系数。 比例调节器虽然简单快速,但对于系统响应
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 直流电机 闭环 调试 系统