9994| 4
|
家用型移动机器人制作教程 电机驱动篇 |
作者: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 Control int E2 = 10; //M2 Speed Control int M1 = 8; //M1 Direction Control int M2 = 11; //M1 Direction Control 这些变量和电机驱动连线相对应。 digitalWrite(E1,a); digitalWrite(M1,LOW); //High and Low determine the direction offthe motor digitalWrite(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 0 const byte encoder0pinB = 4;//B pin ->the digital pin 4 定义编码器2个数字输出的引脚可以根据实际连线调整 void wheelSpeed() 在这个函数中,根据霍尔传感器的特点根据 2个引脚的不同读数以及状态变化判断电机的正反转。 如图连线之后给电机装上轮子,正反装转动轮子,判断编码器程序是否工作以及读数时候正确(正反转)正确的读书是当你轮子为你定义的正转时,编码器读数为正,反之为负,两个电机分开测试,然后结合你的电机驱动程序测试,即电机驱动后正前进时编码器读数为正,反之为负。在这里不列出编码器结合电机驱动的程序。 这一步的驱动十分重要,将直接影响之后的PID电机控制程序工作能否正常。 3 PID 电机控制 结合编码器了得电机驱动程序,利用PID算法之后,一个连续的顺滑的精确电机控制程序就可以实现HCR的定速度运行了,定距离、定角度控制也可以实现。 PID控制器是一个在工业控制应用中常见的反馈回路部件。这个控制器把收集到的数据和一个参考值进行比较,然后把这个差别用于计算新的输入值,这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。PID控制器可以根据历史数据和差别的出现率来调整输入值,使系统更加准确而稳定。 根据图1 和图2 链接GMR和电机驱动,电机以及编码器,我们得到了整个电机控制的闭环控制。从代码中仔细核对引脚定义与实际连线,否则在之后的测试中会有错误。 在PID中,一个控制回路包括三个部分: 1. 系统的传感器得到的测量结果 2. 控制器作出决定 3. 通过一个输出设备来作出反应 传感器就是霍尔编码器,控制器就是 Nano,输出设备就是两个电机。 在Arduino Nano中烧入PID电机控制程序Nano_motor_2X15A.ino这个代码包含了I2C部分这部分内容会在之后的章节提及。(2.5 Mega 与 Nano通讯) 从代码中仔细核对引脚定义与实际连线,否则在之后的测试中会有错误。 首先我们会给出一个目标速度,这个就是PID算法中的需求结果。 _speedtarget[LF],_speedtarget[RT] Nano从霍尔编码器得到脉冲值Lduration和Rduration通过轮子直径等常数带入计算得到实际速度prevspeed。 void ResentSpeed()以及lastspeed()这两个个函数用来计算实际速度。具体可查看代码。 然后我们可以用目标速度减去测量结果来得到误差。 int error = _speedtarget - prevspeed; 用这个误差来计算出对系统纠正值来作为电机输出,这样就可以消除误差。 这个纠正值有三种算法,消除目前的误差,平均过去的误差,和透过误差的改变来预测将来的误差。即PID 比例- 来控制当前,误差值和一个正值的常数P(表示比例)相乘。 在代码中我们只使用_proportion 误差值是 error error = _speedtarget - prevspeed; 积分 - 来控制过去,将误差值过去一段时间和(误差和)乘以一个正值的常数I。 在代码中我们只使用_integral 误差和sumerror sumerror += error; sumerror = min(_maximum,sumerror);//limit the range of intergral segment sumerror = max(_minimum,sumerror); 微分 - 来控制将来,计算误差的一阶导,并和一个正值的常数D相乘。 在代码中我们只使用_derivative 误差的一阶导 derror derror = _lasterror - _preverror; _preverror = _lasterror; _lasterror = error; 这样我们就得到了纠正值 _proportion*error+_integral*sumerror+_derivative*derror float 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绘图 |
663 Bytes, 下载次数: 2167
1.04 KB, 下载次数: 1916
9.18 KB, 下载次数: 1985
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed