图1 DFRobot编码器小车全景图
如何才能直观地看到小车左右车轮电机转速和功率值的变化以及PID比例调节的效果,小车上的Arduino单片机控制器是做不到这点的,我采用的是上位机LabVIEW制作的前面板作为人机交互的界面,来实现对它们的监控。Arduino控制器作为下位机,接受上位机的小车左电机功率值,并把左右电机的转速和PID调节后右电机的功率值反馈到上位机去显示出来。上下位机的串口通信采用了XBee 1mW Zigbee100米传输无线数传模块套装,目的是使USB有线通信变为无线通信模式。如图2所示。
图2编码器小车与PC机的XBee无线通信设备
LabVIEW人机交互界面如下图所示,这个图是实验当时用截图软件截屏而得,可以看到,当左电机的PWM功率值为68时,PID调节后的右电机PWM功率值需为60,才能使左右电机转速一致。(注意:左右电机转速相差5,并不说明是转速不同,而是编码器的分辨率不够,因为这个小车编码器码盘的齿数只有12个。)
图3编码器小车左右转速同步的PID调节实验人机交互面板
PID算法放在下位机Arduino程序中,这个指令是:
val_right=(float)val_right+(rpm1-rpm2)*0.4;
式子中rpm1是左电机的转速;rpm2是右电机的转速;val_right是右电机的PWM功率值。左右电机的转速差乘以比例因子0.4叠加到上一次PID计算得到的val_right,就得到了当前右电机PWM功率值val_right。如果左电机转速rpm1比右电机转速rpm2要低,则从算式中可以看到,会自动减小右电机功率值val_right,通过循环执行Arduino程序中PID算式,以达到两电机转速一致的目的。
一个有趣的实验,可以边实验边观察。如果您拿起这个编码器小车,用手摩擦小车的左轮,左轮的转速变慢,在PID比例算式的作用下,右轮电机的PWM功率值会变小,以使右轮速度也跟着变慢。这时,再把手移到小车右轮,右轮遇到阻力时,为了保证依然与左轮转速同步,在LabVIEW前面板反馈的右电机PWM功率值,您会观察到它的值再不断增加。所以一个PID比例算法的功效,通过编码器小车这个物理设备和LabVIEW这个人机交互界面,就真真切切地感受到了。
LabVIEW虚拟仪器程序由前面板和框图程序组成,前面板是人机交互的界面,界面上有用户输入和显示输出两类控件;框图程序则是用户编制的程序源代码,以定义和控制在前面板上的控件输入和输出功能。这个LabVIEW上位机程序用到了事件结构的编程技术,以响应前面板上的四个按钮,这个四个按钮分别为“前进”、“后退”、“停止”和“退出”。图4为框图程序的“前进”事件分支的程序截图。(双击图片,可以放大!)
图4框图程序的“前进”事件分支
从图4看出,如果按下前面板的“前进”按钮,在后台程序中就会引发“前进”:值改变事件分支,这个分支程序的任务是先把三个字节数据转换为一个字符串,再输入到VISA写入V