成 绩: 大学自动化学院综合实验报告题 目: 直流电机闭环调试系统 学生姓名:班 级:学 号:同组人员:指导教师:完成时间:一、实验名称:基本情况:6. 具体分工:7. 本人在项目组的作用描述: 在本次试验中我负责的是程序的设计编写和调试,在设计出的硬件为基础上选择了适当的方法来实现功能,程序主要分为三大模块:PID计算、PWM波的产生、液晶的显示,其中液晶程序是参考同学的设计,PID和PWM为自己编写在试验中大家相互交流,共同解决了很多问题,其中程序设计前,我就开始了PID的学习,从完全不懂到逐步理解最后到实践,在上机调试阶段对PID参数的确定遇到一些困难,不过经不懈努力最终找到适合的参数二、实验内容(实验原理介绍):本次试验设计的是直流电机闭环控制系统,闭环控制的优点是控制的精度可以达到很高,而且对外界的干扰和系统的参数变化有很好的抑制作用,且可以通过输出反馈控制系统的控制过程缺点是存在稳定性,振荡,超调等一系列问题,对系统的性能分析和设计远比开环控制麻烦 本次试验应用PID算法控制电机的转速,利用实际转速进行反馈与给定的转速形成对比,进而通过算法输出PWM波形来控制直流电机。
r(t) c(t)e(t)输出PWM直流电机PID算法测速装置图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#define uchar unsigned char#define uint unsigned int#define Speed_Max 70#define Pwm_Period 100/***************端口初始化********************/sbit Rs=P2^5;sbit Rw=P2^6;sbit En=P2^7; sbit In2 = P1^4; sbit In1 = P1^6;sbit PWM = P1^5;sbit KEY1 = P2^0; sbit KEY2 = P2^1; sbit KEY3 = P2^2;sbit KEY4 = P2^3;/**************变量定义**********************/uint Duty = 0;//占空比uint Now_Speed = 0; uint Set_Speed=40;uchar state = 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 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;X