实验室有个项目涉及到多个步进电机以及伺服电机的控制,需要电机得到一个触发信号后精确移动一段距离。
下面以单个伺服电机控制为例,利用伺服电机的指令脉冲加方向位置控制模式实现精确位置控制。
关于伺服电机
所谓指令脉冲+方向控制模式 就是由一路PWM波控制电机转动,一个IO控制电机方向。PWM的占空比控制电机转速,PWM的脉冲数控制电机的转动距离。
计算方法如下:
电机转动一圈所需脉冲数=电机驱动内置编码器线数*4/电子齿轮数
4为编码器对AB相计数模式 若仅对AB相上升沿或者下降沿计数则取2 若对AB相上升沿和下降沿都计数则取4 电子齿轮即为电机驱动对脉冲的细分数,使控制更加精确。
例:
伺服电机编码器为2500线 驱动细分为4:1 则一圈脉冲数=2500*4/4=2500 指令脉冲频率=(需要电机运行的转速 r/min/60)*一圈的脉冲数 此次操作不涉及到电机速度控制 不做介绍
一圈所需脉冲数为2500 则一个脉冲转动1/2500圈 设电机转动一圈移动距离为C,则一个脉冲移动C/2500 所以通过对脉冲计数可以实现非常精确的位置控制。
关于PWM脉冲数精确控制
PWM脉冲数精确控制有以下三种方案:
- 利用延时 在开始发出脉冲的同时开始延时 时长=PWM周期*PWM脉冲数 这是非常土的方法 且弊端显而易见 一是延时使系统的实时性降低 二是精确度不高
- 两个定时器同步,一个发PWM波另外一个计数 即将两个定时器时基参数配置相同且同时开启 定时器在1个period中产生一个PWM脉冲 定时器2在一个period更新时产生一个中断,通过中断使计数变量加一,至设定脉冲数后关闭定时器1。 这个方法可以实现精确的脉冲数量控制,但是需要系统频繁的进入中断,如果需要20个PWM脉冲就要触发20次中断进行计数,如果需要20000个PWM脉冲则要触发20000次中断,太浪费系统资源,并且过于频繁的中断会让系统出现跑飞或者其他一些莫名其妙的错误,只有在数量比较小时才适合这种方法。
- 利用STM32自带的定时器主从模式进行计数 将主定时器的PWM输出脉冲作为从定时器的时钟,同时将从定时器的period设置为所需脉冲数,当从定时器产生溢出中断时则表示到达了所需脉冲数,即可在中断中关闭主定时器的PWM输出,达到精确的位移控制的目的。这种方法只需要触发一次中断,并且计数非常精确。
权衡利弊,本次使用了方法三,需要两个定时器资源,主控为STM32F103ZET6,选用TIM3的CH2作为PWM输出通道即主定时器为TIM3,从定时器选用TIM4。