直流电机速度控制-.docx_第1页
直流电机速度控制-.docx_第2页
直流电机速度控制-.docx_第3页
直流电机速度控制-.docx_第4页
直流电机速度控制-.docx_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机控制系统实践直流电机速度控制组员: 班级:研1308授课教师:徐洪泽电子信息工程学院 日期:2013-11-24目录1、整体设计12、硬件搭建过程3一、单片机最小系统3二、RS232串口模块3一、电机驱动模块4四、测速模块5五、上位机显示与控制73、闭环系统的PID控制实现8一、控制算法8二、PID参数的整合84、问题探讨与实验总结9一、问题探讨9二、实验总结95、附录:总体程序10一、程序流程说明10二、源代码10三、实物图201、 整体设计本系统旨在实现直流电机的速度闭环控制。微控制器接受上位机和测速机构的速度信号,以其偏差作为PID控制算法的输入,同时用微控制器产生H桥所需的PWM控制信号,PWM的占空比为微控制器PID控制算法的输出。通过控制PWM的占空比来控制电机电枢电压,从而达到控制电机转速的目的。图1.直流电机速度控制系统框图图中:r期望转速; b转速测量值; e期望转速与实际转速偏差; n转速输出值。直流电机转速为:本系统采用对电枢电压进行控制的电枢控制法,而电枢电压的控制采用开关驱动方式,即使驱动电机的半导体功率器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速。在Altium Designer summer 09中画出直流电机速度控制系统的详细设计原理如下图所示。微控制器采用STC89C52RC单片机,单片机和上位PC机通过RS232进行通信,通过单片机的外部中断对编码器输出脉冲进行计数、单片机的P0.0和P0.1口输出PWM波形信号。外部中断INT1对光电编码器脉冲计数,单片机在一定时间间隔内即可计算出电机的转速。当电机的实际速度小于目标速度时,LED0指示电机加速;当大于目标速度时,LED1指示电机减速。图2.直流电机速度控制系统详细设计图2、 硬件搭建过程一、单片机最小系统功能介绍:1支持STC51系列与AT51系列单片机(DIP40),或通过其它转接座支持其它型号单片机;28路水晶蓝LED可作流水灯实验;32个中断按键(INT0与INT1)和1个复位按键;41个电位分压器可供调节输出参考电压51个标准ISP下载接口,用于下载AT单片机程序,及供电;61个USB-TTL接口,用于下载STC单片机,及供电;732个IO口以排针形式引出,方便外部使用;8留有3组电源排针输出,方便外部配件取电,或向板子供电;9板载12MHz优质晶振及P0口全部上拉4.7K电阻,板上标准复位电路;10使用DIP40锁紧座方便取放芯片;二、RS232串口模块本文设计的控制系统与上位机串口通信部分采用了PL2303HX模块实现。主要功能是将实时的速度数据传送到上位机显示;接受上位机发送到单片机的控制信息,包括PID的三个参数Kp,Ki,Kp和电机转向。PL2303HX采用28脚贴片SOIC封装,工作频率为12MHZ,符合USB 1.1通信协议,可以直接将USB信号转换成串口信号,波特率从751228800,有22种波特率可以选择,并支持5、6、7、8、16共5种数据比特位,是一款相当不错的USB转串口芯片。PL2303模块可以方便地利用杜邦免焊接连接线接入电路,只要插接3根线,一根串口入、一根串口出、一根地线。需要注意的是STC89C52 单片机下载模式接线如下:(只需要连接3根线)USB转TTL小板 TX 连接 单片机P3.0 (RX)USB转TTL小板 RX 连接 单片机P3.1 (TX)USB转TTL小板 GND 连接 单片机GND一、电机驱动模块本系统采用的电机驱动模块为L9110S双路直流电机驱动板,实物如下图所示。L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电 路集成在单片IC之中,使外围器件成本降低,整机可靠性提高。该芯片有两个TTL/CMOS 兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动及刹车,它具有较大的电流驱动能力,每通道能通过750800mA的持续电流,峰值电流能力可达1.52.0A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。L9110被广泛应用于保险柜、玩具汽车的电机驱动、步进电机驱动和开关功率管等电路上。电路内部功能框图:图3. L9110电路内部功能框图具有如下特点:n 低静态工作电流;n 宽电源电压范围:2.5V-12V;n 每通道具有800mA连续电流输出能力;n 较低的饱和压降;n 输出具有正转、反转、高阻和刹车四种状态;n TTL/CMOS 输出电平兼容,可直接连CPU;n 输出内置钳位二极管,适用于感性负载;n 控制和驱动集成于单片IC之中;n 具备管脚高压保护功能;n 工作温度:-20-80。应用电路图:图4. L9110驱动电机应用电路图四、测速模块本系统采用精度达到888线的AB相编码器。通过旋转的光栅盘和光耦产生可识别方向的计数脉冲信号。以下是该编码器的相关介绍:编码器型号为Agilent Q9843,888线码盘保证了测速精度,也就是电机转一圈输出888个脉冲,芯片上已集成了脉冲整形触发电路,输出的是矩形波,用示波器检测相当稳定,直接单片机IO口,由于分辨率很高,对单片机的处理能力和程序编写水平提出较高要求。以下是直流电机实测参数以供参考:电机线圈电阻6.6欧,阻转电流=电压/电阻。测试得到参数表如下:电压 空载电流输出转速(减速后,单位rpm)3V 60mA 706V 70mA 14012V 80mA 280编码器3.5V时耗电实测20ma(实测3.3V-5V都正常工作,方波规范,但随着电压的提高工作电流会增加,5V时工作电流40ma),加电后编码器发出暗红色的光(亮度很低),AB相输出就可以知道电机的转动方向。五、上位机显示与控制上位机实现通过串口向单片机发送控制数据、处理单片机回送数据、显示转数值和速度-时间曲线,便于观察控制系统的性能指标。其界面如下。主界面:速度显示PID参数设置菜单: 绘图设置菜单: 使用说明:(1)主界面:首先,保证本直流电机控制系统的串口模块已连接上位PC机。打开本软件,从设备管理器中,查看串口模块连接的com口号,选择对应的com口进行连接。成功连接后,点击开始采集,即可采集单片机发送的速度数据并实时显示收到的数据。同时,可以s使用滑动条来调节目标速度。(2)PID参数设置菜单:点击PID参数设置菜单,即可PID对三个控制参数Kp,Ki,Kd设置,点击确定,设置完毕。这时,需要点击发送控制信息,单片机接收到修改后的控制信息进行调整。控制信息采用8个byte的格式,其报文协议为:Kp两个字节,Ki两个字节,Kd两个字节,速度两个字节。(3)绘图设置菜单:为了让使用界面更加友好,加入了绘图设置的功能。3、 闭环系统的PID控制实现一、控制算法单片机软件实现接收上位机指令,以期望速度和测量机构采集的测量速度的偏差信号作为PID算法的输入信号,经过PID控制后改变其输出的PWM信号的占空比,输出PWM信号,从而实现使电机的实际转速趋近于期望转速。实验采用位置式PID控制算法,算法流程为: 式中:二、PID参数的整合这里最重要的是PID参数的整合过程和办法,PID 控制器参数选择的方法很多,例如:试凑法、临界比例度法、扩充临界比例度法等。但是,对于PID 控制而言,参数的选择始终是一件非常烦杂的工作,需要经过不断的调整才能得到较为满意的控制效果。依据调研和经验,一般PID 参数确定的步骤如下:(1) 确定比例系数Kp确定比例系数Kp时,首先去掉PID 的积分项和微分项,可以令Ti=0、Td=0,使之成为纯比例调节。输入设定为系统允许输出最大值的6070,比例系数Kp由0 开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的6070。(2) 确定积分时间常数Ti比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID 的积分时间常数Ti 为当前值的150180。(3) 确定微分时间常数Td微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30。最后,对PID参数进行微调,直到满足性能要求。4、 问题探讨与实验总结一、问题探讨(1) 调速电机PWM的频率选择此问题在我们小组涉及直流电机驱动时就遇到了,可翻阅了很多资料,都没有给一个完美的答复,我觉得应该根据电机的特性来选择PWM 的频率。这与机械的固有震动频率有关,另外与电机特性有关,不过一般情况是频率如果太低会导致电机抖动或者有啸叫声,或者致使交流成分太多,导致驱动桥中的功率管发热。PWM的频率的选择和所用电机感抗和所需的速度响应时间有很大的关系,如果电机转速比较高,感抗比较小,可以使用比较高的频率。一般最好不要超过20K,因为一般IGBT最高20K的开关频率。而MOS 的开关频率比较高,但是过高的频率就需要专用的驱动电路,不然MOS工作在放大区的时间比较长。如果电机转速比较低,感抗比较大,而且又是在做伺服,那开关频率就需要低一点。(2) PID控制输出量如何控制执行器?本系统的直流电机是采用合适频率的PWM来驱动的,脉冲的周期时间是一定的。对于速度的控制是采用脉宽调制的原理,即电机的速度取决于PWM的占空比,也就是说PID算法是研究一种控制脉宽的方法,使得电机速度能即快又稳地稳定在目标速度上。我们采用的方法是利用PID输出控制量u与PWM占空比线性对应的关系进行控制,并在u达到或小到一定程度后,进行占空比饱和处理。最终,达到了对直流电机速度较好的控制。二、实验总结5、附录:总体程序一、程序流程说明单片机资源分配与作用:定时器T0: 根据frequency设置,产生该频率的PWM来驱动电机。脉冲周期时间不变,通过改变高电平与周期时间之比来调整占空比。定时器T1:作为串口通信中波特率发生器,工作在方式1。以全双工方式工作,为串口发送速度数据和接收控制信息提供时钟。定时器T2:每经过一定时间间隔,计算一次电机当前速度。将数据写入串口缓冲区等待发送。查询接收数据缓冲区是否有控制信息,如果有,则接收数据。 外部中断INT0,INT1:计数光电传感器产生的脉冲。二、源代码整体程序有两个部分组成:文件project_motor_control.c和文件sio.c,并附上了详细的文档说明,方便理解程序的思路,简单易懂。project_motor_control.c中程序的功能主要是电机的速度测量,产生PWM驱动电机,和闭环PID的控制。而sio.c中程序的功能则是发送和接收数据,将速度信息发送到上位机处理显示,以反映电机速度控制系统的控制性能;同时可以接收PC人机接口设置的控制信息。project_motor_control.c具体程序如下:#include #include #include #include #include /Keil外部函数库包含文件,_nop_函数在此库中#include /串口通信函数包含文件#include #define uchar unsigned char#define uint unsigned int/*电机接口*/sbit PHASE_A = P32; /外部中断INT0 粉红sbit PHASE_B = P33; /外部中断INT1 绿色sbit pwm1 = P00; /电机驱动接口,当Motordirection=1时,pwm1=1,pwm2=0,电机正转;反之,电机反转 sbit pwm2 = P01;sbit ledup= P20; /加速灯指示sbit leddown = P27; /减速灯指示/*电机调速参数*/uint frequency = 500; /电机驱动PWM频率,单位Hzuint speed = 0; /电机实时速度,单位rmpuint Motordirection = 1; /电机转向uint Dutycycle = 50; /电机驱动PWM的占空比,范围10-90long int countA = 0; /A相脉冲计数long int countB = 0; /B相脉冲计数/*调速PID参数*/uint Kp = 1,Ki = 1,Kd = 0; uint n = 0,count = 0;uint f,Tspeed = 238; /期望速度,单位rmpuint count0=0,count1=0,count2=0; /编码器脉冲计数简易滤波char parameter_set = 0;uchar a8;float boundarydown = 120.0;float boundaryup = 125.0;/*X毫秒延时函数*/void delay1ms(void) uint j; for(j = 0;j = 120;j+) _nop_();void delayXms(uint ms)uint k;for(k = 0;k SetPoint - NextPoint; / 偏差 pp-SumError += Error; / 积分 dError = pp-LastError - pp-PrevError; / 当前微分 pp-PrevError = pp-LastError; /把上一次误差赋给上上次误差 pp-LastError = Error; /当前误差赋给上一次误差 return (pp-Proportion * Error / 比例项 + pp-Integral * pp-SumError / 积分项 + pp-Derivative * dError / 微分项 );void PIDInit (PID *pp) memset ( pp,0,sizeof(PID);uint sensor (void) / Dummy Sensor Function return speed;void actuator (int rDelta) / Dummy Actuator Function if(rDelta = boundaryup) Dutycycle=90; elseDutycycle = (uint)(80*(rDelta+boundarydown)/(boundarydown+boundaryup)+10); delayXms(40);void Timer2(void) interrupt 5 TF2 = 0; /定时器2的中断标志要软件清0n = n+1; /n+if (n = 4) /定时1秒(x个50ms为0.05*x秒)20*50ms=1count2 = count1; count1 = count0;count0 = countB;countB = (count0 + count1 + count2)/3;speed = countB * 60 * 5 / 888; /电机rpm,每分钟转速countB = 0; /外部中断1中断次数归零 n = 0;if(parameter_set = 1)a0 = com_getchar();a1 = com_getchar();a2 = com_getchar();a3 = com_getchar();a4 = com_getchar();a5 = com_getchar();a6 = com_getchar();a7 = com_getchar();Kp = (a08)|a1)/10;Ki = (a28)|a3)/10;Kd = (a48)|a5)/10;Tspeed = (a68)|a7;sPID.Proportion = Kp; / Set PID Coefficients(KP,KI,KD系数设定) sPID.Integral = Ki; sPID.Derivative = Kd; sPID.SetPoint = Tspeed; parameter_set = 0;com_putchar(speed/256); /每X秒向上位机发送速度数据com_putchar(speed%256); /*主函数*/void main() int rOut; / PID Response (Output)uint rIn; / PID Feedback (Input)PIDInit ( &sPID ); / Initialize Structure sPID.Proportion = Kp; / Set PID Coefficients(KP,KI,KD系数设定) sPID.Integral = Ki; sPID.Derivative = Kd; sPID.SetPoint = Tspeed; / Set PID Setpoint T0_Init(); /定时器T0初使化 question:定时器初始化com_initialize(); /初始化串口通信T2_Init(); /定时器T2初使化INT_Init(); /外部中断初使化while(1) rIn = sensor (); / Read Input rOut = PIDCalc ( &sPID,rIn ); / Perform PID Integrationactuator ( rOut ); / Effect Needed Changes sio.c具体程序如下:/*-SIO.C: Serial Communication Routines.Copyright 1995-2002 KEIL Software, Inc.-*/#include #include #include sio.h#include config.h/*-Notes:The length of the receive and transmit buffers must be a power of 2.Each buffer has a next_in and a next_out index.If next_in = next_out, the buffer is empty.(next_in - next_out) % buffer_size = the number of characters in the buffer.-*/*-*/static void com_isr (void) interrupt 4/*-Received data interrupt.-*/if (RI != 0) RI = 0; if (r_in - r_out) & (RBUF_SIZE-1) = 0) rbuf r_in & (RBUF_SIZE-1) = SBUF; / r_in+;if(r_in - r_out)=(RBUF_SIZE-1)parameter_set=1; /可以进行电机目标参数设置 /*-Transmitted data interrupt.-*/if (TI != 0) TI = 0; if (t_in != t_out) /tbuf没有发送完 SBUF = tbuf t_out & (TBUF_SIZE-1); t_out+; ti_restart = 0; else ti_restart = 1;/ tbuf发送完了,再次发送tbuf /*-*/#pragma disablevoid com_initialize (void)/*-Setup TIMER1 to generate the proper baud rate.-*/com_baudrate (9600);/*-Clear com buffer indexes.-*/t_in = 0;t_out = 0;r_in = 0;r_out = 0;/*-Setup serial port registers.-*/SM0 = 0; SM1 = 1; /* serial port MODE 1 */SM2 = 0;REN = 1; /* enable serial receiver */RI = 0; /* clear receiver interrupt */TI = 0; /* clear transmit interrupt */ti_restart = 1;ES = 1; /* enable serial interrupts */PS = 1; /* set serial interrupts to low priority */*-*/#pragma disablevoid com_baudrate ( unsigned baudrate)/*-Clear transmit interrupt and buffer.-*/TI = 0; /* clear transmit interrupt */t_in = 0; /* empty transmit buffer */t_out = 0;/*-Set timer 1 up as a baud rate generator.-*/TR1 = 0; /* stop timer 1 */ET1 = 0; /* disable timer 1 inter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论