直流电机速度控制_第1页
直流电机速度控制_第2页
直流电机速度控制_第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、组员:班级:研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桥所需的

2、PWM控制信号,PWM 的占空比为微控制器 PID控制算法的输出。通过控制 PWM的占空比来控制电机电枢电压, 从而达到控制电机转速的目的。单片机(89C52)图1.直流电机速度控制系统框图图中:r期望转速;b转速测量值;e期望转速与实际转速偏差;n转速输出值。直流电机转速为:U IRnK其中:U 电枢端电压;I-电枢电流;R-电枢电路总电阻;K-电机结构参数;每极磁通量。本系统采用对电枢电压进行控制的电枢控制法,而电枢电压的控制采用开关驱动方式,即使驱动电机的半导体功率器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速。在Altium Designer summer 09中

3、画出直流电机速度控制系统的详细设计原理如下图所 示。微控制器采用 STC89C52RC单片机,单片机和上位PC机通过RS232进行通信,通过单片机的外部中断对编码器输出脉冲进行计数、单片机的P0.0和P0.1 口输出PWM波形信号。外部中断INT1对光电编码器脉冲计数,单片机在一定时间间隔内即可计算出电机的转 速。当电机的实际速度小于目标速度时,LEDO指示电机加速;当大于目标速度时,LED1指示电机减速。图2直流电机速度控制系统详细设计图2、硬件搭建过程、单片机最小系统功能介绍:1支持STC51系列与AT51系列单片机(DIP40),或通过其它转接座支持其它型号单片机;2. 8路水晶蓝LED

4、可作流水灯实验;3. 2个中断按键(INTO与INT1)和1个复位按键;4. 1个电位分压器可供调节输出参考电压5. 1个标准ISP下载接口,用于下载 AT单片机程序,及供电;6. 1个USB-TTL接口,用于下载 STC单片机,及供电;7. 32个10 口以排针形式引出,方便外部使用;&留有3组电源排针输出,方便外部配件取电,或向板子供电;9. 板载12MHz优质晶振及P0 口全部上拉4.7K电阻,板上标准复位电路;10. 使用DIP40锁紧座方便取放芯片;、RS232串口模块本文设计的控制系统与上位机串口通信部分采用了PL2303HX模块实现。主要功能是将实时的速度数据传送到上位机

5、显示;接受上位机发送到单片机的控制信息,包括PID的三个参数Kp , Ki , Kp和电机转向。PL2303HX采用28脚贴片SOIC封装,工作频率为 12MHZ,符合USB 1.1通信协议, 可以直接将USB信号转换成串口信号,波特率从75,有22种波特率可以选择,并支持5、6、7、& 16共5种数据比特位,是一款相当不错的 USB转串口芯片。PL2303模块可以方便地利用杜邦免焊接连接线接入电路,只要插接3根线,一根串口入、一根串口出、一根地线。需要注意的是STC89C52单片机下载模式接线如下:(只需要连接3根线)USB转TTL小板TX连接单片机P3.0(RX)USB转TTL小板

6、RX连接单片机P3.1(TX )USB转TTL小板GND连接单片机GND、电机驱动模块本系统采用的电机驱动模块为L9110S双路直流电机驱动板,实物如下图所示。L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立 电 路集成在单片IC之中,使外围器件成本降低,整机可靠性提高。该芯片有两个TTL/CMOS 兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动及刹车, 它具有较大的电流驱动能力,每通道能通过750800mA的持续电流,峰值电流能力可达1.52.0A ;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲 击电流,使它在驱

7、动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。L9110被广泛应用于保险柜、玩具汽车的电机驱动、步进电机驱动和开关功率管等电路上。>f盼 I03A厂 GNO 二.电路内部功能框图:图3. L9110电路内部功能框图具有如下特点:低静态工作电流;宽电源电压范围:2.5V-12V ;每通道具有800mA连续电流输出能力;较低的饱和压降;输出具有正转、反转、高阻和刹车四种状态;TTL/CMOS 输出电平兼容,可直接连 CPU ;输出内置钳位二极管,适用于感性负载;控制和驱动集成于单片 IC之中; 具备管脚高压保护功能;工作温度:-20 C -80 C。应用电路图:图4. L9110

