合乎 发表于 2014-3-10 11:29:08

家用型移动机器人制作教程 电机驱动篇

作者:Pepin@DFRobot 转载请注明来源GMR板简介
GMR板全称 通用机器人扩展板, 是一块专为家用机器人平台(HCR) 设计的集成电路板。在这块集成版上需要插入3 个微处理器(单片机):2块Arduino Nano和1块Arduino Mega ADK。 3块处理器之前均已通过I2C链接勿需另外连线。其中一块Nano作为电机控制以及数据采集,另一块nano用来驱动超声波传感器。Arduino Mega ADK 作为主控板,采集传输数据以及其他扩展模块,另外还有2个无线通讯槽可使用Xbee,蓝牙以及其他通讯模块。另外有8个I/O端口以及8个模拟口3个i2c通讯接口作为Mega ADK 的输入输出。 nano板留有电机驱动的专用端口以及可调旋钮电压输出。 电机驱动篇用一块Arduino Nano板在GMR板中作为链接电机驱动和电机以及编码器作为动作执行板。我们可以根据不同需求选用不同的电机驱动器,本文将以Dfrobot 双路2X15A 电机驱动板作为电机驱动。
1 电机测试第一步我们要测试电机,学着使用电机驱动来驱动电机,并调试好正确的正反方向在正式安装电子系统之前,这里我建议先用连个空电机作为测试,不提倡直接在装配好的HCR上测试。首先如下图所示链接电路,注意电机驱动板需要外接电源,所以如果需要使用其他的电机驱动以及电机时注意GMR的最低供电电压为12V。
其中要注意的是电机的正负,两个电机在实际安装中方向是相反的,但在程序中做这个调整可能会比较混乱,所以我们在连线的时候注意吧两个电机的连线反过来。然后在Arduino Nano板上烧入电机测试程序 motor_test.ino
int E1 = 9;   //M1 Speed Controlint E2 = 10;    //M2 Speed Controlint M1 = 8;   //M1 Direction Controlint M2 = 11;    //M1 Direction Control
这些变量和电机驱动连线相对应。
digitalWrite(E1,a); digitalWrite(M1,LOW);    //High and Low determine the direction offthe motordigitalWrite(E2,b);   digitalWrite(M2,LOW);
a,b是控制电机转速的变量,最大255,最小0.HIGH 和LOW控制电机的方向。
在测试电机驱动的同时测试电机的方向为HIGH时电机方向使得车前进为LOW时电机方向使得车后退。两个电机分开测试。
2 霍尔编码器
编码器是一个用来实现电机乃至整个HCR能够精确控制的重要传感器,HCR配套的直流电机提供了一个高精度的霍尔编码器,脉冲数13,可提供输出轴每转663个反馈的脉冲信号。如下图所示链接电路。
然后在 Arduino Nano板上烧入编码器测试程序 encoder_test.ino
const byte encoder0pinA = 2;//A pin ->the interrupt pin 0const byte encoder0pinB = 4;//B pin ->the digital pin 4
定义编码器2个数字输出的引脚可以根据实际连线调整
void wheelSpeed()
在这个函数中,根据霍尔传感器的特点根据 2个引脚的不同读数以及状态变化判断电机的正反转。
如图连线之后给电机装上轮子,正反装转动轮子,判断编码器程序是否工作以及读数时候正确(正反转)正确的读书是当你轮子为你定义的正转时,编码器读数为正,反之为负,两个电机分开测试,然后结合你的电机驱动程序测试,即电机驱动后正前进时编码器读数为正,反之为负。在这里不列出编码器结合电机驱动的程序。
这一步的驱动十分重要,将直接影响之后的PID电机控制程序工作能否正常。
3 PID 电机控制结合编码器了得电机驱动程序,利用PID算法之后,一个连续的顺滑的精确电机控制程序就可以实现HCR的定速度运行了,定距离、定角度控制也可以实现。
PID控制器(比例-积分-微分控制器),由比例单元P、积分单元I和微分单元D组成。通过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本上线性,且动态特性不随时间变化的系统。
PID控制器是一个在工业控制应用中常见的反馈回路部件。这个控制器把收集到的数据和一个参考值进行比较,然后把这个差别用于计算新的输入值,这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。PID控制器可以根据历史数据和差别的出现率来调整输入值,使系统更加准确而稳定。 根据图1 和图2 链接GMR和电机驱动,电机以及编码器,我们得到了整个电机控制的闭环控制。从代码中仔细核对引脚定义与实际连线,否则在之后的测试中会有错误。在PID中,一个控制回路包括三个部分:1.   系统的传感器得到的测量结果2.   控制器作出决定3.   通过一个输出设备来作出反应
传感器就是霍尔编码器,控制器就是 Nano,输出设备就是两个电机。
在Arduino Nano中烧入PID电机控制程序Nano_motor_2X15A.ino这个代码包含了I2C部分这部分内容会在之后的章节提及。(2.5 Mega 与 Nano通讯)从代码中仔细核对引脚定义与实际连线,否则在之后的测试中会有错误。
首先我们会给出一个目标速度,这个就是PID算法中的需求结果。_speedtarget,_speedtargetNano从霍尔编码器得到脉冲值Lduration和Rduration通过轮子直径等常数带入计算得到实际速度prevspeed。   void ResentSpeed()以及lastspeed()这两个个函数用来计算实际速度。具体可查看代码。然后我们可以用目标速度减去测量结果来得到误差。
int error = _speedtarget - prevspeed;用这个误差来计算出对系统纠正值来作为电机输出,这样就可以消除误差。这个纠正值有三种算法,消除目前的误差,平均过去的误差,和透过误差的改变来预测将来的误差。即PID
比例- 来控制当前,误差值和一个正值的常数P(表示比例)相乘。在代码中我们只使用_proportion 误差值是 errorerror = _speedtarget - prevspeed;积分 - 来控制过去,将误差值过去一段时间和(误差和)乘以一个正值的常数I。在代码中我们只使用_integral 误差和sumerrorsumerror += error;sumerror = min(_maximum,sumerror);//limit the range of intergral segmentsumerror = max(_minimum,sumerror);微分 - 来控制将来,计算误差的一阶导,并和一个正值的常数D相乘。在代码中我们只使用_derivative 误差的一阶导 derrorderror = _lasterror - _preverror;_preverror = _lasterror;_lasterror = error;
这样我们就得到了纠正值_proportion*error+_integral*sumerror+_derivative*derrorfloat TVPIDcal(float prevspeed,booleantarget)这个函数计算了整个过程
int TVAffect(float pidpara)请注意这个函数,他是用来计算最大纠正输出的,使得整个输出在1000到2000的PWM输出范围内void Motor(int value,byte whichwheel)是纠正输出函数也就是实际的电机控制。注意有些电机驱动是Pwm=1500时候电机转速为0 小于1500和大于1500的值为不同的转向,Dfrobot的双路电机驱动方式需要由此进行些改变。
PID的三个经验常数已经在代码中给出。
PS:感谢Amber绘图

ambersea 发表于 2014-3-10 13:42:53

楼主辛苦了~我能说我厚颜无耻的开始坐等避障部分了么……

合乎 发表于 2014-3-10 18:08:17

一天一贴,本周发完

Angelo 发表于 2014-3-11 12:20:01

这图画得,太给力了~~


简单明了

Holiday 发表于 2014-3-12 10:05:14

这。。。一天一个这么大的帖子,这么强大
:L
页: [1]
查看完整版本: 家用型移动机器人制作教程 电机驱动篇