乐于分享
好东西不私藏

05:运动控制--软件增量编码器

05:运动控制--软件增量编码器
  • 1) 方向定义
  • 2) 功能函数
  • 3) 功能说明
  • 4) 测试结果
5134328a5a632fcdc711ae1f59e75ffb

常用的编码器有绝对值编码器和增量编码器,那么什么是软件增量编码器呢?

对于步进电机举例,在不考虑电机失步的情况下,外部接硬件增量编码器,那么定时器每输出M个PWM,那么步进电机转动一定角度,硬件增量编码器输出N个PWM波形,那么定时器输出的M个数与硬件增量编码器输出的N个数就是一一对应的。不同的电机驱动器细分或硬件增量编码器,比值可能不同,一旦硬件确定,那么M/N比值就确定了。

那么即使在没有硬件增量编码器的情况下,只要知道输出了多少波形,就可以知道对应编码器输出多少波形,也就知道了转动角度位置。输出波形的个数,对应转动角度位置,这就是软件增量编码器的原理。

该数据仅为PWM个数统计,对于实际的距离或角度,应用层需要根据实际结构进行转换。

所以对于定时器输出PWM的个数统计和方向,就是软件增量编码器。

1) 方向定义

  • 定义电机旋转方向:以面向电机轴的视角,顺时针为正转,逆时针为反转。

  • 定义方向IO 低电平为:顺时针为正转;高电平为:逆时针为反转

  • 定义 CW IO脉冲:顺时针为正转;CCW IO脉冲:逆时针为反转

  • +X+Y+Z 轴方向,表示 顺时针为正转;-X-Y-Z 轴方向,表示 逆时针为反转

  • 定义软件增量编码器个数:正数:顺时针为正转;负数:逆时针为反转。0:表示原点

2) 功能函数

使用s32类型数据表示软件增量编码器个数,其中

get:获取当前数值

init:归零时设置零点值,

set:设置累加值,仅driver层使用。

s32 mt_motor_real_coordinate_get(E_MOTOR index){    mt_assert(index < MOTOR_MAX,0);return motor_pwm[index].pwm_coordinate;}void mt_motor_coordinate_init(E_MOTOR index){    mt_assert(index < MOTOR_MAX); motor_pwm[index].pwm_coordinate = 0;//此时位置为坐标原点}static inline void mt_motor_coordinate_set(E_MOTOR index,s32 num){ motor_pwm[index].pwm_coordinate += num;}

3) 功能说明

软件增量编码器,理论上,如果在不是失步的情况下,等于硬件编码器。在一定情况下,替代硬件增量编码器。

8轴运动控制器,每路都有一个的软件增量编码器,该软件增量编码器适用于所有的运动情况,T型曲线,S型曲线,直线插补,圆弧插补,空间插补。

软件增量编码器,难点在于插补,限位停止时,单双脉冲模式的数据计算。

4) 测试结果

测试条件:1/3/5/7轴单脉冲模式;2/4/6/8轴双脉冲模式;

  • 1轴:正转,速度50000Hz,输出个数4123456。
  • 2轴:反转,速度50000Hz,输出个数4123456。
  • 3轴:正转,T型曲线,速度50000Hz,加速时间1000ms,输出个数4123456.
  • 4轴:反转,S型曲线,速度50000Hz,加速时间1000ms,输出个数4123456.
  • 5/6轴:直线插补,速度50000Hz,终点坐标(4123456, 4123456>>2)
  • 7/8轴:圆弧插补,速度50000Hz,起点坐标(4123456>>2, 0)终点坐标( 4123456>>2, 0),顺时针旋转。

软件增量编码器 数值 通过串口通讯打印出。32位最高位表示正负,其余表示大小,十进制。

7/8轴 为0 ,因为画一个正圆后,坐标回到原点。

image