共计 1744 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么轮速测量是 AGV 的命门?
在 AGV 开发中,轮速测量就像汽车的里程表,直接影响路径规划的精度。但新手常遇到这些坑:

- 脉冲丢失 :编码器线松动导致计数漏拍,AGV 走着走着就偏离路线
- 信号抖动 :电机启停时产生电磁干扰,速度显示像过山车一样波动
- 累计误差 :长时间运行后,1% 的测量误差可能导致 10cm 的位置偏移
技术对比:四种编码器怎么选?
1. 光电 vs 磁电编码器
- 光电编码器 (200-500 元)
- 优点:分辨率高(可达 5000PPR),响应快
-
缺点:怕灰尘油污,装配要求严苛
-
磁电编码器 (100-300 元)
- 优点:抗污染强,IP67 防护很常见
- 缺点:温度漂移明显(0.1%/℃)
2. 增量式 vs 绝对式
- 增量式 (推荐新手使用)
- 只有 A / B 两相脉冲,需上电归零
-
成本低,STM32 可直接解码
-
绝对式
- 多位数输出(如 SSI 接口)
- 断电记忆位置,但需专用解码芯片
核心实现:STM32 编码器接口实战
硬件连接(以增量式编码器为例)
编码器 A 相 --- PA0(TIM2_CH1)
编码器 B 相 --- PA1(TIM2_CH2)
GND 接电机外壳
代码配置(HAL 库版本)
// 1. 定时器初始化
TIM_Encoder_InitTypeDef encoder_config = {
.EncoderMode = TIM_ENCODERMODE_TI12, // 双相计数
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC1Prescaler = TIM_ICPSC_DIV1,
.IC1Filter = 6, // 滤波 8 个时钟周期
// B 相配置同上...
};
HAL_TIM_Encoder_Init(&htim2, &encoder_config);
// 2. 启动编码器接口
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
// 3. 速度计算(每 100ms 执行)int32_t get_speed_rpm() {
static int32_t last_count = 0;
int32_t current = __HAL_TIM_GET_COUNTER(&htim2);
int32_t delta = (current - last_count) & 0xFFFFFFFF; // 处理 32 位溢出
last_count = current;
// 换算公式:转速 RPM = (Δ 脉冲数 /PPR)/(采样时间秒)*60
return (delta * 60) / (500 * 0.1); // 假设 500PPR,100ms 采样
}
工业实践:抗干扰三板斧
1. 硬件滤波设计
在编码器信号线上并联 100Ω 电阻 +0.1μF 电容(截止频率 16kHz):
A 相 ——●——||—— GND
|
100Ω
2. 布线规范
- 使用双绞屏蔽线(如 CAT5 网线)
- 屏蔽层单端接地(接控制器 GND)
- 远离电机电源线至少 10cm
3. 软件容错
// 异常脉冲检测(A/ B 相应该永远差 90°)if(ABS(current_A_rise_time - current_B_rise_time) > 0.75*ideal_interval) {trigger_error_handler();
}
避坑指南:老司机经验包
1. 溢出处理
STM32 的 16 位计数器在高速时会溢出,两种解决方案:
- 启用 32 位定时器(如 TIM2/TIM5)
- 在中断里手动扩展计数:
volatile uint32_t overflow_count = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == TIM2) overflow_count++;
}
2. 轮径校准
AGV 运行 100 圈后,轮胎磨损会导致实际位移变小。校准方法:
- 让 AGV 直线行走 5 米
- 记录编码器总脉冲数 N
- 新轮径 = (旧轮径 × 实际距离) / (N/PPR × π)
验证环节:示波器诊断法
- 连接探头到 A 相和 GND
- 手动转动轮子,应看到规整的方波
- 启动电机,检查波形是否出现:
- 毛刺(需加强滤波)
- 幅度衰减(检查线阻)
- 相位抖动(检查电源稳定性)
思考题
当 AGV 使用四个带编码器的麦克纳姆轮时,如何保证四个编码器的数据同步采样?欢迎在评论区分享你的方案!
(提示:可以考虑 TIM 的从模式 + 触发信号同步)
正文完
