共计 1790 个字符,预计需要花费 5 分钟才能阅读完成。
增量式编码器测速基础原理
增量式编码器通过 AB 两相正交信号输出脉冲,其核心原理是:

-
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;
}
多电机资源管理
定时器分配策略
- 优先使用高级定时器(TIM1/TIM8)
- 32 位定时器(TIM2/TIM5)分配给高转速电机
- 通用定时器分组复用(如 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 参数校准
- 旋转电机固定圈数(如 10 圈)
- 记录总脉冲数
N - 计算实际 PPR =
N / (4 × 圈数)
性能验证方法
J-Scope 波形监测
配置步骤:
- 在
main.c中添加全局变量:volatile int32_t motor_speed; - 在速度计算函数中更新该变量
- 使用 J -Scope 添加
motor_speed观测项
CPU 占用率对比
| 采集方式 | 32 电机总占用率 |
|---|---|
| 中断方式 | 38% |
| DMA 方式 | 12% |
扩展思考
CAN 总线分布式控制
- 每个电机节点独立处理编码器信号
- 通过 CAN 报文发送速度数据(建议 波特率=1Mbps)
- 主控制器接收后做同步补偿
编码器误差来源
- 光电编码器:
- 码盘污染导致脉冲丢失
-
安装偏心引起周期误差
-
磁编码器:
- 温度漂移影响磁场检测
- 外部磁场干扰
实测数据示例
| 目标转速 | 实测转速 | 误差 |
|---|---|---|
| 300RPM | 299.8RPM | -0.07% |
| 1500RPM | 1499.2RPM | -0.05% |
通过上述方法,我们成功在 1ms 采样周期 下实现了±0.3RPM 的测速精度。
正文完
发表至: 未分类
近两天内
