《直流电机闭环调试系统讲解》由会员分享,可在线阅读,更多相关《直流电机闭环调试系统讲解(19页珍藏版)》请在金锄头文库上搜索。
1、 成 绩: 大学自动化学院综合实验报告题 目: 直流电机闭环调试系统 学生姓名:班 级:学 号:同组人员:指导教师:完成时间:一、实验名称:基本情况:6. 具体分工:7. 本人在项目组的作用描述: 在本次试验中我负责的是程序的设计编写和调试,在设计出的硬件为基础上选择了适当的方法来实现功能,程序主要分为三大模块:PID计算、PWM波的产生、液晶的显示,其中液晶程序是参考同学的设计,PID和PWM为自己编写。在试验中大家相互交流,共同解决了很多问题,其中程序设计前,我就开始了PID的学习,从完全不懂到逐步理解最后到实践,在上机调试阶段对PID参数的确定遇到一些困难,不过经不懈努力最终找到适合的参
2、数。二、实验内容(实验原理介绍):本次试验设计的是直流电机闭环控制系统,闭环控制的优点是控制的精度可以达到很高,而且对外界的干扰和系统的参数变化有很好的抑制作用,且可以通过输出反馈控制系统的控制过程。缺点是存在稳定性,振荡,超调等一系列问题,对系统的性能分析和设计远比开环控制麻烦。 本次试验应用PID算法控制电机的转速,利用实际转速进行反馈与给定的转速形成对比,进而通过算法输出PWM波形来控制直流电机。r(t) c(t)e(t)输出PWM直流电机PID算法测速装置图1控制模型示意图 PID控制是一种线性控制器,它根据给定值r(t)与实际输出值c(t)构成控制偏差:e(t)=r(t)c(t)(3
3、.3)将偏差的比例、积分和微分通过线性组合构成控制量,对被控对象进行控制,故称为PID控制器,其控制规律为:(3.4)其中:KP为比例系数;TI为积分时间常数;TD为微分时间常数。一般数字控制系统需要将控制信号采样,所以只能根据采样时刻的偏差值计算控制量,因此,式(3.4)中的积分和微分项不能直接使用,需要进行离散化处理。按模拟PID控制算法的算式(3.3),现以一系列的采样时刻点kT代表连续时间t,以和的形式代替积分,以增量代替微分,则可做如下近似变换:(3.5)其中:T为采样周期。本次试验使用的是PWM脉宽调制方法。脉宽调制 (PWM)是利用数字输出对模拟电路进行控制的一种有效技术,尤其是
4、在对电机的转速控制方面,可大大节省能量。PWM 具有很强的抗噪性,且有节约空间、比较经济等特点。模拟控制电路有以下缺陷:模拟电路容易随时间漂移,会产生一些不必要的热损耗,以及对噪声敏感等。而在用了PWM技术后,避免了以上的缺陷,实现了用数字方式来控制模拟信号,可以大幅度降低成本和功耗。PWM对调速系统来说,系统的响应速度和稳定精度等指标比较好;电枢电流的脉动量小,容易连续,而且可以不必外加滤波电抗也可以平稳工作;系统的调速范围宽;使用元件少、线路简单。三、实验结果分析(含程序、数据记录、控制算法及分析和实验总结等):3.1.程序 #include#define uchar unsigned c
5、har#define uint unsigned int#define Speed_Max 70#define Pwm_Period100/*端口初始化*/sbit Rs=P25;sbit Rw=P26;sbit En=P27; sbit In2 = P14; sbit In1 = P16;sbit PWM = P15;sbit KEY1 = P20; sbit KEY2 = P21; sbit KEY3 = P22;sbit KEY4 = P23;/*变量定义*/uint Duty = 0;/占空比uint Now_Speed = 0; uint Set_Speed=40;uchar sta
6、te = 1;uint Count=0,Count_Period=0,Count_Jishu=0;uchar Flag=0,Flag_Speed=0,Flag1=0;uint Kp=4,Ki=1,Kd=1;uint Last_Error; uint L_Last_Error; /*函数初始化*/void delay();void Timer0_init();void Timer1_init();void Write();void Write_date();void Lcd1602_init();void String_display();void Numeral_display();void
7、Float_display();void key_scan();void Sudu_jia();void Sudu_jian();void display_cusor();void sys_init();int delta_Duty();void Yejin_init();int Pid_Ctrol();/*/void delay(uint Z) uint X,Y; for(X=0;XZ;X+) for(Y=0;Y110;Y+);void Timer0_init(void)TMOD |= 0x05;TH0 = 0;TL0 = 0;ET0 = 1;TR0 = 1;void Timer1_init
8、(void)TMOD |= 0x20;TH1 = 0x38;TL1 = 0x38;ET1 = 1;TR1 = 1;void Write( uchar Shuju)Rs=0; Rw=0; En=0; delay(5); P0=Shuju; En=1; delay(10); En=0;void Write_date( uchar date) Rs=1; Rw=0; En=0; delay(5); P0=date; En=1; delay(10); En=0;/*显示屏的设定,参考1602PDF资料*/void Lcd1602_init()Write(0x38); /设置显示模式16*2显示 5*7
9、点阵 8位数据接口 Write(0x0c);/开显示,不显示光标 Write(0x06);/当读写一个字符后地址指针加一,且整屏不移动 Write(0x01);/显示清屏void String_display(uchar Hang,uchar Lie, uchar *p) uchar _addr;if(Hang = 1)_addr = 0x80;else if(Hang = 2)_addr = 0xc0;Write(_addr + Lie);doWrite_date(*p);p+;while(*p != 0);/*液晶参数Hang 行 Lie 列 Num 要显示的数据3位小数 */ void
10、Numeral_display(uchar Hang, uchar Lie, uint Num)uchar _addr, i;uint display3;if(Hang = 1)_addr = 0x80;else if(Hang = 2)_addr = 0xc0;Write(_addr + Lie);display0 = Num/100;display1 = (Num % 100) / 10;display2 = Num % 10;for(i=0; i3; i+) Write_date(displayi + 0x30);/*液晶参数Hang 行 Lie 列 Num 要显示的数据2位小数 */v
11、oid Float_display(uchar Hang, uchar Lie, uint Num)uchar _addr;if(Hang = 1)_addr = 0x80;else if(Hang = 2)_addr = 0xc0;Write(_addr + Lie);Write_date(Num/10 + 0x30);Write_date(.);Write_date(Num%10 + 0x30);void Lcd1602_cursor(uchar Hang, uchar Lie)uchar _addr;if(Hang = 1)_addr = 0x80;else if(Hang = 2)_a
12、ddr = 0xc0;Write(_addr + Lie);Write(0x0f);/*PID算法控制*/int Pid_Ctrol( int Now_Speed ) uintError, Error1, Error2;int Temp = 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
13、 = Last_Error; Last_Error = Error;return (Temp);/*1602液晶显示*/void Yejin_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,1