8、驱动电机应用电路图四、测速模块本系统采用精度达到 888线的AB相编码器。通过旋转的光栅盘和光耦产生可识别方向 的计数脉冲信号。以下是该编码器的相关介绍:编码器型号:Agilent09843料码盘印刷有:888cpr/300lpiPWB-Ruhlatec编码器型号为 Agile nt Q9843 , 888线码盘保证了测速精度,也就是电机转一圈输出888个脉冲,芯片上已集成了脉冲整形触发电路,输出的是矩形波,用示波器检测相当稳定,直接单片机10 口,由于分辨率很高,对单片机的处理能力和程序编写水平提出较高要求。以下是直流电机实测参数以供参考:电机线圈电阻6.6欧,阻转电流=电压/电阻。测试得到

9、参数表如下:电压空载电流输出转速(减速后,单位rpm)3V60mA706V70mA14012V80mA280编码器3.5V时耗电实测20ma(实测3.3V-5V都正常工作,方波规范,但随着电压的提 高工作电流会增加,5V时工作电流40ma),加电后编码器发出暗红色的光(亮度很低),AB相输出就可以知道电机的转动方向。五、上位机显示与控制上位机实现通过串口向单片机发送控制数据、处理单片机回送数据、显示转数值和速 度-时间曲线,便于观察控制系统的性能指标。其界面如下。主界面:速度显示PID参数设置菜单:使用说明:(1 )主界面:绘图设置菜单:首先,保证本直流电机控制系统的串口模块已连接上位PC机。

10、打开本软件,从设备管理器中,查看串口模块连接的com 口号,选择对应的com 口进行连接。成功连接后,点击开始采集,即可采集单片机发送的速度数据并实时显示收到的数据。同时,可 以s使用滑动条来调节目标速度。(2)PID参数设置菜单:点击PID参数设置菜单,即可 PID对三个控制参数 Kp,Ki,Kd设置,点击确定,设 置完毕。这时,需要点击发送控制信息,单片机接收到修改后的控制信息进行调整。控制信息采用8个byte的格式,其报文协议为:Kp两个字节,Ki两个字节,Kd两个字节,速度两个字节。(3 )绘图设置菜单:为了让使用界面更加友好,加入了绘图设置的功能。3、闭环系统的 PID 控制实现、控

11、制算法单片机软件实现接收上位机指令, 以期望速度和测量机构采集的测量速度的偏差信号作 为 PID 算法的输入信号, 经过 PID 控制后改变其输出的 PWM 信号的占空比, 输出 PWM 信 号,从而实现使电机的实际转速趋近于期望转速。实验采用位置式 PID 控制算法,算法流程为:e Vexp ectVbkuk Kpek KIjej KD(ek ek 1)outu uk0式中:Vexp ectVb期望转速值ekKpKIukout测量转速值转速偏差值第k次转速偏差值K D 比例、积分、微分系数PID计算输出值期望占空比 实际占空比输出值、 PID 参数的整合这里最重要的是 PID 参数的整合过程

12、和办法, PID 控制器参数选择的方法很多, 例如: 试凑法、临界比例度法、扩充临界比例度法等。但是,对于 PID 控制而言,参数的选择始 终是一件非常烦杂的工作, 需要经过不断的调整才能得到较为满意的控制效果。 依据调研和 经验,一般 PID 参数确定的步骤如下:(1) 确定比例系数 Kp确定比例系数 Kp 时,首先去掉 PID 的积分项和微分项,可以令 Ti=0 、 Td=0 ,使之成 为纯比例调节。输入设定为系统允许输出最大值的60%70 %,比例系数 Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数 Kp 逐渐减小,直至系统振荡消 失。记录此时的比例系数 Kp,设定P

13、ID的比例系数Kp为当前值的60%70%。(2) 确定积分时间常数 Ti比例系数Kp确定之后,设定一个较大的积分时间常数 Ti,然后逐渐减小Ti,直至系统 出现振荡,然后再反过来,逐渐增大 Ti,直至系统振荡消失。记录此时的 Ti,设定PID的 积分时间常数Ti为当前值的150%180%。(3) 确定微分时间常数 Td微分时间常数Td 一般不用设定,为 0即可,此时PID调节转换为PI调节。如果需要 设定,则与确定 Kp 的方法相同,取不振荡时其值的30%。最后,对 PID 参数进行微调,直到满足性能要求。4、问题探讨与实验总结一、问题探讨(1) 调速电机 PWM 的频率选择此问题在我们小组涉

