共计 2011 个字符,预计需要花费 6 分钟才能阅读完成。
目录
背景痛点
在工业伺服控制系统中,ABZ 编码器(增量式光电编码器)是位置反馈的核心传感器。其输出包含:

- A/ B 相正交脉冲(Quadrature signals)
- Z 相零位信号(Index signal)
典型问题包括:
- 信号抖动 :机械振动导致边沿抖动,产生±1LSB 误差
- 累计误差 :高速旋转时漏计数造成的角度漂移
- 电气干扰 :长线传输引入的共模噪声
- 温度漂移 :码盘热膨胀导致零位偏移
技术对比
| 方案类型 | 资源占用 | 响应延迟 | 成本 |
|---|---|---|---|
| 硬件解码 (LS7366R) | 需外接芯片 | 0.5μs | $$$ |
| 软件解码 (定时器) | 占用 1 个 TIM | 2-5μs | $ |
工业级应用推荐组合方案:
- 硬件级:施密特触发器整形 + 差分传输
- 软件级:4 倍频计数 + 动态补偿算法
实现细节
正交信号边沿捕获
STM32 配置要点(基于 STM32CubeMX):
- GPIO 设置为浮空输入模式
- 开启 GPIO 端口时钟和复用功能
- 配置定时器 Encoder Mode 为 TI1/TI2 模式
// STM32CubeIDE v1.9.0 配置示例
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
TIM_Encoder_InitTypeDef sConfig = {0};
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
HAL_TIM_Encoder_Init(&htim2, &sConfig);
4 倍频计数实现
利用定时器的正交编码模式实现分辨率提升:
- 定时器时钟预分频设为 1(无分频)
- 自动重装载值设为编码器线数×4
- 开启计数方向检测
/**
* @brief 获取当前角度值 (0-359.99°)
* @param htim: 定时器句柄
* @param lines: 编码器线数 / 转
* @retval 角度值 (浮点数)
* @note 符合 MISRA-C 2012 Rule 8.4
*/
float Get_Encoder_Angle(TIM_HandleTypeDef *htim, uint16_t lines)
{uint16_t cnt = __HAL_TIM_GET_COUNTER(htim);
return (cnt * 360.0f) / (lines * 4);
}
卡尔曼滤波应用
针对抖动问题的离散卡尔曼滤波器实现:
/* 状态变量 */
typedef struct {
float angle; // 估计角度
float bias; // 角速度偏置
float P[2][2]; // 误差协方差矩阵
} KalmanFilter;
void Kalman_Update(KalmanFilter *kf, float new_angle, float dt)
{
// 预测步骤
kf->angle += dt * kf->bias;
kf->P[0][0] += dt * (dt*kf->P[1][1] - kf->P[0][1] - kf->P[1][0]);
// 更新步骤
float y = new_angle - kf->angle;
float S = kf->P[0][0] + R_MEASURE;
float K[2] = {kf->P[0][0]/S, kf->P[1][0]/S};
kf->angle += K[0] * y;
kf->bias += K[1] * y;
}
避坑指南
差分信号布线
- 阻抗匹配:使用 100Ω 终端电阻
- 线距规则:3 倍线宽间距
- 最大长度:RS422 标准建议 <15m
零位校准策略
EEPROM 存储方案:
- 上电时读取基准值
- 检测到 Z 信号时更新校准值
- 采用 CRC16 校验存储数据
抗干扰设计
电源滤波 RC 参数计算:
截止频率公式:f_c = 1/(2πRC)
典型值:R=100Ω, C=100nF → f_c=15.9kHz
验证环节
波形抓取方法
使用 Saleae 逻辑分析仪:
- 采样率设为 10MHz 以上
- 触发模式设置为 A 相上升沿
- 测量 AB 相相位差应为 90°±5°
误差测试数据
| 转速 (RPM) | 无滤波误差 | 卡尔曼滤波误差 |
|---|---|---|
| 100 | ±0.3° | ±0.05° |
| 500 | ±1.2° | ±0.15° |
| 1000 | ±3.5° | ±0.8° |
延伸思考
对于多编码器系统,建议:
- 使用定时器级联技术
- 采用 DMA 传输计数结果
- 设计优先级分组避免中断冲突
实际项目中,我们通过以下措施实现了 8 轴同步采集:
- 将 TIM2/TIM3/TIM4 配置为从模式
- 使用 TIM1 作为主时钟源
- 通过 CAN 总线周期性上传数据
希望这些经验对您的工业控制项目有所帮助!
正文完
