开始 RI=1 将数据存入数组js 接收完毕 js[2]=1 修改主电机设定速度shd js[2]=0 开始上传主从电机实际速度 RI清0 TI=1 发送主从电机实际速度 TI清0 中断返回
图3.3 与上位机通信子程序流程图
31
3.3.4 主程序
PID控制算法是在主程序中完成的。在主程序中不断地以0.1秒的周期循环计算控制量,即主从电机PWM的占空比,通过改变占空比来调节电机的速度。其流程图如图3.4所示。
j作为主程序的循环标志,每当Timer4循环4次计时0.1秒时在T4中断中被置1,在主程序中进入if语句执行一次控制算法,并被清0。下一次主程序循环过来时if语句就不会再执行了,直到过了0.1秒后j再次被置1,这样就保证了0.1秒内只计算一次。
在主程序的初始化阶段,为主电机设定了一个300转/分钟的转速,即shj=300,并设置了一组控制参数,若要改变电机的速度,可通过UART0通信接口在上位机界面上修改。
在主程序中,主电机的设定速度转化成的标准脉冲数减去其实测脉冲数,其结果作为当前时刻主电机的速度偏差值,从电机把主电机的实测脉冲数作为自己的设定速度值,用其减去从电机的实测脉冲数,结果作为其当前时刻的速度偏差值,以实现跟踪主电机。
改进的PID算法采用了遇限削弱积分法和积分分离法。主电机积分饱和的条件为:e13>300或u1=255且e13>0, 即当主电机速度偏差达到300或主电机控制量已达到上限且偏差为正时,除去主电机控制算法中的积分项。从电机积分饱和的条件为:e23>300或u2=255且e23>0,即当从电机速度偏差达到200或从电机控制量已达到上限且偏差为正时,除去从电机控制算法中的积分项。
为了避免主从电机稳定情况下频繁地修改控制量并减小计算工作量,主程序采用了带死区的控制算法,当主从电机的速度偏差满足以下条件|ei3|<2且|ei3-ei2|<2时,认为主从电机速度处在稳定域内,不执行修改控制量的指令。
32
开 始 主电机速度初始值设定 控制参数初始设置 J=1 计算主电机近三次速度偏差 计算从电机近三次速度偏差 主电机积分饱和 K1=0去除主电机积分项 从电机积分饱和 K2=0去除从电机积分项 主电机偏差稳定域内 计算主电机控制量u1 从电机偏差稳定域内 计算从电机控制量u2
图3.4 主程序流程图
33
3.4 程序调试
程序的编辑及调试是在C8051F单片机的专用配套集成开发环境(IDE)中完成的,IDE支持硬件环境下的调试。IDE支持运行,停止,断点,查看等操作,十分方便。本程序是在硬件环境下进行调试的。IDE操作界面如图3.5所示。
调试是程序设计中非常重要的一环。程序设计是一项系统的工程,要做到一次性正确是困难的,一经调试,总会发现这样那样的错误。在程序调试时,首先要保证硬件接线正确,因为我们是在硬件环境下进行调试的。
程序是在一边编写一边调试中完成的。我们先编写了初始化段、测速段和主程序,这是一个完整的控制程序,调试无误后,又编写了串口通信程序,这是一个相对独立的程序段。在程序排错时,最有效的方法是模块化的调试排错方法。先按最小单元一个模块一个模块的调试,无误后,再按一个功能一个功能模块的调试。
图3.5 IDE编辑和调试环境
34
需要说明的是,上位机上的通信界面我们采用的是串口调试精灵。它是一个仿真串口通信软件。用它能够实现PC机与单片机的通信。其操作界面如图3.6所示。
图3.6 串口调试精灵调试界面
调试通信程序的时候,在串口调试精灵界面上先将串口设置为如图3.6中的参数,波特率为115200,接收和发送数据都采用16进制,再将串口打开。在主程序中设定速度初始化为每分钟300转。若要改为每分钟200转,则在串口调试精灵中的发送数据区输入以下三个数据:00,c8,01,十六进制数c8即是十进制数200,在主程序运行的情况下按一下手动发送即可,发送后电机的速度马上调整。发送结果可在IDE中查询,如图3.7所示。
35