14、及直流电机驱动时就遇到了, 可翻阅了很多资料, 都没有给一个完 美的答复,我觉得应该根据电机的特性来选择 PWM 的频率。这与机械的固有震动频率有关, 另外与电机特性有关, 不过一般情况是频率如果太低会 导致电机抖动或者有啸叫声,或者致使交流成分太多,导致驱动桥中的功率管发热。PWM 的频率的选择和所用电机感抗和所需的速度响应时间有很大的关系,如果电机转速比较高,感抗比较小,可以使用比较高的频率。一般最好不要超过20K,因为一般IGBT最高 20K 的开关频率。而 MOS 的开关频率比较高,但是过高的频率就需要专用的驱动电 路,不然 MOS 工作在放大区的时间比较长。如果电机转速比较低,感抗比

15、较大,而且又是 在做伺服,那开关频率就需要低一点。(2) PID 控制输出量如何控制执行器?本系统的直流电机是采用合适频率的 PWM 来驱动的, 脉冲的周期时间是一定的。 对于 速度的控制是采用脉宽调制的原理, 即电机的速度取决于 PWM 的占空比, 也就是说 PID 算 法是研究一种控制脉宽的方法, 使得电机速度能即快又稳地稳定在目标速度上。 我们采用的 方法是利用PID输出控制量u与PWM占空比线性对应的关系进行控制,并在u达到或小到一定程度后,进行占空比饱和处理。最终,达到了对直流电机速度较好的控制。二、实验总结5、附录:总体程序一、程序流程说明单片机资源分配与作用:定时器 T0:根据

16、frequency 设置,产生该频率的 PWM 来驱动电机。 脉冲周期时间不变,通过改变 高电平与周期时间之比来调整占空比。定时器 T1:作为串口通信中波特率发生器,工作在方式1。以全双工方式工作,为串口发送速度数据和接收控制信息提供时钟。定时器 T2:每经过一定时间间隔, 计算一次电机当前速度。 将数据写入串口缓冲区等待发送。 查询 接收数据缓冲区是否有控制信息,如果有,则接收数据。外部中断 INT0 ,INT1 : 计数光电传感器产生的脉冲。二、源代码具体程序如下:整体程序有两个部分组成:文件 project_motor_control.c 和文件 sio.c ,并附上了详细的 文档说明,

17、 方便理解程序的思路, 简单易懂。 project_motor_control.c 中程序的功能主要是电 机的速度测量,产生 PWM 驱动电机,和闭环 PID 的控制。而 sio.c 中程序的功能则是发送 和接收数据, 将速度信息发送到上位机处理显示, 以反映电机速度控制系统的控制性能; 同 时可以接收 PC 人机接口设置的控制信息。project_motor_control.c#include <reg52.h> #include <string.h> #include <stdio.h> #include <math.h>#include &

18、lt;intrins.h>#include <sio.h>/Keil外部函数库包含文件,_nop_函数在此库中/串口通信函数包含文件#include <config.h>#define uchar unsigned char#define uint unsigned int /* 电机接口 */sbit PHASE_A = P3A2;/夕卜部中断 INTO 粉红sbit PHASE_B = P3A3;/夕卜部中断 INT1 绿色sbitpwml = P0A0;/电机驱动接口, 当 Motordirection=1 时,pwm1=1,pwm2=0,电机正转;反之,电

19、机反转sbit pwm2 = P0A1;sbit ledup= P2A0;/加速灯指示sbit leddown = P2A7;/减速灯指示/* 电机调速参数 */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

20、 = 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;*毫秒延时函数 *void delay1ms(void)uint j;for(j = 0;j <= 120;j+) _nop_();void delayXms(uint ms)uint k;

