32电机编码器测速代码实现与优化:从基础原理到高精度控制

1次阅读
没有评论

共计 1790 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

增量式编码器测速基础原理

增量式编码器通过 AB 两相正交信号输出脉冲,其核心原理是:

32 电机编码器测速代码实现与优化:从基础原理到高精度控制

  • AB 相计数:A 相和 B 相脉冲相位差 90°,通过判断两相信号的边沿变化顺序(A 领先 B 或 B 领先 A)可确定转向。每转输出的脉冲数(PPR)决定分辨率。

  • 四倍频技术:在 AB 相的上升沿和下降沿均触发计数,将原始分辨率提高 4 倍。例如,500PPR 编码器实际可获得 2000 个计数 / 转。

M 法与 T 法测速对比

M 法(频率测量)

公式:速度 = (脉冲数 × 60) / (PPR × 采样时间)

  • 适用于高速场景(>100RPM)
  • 采样时间固定,速度越低误差越大

T 法(周期测量)

公式:速度 = 60 / (脉冲周期 × PPR)

  • 适用于低速场景(<100RPM)
  • 通过测量单个脉冲周期计算速度

STM32 硬件实现方案

定时器编码器模式配置

// TIM3 编码器接口初始化(HAL 库)TIM_Encoder_InitTypeDef encoder_config = {
  .EncoderMode = TIM_ENCODERMODE_TI12,  // AB 相均计数
  .IC1Polarity = TIM_ICPOLARITY_RISING,  
  .IC2Polarity = TIM_ICPOLARITY_RISING,
  .IC1Filter = 6,  // ** 滤波系数 **=6
  .IC2Filter = 6
};
HAL_TIM_Encoder_Init(&htim3, &encoder_config);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);

带滤波的速度计算函数

#define FILTER_WINDOW 5  // 滑动平均窗口大小

int32_t get_speed_rpm(TIM_HandleTypeDef *htim, uint16_t ppr) {static int32_t history[FILTER_WINDOW] = {0};
  static uint8_t idx = 0;

  int32_t current_cnt = (int16_t)__HAL_TIM_GET_COUNTER(htim);  // 处理溢出
  __HAL_TIM_SET_COUNTER(htim, 0);

  // M 法计算瞬时速度(** 采样周期 **=10ms)history[idx] = (current_cnt * 60 * 100) / (ppr * 4 * 10);
  idx = (idx + 1) % FILTER_WINDOW;

  // 滑动平均滤波
  int32_t sum = 0;
  for(uint8_t i=0; i<FILTER_WINDOW; i++) {sum += history[i];
  }
  return sum / FILTER_WINDOW;
}

多电机资源管理

定时器分配策略

  1. 优先使用高级定时器(TIM1/TIM8)
  2. 32 位定时器(TIM2/TIM5)分配给高转速电机
  3. 通用定时器分组复用(如 TIM3+TIM4 同组)

FreeRTOS 任务设计

// 电机任务优先级分配(数值越大优先级越高)#define TASK_CTRL_PRIO   (osPriorityHigh)
#define TASK_COMM_PRIO   (osPriorityNormal)
#define TASK_MONITOR_PRIO (osPriorityLow)

常见问题解决方案

脉冲丢失处理

  • 在电机启停阶段切换为 T 法测量
  • 添加加速度限制(如 最大加速度=500RPM/s)

多电机时序冲突

  • 使用 TIM 定时触发 ADC 采样(硬件同步)
  • 为每个电机分配独立的 DMA 通道

PPR 参数校准

  1. 旋转电机固定圈数(如 10 圈)
  2. 记录总脉冲数N
  3. 计算实际 PPR = N / (4 × 圈数)

性能验证方法

J-Scope 波形监测

配置步骤:

  1. main.c 中添加全局变量:volatile int32_t motor_speed;
  2. 在速度计算函数中更新该变量
  3. 使用 J -Scope 添加 motor_speed 观测项

CPU 占用率对比

采集方式 32 电机总占用率
中断方式 38%
DMA 方式 12%

扩展思考

CAN 总线分布式控制

  1. 每个电机节点独立处理编码器信号
  2. 通过 CAN 报文发送速度数据(建议 波特率=1Mbps)
  3. 主控制器接收后做同步补偿

编码器误差来源

  • 光电编码器
  • 码盘污染导致脉冲丢失
  • 安装偏心引起周期误差

  • 磁编码器

  • 温度漂移影响磁场检测
  • 外部磁场干扰

实测数据示例

目标转速 实测转速 误差
300RPM 299.8RPM -0.07%
1500RPM 1499.2RPM -0.05%

通过上述方法,我们成功在 1ms 采样周期 下实现了±0.3RPM 的测速精度。

正文完
 0
评论(没有评论)