飞思卡尔智能车摄像头组新手指南:电机舵机调试篇

  智能车电机舵机的调试

  彭岸辉

  要学习智能车首先要掌握如何对智能车的各个模块进行调试。它所要调试的的模块包括电机、舵机模块调试、编码器模块以及摄像头模块的调试等。对于单片机的学习其实并不需要搞懂寄存器的设置,现在的大部分单片机都有它的库,只需要知道该单片机有哪些资源、怎样使用库等就可以了,当然,如果想要深入了解单片机底层还是有必要去学一下的。说真的,底层不好学,如果没什么时间个人建议不要太深究底层寄存器的配置,切不可花太多时间在学单片机上!!

  1.电机调试

  电机的前期调试非常的简单,只需要知道如何用单片机的FTM模块写个简单的控制代码来控制电机的加减速、正反转以及对电机频率的调整等就行了。

  这里需要看一下K60 库中对FTM 的一些描述,控制电机的PWM 频率是20Khz(不知道是不是最佳,最优频率需要根据电机参数计算的,有些人用的是3khz,其实当初我也没怎么去研究电机频率的选取,只是看了下C车模的电机频率范围),两个电机只需要一种频率,而它们需要4 种不同的占空比,所以控制两个电机只需要一个FTM 模块,一个拥有至少4 个通道输出的FTM 模块,当然,你也可以用不同的FTM的不同通道来控制电机,但是频率要设置成一样,不过大家都不会这样做,因为FTM模块非常宝贵,对于我们的四轮车来说更是如此,像K60FX/FN等芯片的FTM有四个,其中有两个是具备正交解码功能的(正交解码就是可以分辨出旋转方向)可用于智能车的测速,一个用于电机驱动的控制,另一个则用于舵机的控制,这样就刚刚好。但是,对于KL25、KL26或者其它芯片来说FTM资源就不足了,由此还需要用单片机的其他资源来达到目的(资源替代)。

  K60/KL26 的FTM 模块如下(在PORT_cfg.h 中):

  #define TPM_CLKIN0_PIN PTC12 //PTA18、PTB16、PTC12、PTE16、PTE29 PTA18不要用 (与晶振冲突)

  #define TPM_CLKIN1_PIN PTC13 //PTA19、PTB17、PTC13、PTE17、PTE30 PTA19不要用 (与晶振冲突)

  // 模块通道 端口 可选范围 建议

  #define TPM0_CH0_PIN PTD0 //PTE24、PTA3、PTC1、PTD0 PTA3不要用(与SWD冲突)

  #define TPM0_CH1_PIN PTD1 //PTE25、PTA4、PTC2、PTD1

  #define TPM0_CH2_PIN PTD2 //PTE29、PTA5、PTC3、PTD2

  #define TPM0_CH3_PIN PTD3 //PTE30、PTA6、PTC4、PTD3

  #define TPM0_CH4_PIN PTE31 //PTE31、PTA7、PTC8、PTD4

  #define TPM0_CH5_PIN PTE26 //PTE26、PTA0、PTC9、PTD5 PTA0不要用(与SWD冲突)

  //模块通道 端口 可选范围 建议

  #define TPM1_CH0_PIN PTA12 //PTA12、PTB0、PTE20

  #define TPM1_CH1_PIN PTA13 //PTA13、PTB1、PTE21

  //模块通道 端口 可选范围 建议

  #define TPM2_CH0_PIN PTA1 //PTA1、PTB2、PTB18、PTE22

  #define TPM2_CH1_PIN PTA2 //PTA2、PTB3、PTB19、PTE23

  注:此处的TPM是KL26野火库对KL26的FTM的定义(K60的是FTM)

  其中特别注意FTM的使用。

  FTM使用之前必须先对所要使用的FTM的哪个通道进行初始化以及设置所需的精度(所谓的精度将通俗点也就是:例如一个正弦波,它从0 ~ 2pi分成100份,那每一份也就是1%。那正弦波的一半就是50%,但是0 ~ 2pi我也可以分成1000份(每一份就是0.1%,后面以此类推)、10000份等等,分越细就越精确,这就类似于求定积分近似值的矩形法(高等数学上册(理工类·第四版)第221页),FTM的精度同样也是这个道理)。大家最好在一开始就先设置好想要的精度,以免在后来参数调得差不多时觉得精度不够,那样的话,所调的电机参数那些都要重调(舵机的也一样,精度要尽早确定下来)。

  K60/KL26 的FTM 模块的精度设置如下(在MK60_FTM.h / MKL_TPM.h 中):

  #define TPM0_PRECISON 10000u 我当初精度就设为10000 也就是0.01%

  #define TPM1_PRECISON 10000u

  #define TPM2_PRECISON 10000u

  不同的FTM模块可以使用不同的频率,但是同一个FTM的不同通道只能使用一个频率(初始化时设置的频率,该FTM下所有的通道都是使用该频率的。如果知道FTM是如何产生占空比的就知道这是为什么了,这里不对单片机的资源模块寄存器的配置做讲解。其实类似这些的我本不用说的,这样显得啰嗦,但是为了大家早期更容易的上手,减少碰壁的机会,还是强调下好)这里举个KL26的例子:

  void motor_init()

  {

  tpm_pwm_init(TPM0 , TPM_CH0 , 20000 , 0); //初始化 电机 PWM为0

  tpm_pwm_init(TPM0 , TPM_CH1 , 20000 , 0);

  tpm_pwm_init(TPM0 , TPM_CH2 , 20000 , 0);

  tpm_pwm_init(TPM0 , TPM_CH3 , 20000 , 0);

  }

  Void main()

  {

  motor_init();

  While(1)

  {

  tpm_pwm_init(TPM0 , TPM_CH0 , 0); //初始化 电机 PWM为0

  tpm_pwm_init(TPM0 , TPM_CH1 , 50);

  tpm_pwm_init(TPM0 , TPM_CH2 , 50);

  tpm_pwm_init(TPM0 , TPM_CH3 , 0);

  }

  }

  就上面几句的简单的代码就可以使电机转起来啦!!!(这就是使用别人的库的好处,不用自己一一配置芯片的寄存器)。

  我上面是两个通道控制一个电机的,这是要根据你的电机驱动来写的,电机驱动是用一个通道的就用一个,,,,其实我上面的写法就相当于一个通道控制的,可以这样理解,电机占空比为0的就类比于电机驱动板的接地,不为0的占空比就是控制信号就是看成正极,这样电流不就可以流动了嘛,对不对。当然这只是可以这样理解,实际上还是有差别的,大家慢慢摸索就会知道的。

  2.舵机调试

  智能车的制作中,看经验来说,舵机的控制是个关键。相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多。

  首先看一下S3010在周期为20ms时的占空比与角度的关系:

  

 

  舵机的前期调试主要是学会如何使用以及舵机使用的注意事项,下面我就简单的列举几个:

  1.2.1 舵机FTM精度

  舵机的驱动是需要外围的驱动电路驱动的,前面也已经讲过了,舵机也是通过FTM输出方波来使舵机打角的,所以跟电机一样要设置好所要的精度(注意:舵机的精度要高点因为误差大的话打角就不准了,最终影响车速,要早期确定,后面再改就麻烦了,我就设置的是10000,很多人比我的更高)。

  1.2.2 舵机的周期

  C车使用的是S3010舵机,可以根据S3010的数据手册知道S3010频率是50HZ最适宜的也就是20ms为一个周期,其实,舵机的频率选择一般都是50HZ ~ 100HZ之间,但是需要注意的是频率越高,舵机反应是变快了但是力的输出却变小了,所以大家要根据需要权衡一下速度与力。

  1.2.3 舵机的安装与注意事项

  舵机安装之前是需要将舵机调中的,那舵机的占空比怎么算呢?先看个图:

  

 

  野火库是这样计算舵机的占空比的

  可以用一条式子计算:

 

  (当然,有一定的局限性),

 

  注意:占空比与占空比分子是不一样的,如果使用野火库那些的话,只需要传递占空比分子进去即可。

  这里随便举个例子,例如,舵机调中时可用舵机0度时的占空比,根据上图输入脉宽与转角的关系知道舵机0度时对应高电平时间为1.5ms,那么根据上面的来计算就是:

  占空比分子 = (1.5 / 20)* 10000(我设置的周期是20ms,精度是10000) 最后算出为750,这就可以将750这个占空比分子做为舵机的中值,让舵机打到这个角度后再装上舵盘以及舵机的两臂,这就是舵机的调中。

  1) 舵机电压的调节

  S3010舵机一般电压是4.8V ~ 6V之间调节,但是还是允许在7V之下的,但是不能在电池刚充满的情况下调到那么高,以免烧掉(电池充满时高达8.2伏左右),当然,电压提高了,舵机力度也会提升的。

  2) 驱动与芯片要共地

  特别是刚测试时还没有主板,芯片还没插在主板上,只是接出一条信号线去控制舵机,此时最注意就是芯片与多级驱动要共地,假如没有共地的话舵机会乱打角,舵机根本就打不到所设定的那个角度。以此同时,舵机使用一段时间后特别是车撞了多次后有可能会撞坏舵机的齿轮(舵机内部的齿轮),内部齿轮坏后会打角不准确。我就遇过一次,舵机打角后用手再小心转一下舵机它又会打一个小角度,每动一下就会变一下角度,这让我很不解,研究了好久后来才发现原来是里面断齿了,那次真的是浪费了好多时间,希望大家多加注意。

上一篇:物联网可以为我们带来了什么?

下一篇:物联网/大数据技术背景下的MES再思考

延伸阅读