21、for(k = 0;k <ms ;k+) delay1ms();*/* 定时器中断初始化函数void T0_Init()EA = 0;TMOD &= 0xf0;/定时器 0,工作方式 1初使加载 50 毫秒TMOD |= 0x01;TH0 = (65536 - (XTAL/(12*100) * Dutycycle/frequency)/256;/TL0 = (65536 - (XTAL/(12*100) * Dutycycle/frequency)%256;PT0 = 0;ET0 = 1;TR0 = 1;if(Motordirection = 1) pwm1 = 1;pwm2 =

22、 0;else/定时器中断优先级/开定时器中断 / 启动 T0pwm1 = 0; pwm2 = 1; void T2_Init() /50ms 定时 RCAP2H = (65536-46080)/256; /重装模式 RCAP2L = (65536-46080)%256;ET2 = 1;TR2 = 1; /* void INT_Init() IT1 = 1;EX1 = 1;PX1 = 0;/ 启动 T2外部中断初使化函数 */设置外部中断 1 为下降沿触发 /开外部中断 1/开总中断外部中断函数 *定时器中断函数 *EX0 = 0; PX0 = 0;EA = 1;/* void my_INT1

23、(void) interrupt 2 countB = countB+;/每中断一次变量加 1void Timer0(void) interrupt 1/定时器 0 中断 计算电机转速uint t,nt; TR0 = 0;t =(65536 - (XTAL/(12*100) * Dutycycle/frequency); nt =(65536 - (XTAL/(12*100) * (100-Dutycycle)/frequency); pwm2 = 0; if(pwm1 = 1) TH0 = nt/256 ;/重装TL0 = nt%256; pwm1 = 0; else TH0 = t/256

24、 ; / 重装 TL0 = t%256; pwm1 = 1;else/ 电机反转pwm1 = 0; if(pwm2 = 1) TH0 = nt/256 ;/重装TL0 = nt%256; pwm2 = 0; elseTH0 = t/256 ; / 重装 TL0 = t%256; pwm2 = 1;TR0 = 1;*PID函数部分 *typedef struct PID intSetPoint;/设定目标Desired ValueintProportion;/比例常数Proportional ConstintIntegral;/积分常数Integral ConstintDerivative;/微

25、分常数Derivative ConstintLastError;/Error-1 (上一次误差)intPrevError;/Error-2(上上次误差)intSumError;/Sums of Errors PID;PID sPID;int PIDCalc( PID *pp, double NextPoint )int dError,Error;Error = pp->SetPoint - NextPoint;/ 偏差pp->SumError += Error;/ 积分dError = pp->LastError - pp->PrevError;/ 当前微分pp->

26、;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 Functionreturn speed;void

27、 actuator (int rDelta) / Dummy Actuator Functionif(rDelta <= -boundarydown)Dutycycle=10;else if(rDelta >= boundaryup) Dutycycle=90;elseDutycycle = (uint)(80*(rDelta+boundarydown)/(boundarydown+boundaryup)+10); delayXms(40);void Timer2(void) interrupt 5TF2 = 0;/定时器 2 的中断标志要软件清 0n = n+1; /n+if (

28、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; n = 0; if(parameter_set = 1)a0 = com_getchar(); a1 = com_getchar(); a2 = com_getchar(); a3 = com_getchar();a4 = c

29、om_getchar(); a5 = com_getchar();a6 = com_getchar(); a7 = com_getchar();Kp = (a0<<8)|a1)/10; Ki = (a2<<8)|a3)/10;Kd = (a4<<8)|a5)/10; Tspeed = (a6<<8)|a7; sPID.Proportion = Kp; sPID.Integral = Ki; sPID.Derivative = Kd; sPID.SetPoint = Tspeed; parameter_set = 0;com_putchar(spe

30、ed/256); com_putchar(speed%256);/外部中断 1 中断次数归零/ Set PID Coefficients ( KP,KI,KD 系数设定)/ 每 X 秒向上位机发送速度数据I*主函数 *Ivoid main()int rOut; uint rIn;PIDInit ( &sPID ); sPID.Proportion = Kp; sPID.Integral = Ki; sPID.Derivative = Kd;/ PID Response (Output)/ PID Feedback (Input)/ Initialize Structure/ Set P

31、ID Coefficients ( KP,KI,KD 系数设定)sPID.SetPoint= Tspeed;/ Set PID SetpointT0_Init(); com_initialize();II定时器TO初使化 question :定时器初始化/初始化串口通信T2_Init();INT_Init();/定时器 T2 初使化/外部中断初使化while(1) rIn = sensor ();/ Read InputrOut = PIDCalc ( &sPID,rIn );/ Perform PID Integrationactuator ( rOut ); / Effect Ne

32、eded Changes sio.c 具体程序如下:/*SIO.C: Serial Communication Routines.Copyright 1995-2002 KEIL Software, Inc. */#include <reg52.h> #include <string.h>#include "sio.h" #include "config.h"/*Notes:The length of the receive and transmit buffers must be a power of 2.Each buffer

33、 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

34、 & (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;elseti_restart = 1; / tbuf 发送完了,再次发送 tbuf/*/ #pragma disablevo

35、id 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;TI = 0; ti_restart = 1;/* clear receiver interrupt */ /* clear transmit interrupt */ES = 1;PS = 1; /* enable serial interrupts */* set serial interrupts to low priority */*/ #pragma disablevoid com_baudrate (

温馨提示

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

评论

0/150

提交评论