共计 2330 个字符,预计需要花费 6 分钟才能阅读完成。
ABZ 编码器在工业控制中的应用
ABZ 编码器是工业自动化中常见的转速 / 位置传感器,广泛用于伺服电机控制、CNC 机床、机器人关节等场景。其核心功能是将机械运动转化为电信号,通过 A / B 两相正交脉冲和 Z 相索引信号,实现高精度运动检测。
- 典型应用场景 :
- 伺服电机闭环控制中的速度反馈
- 传送带物料定位
-
机械臂关节角度测量
-
测速重要性 :
- 直接影响运动控制系统的动态响应
- 精度不足会导致定位偏差或速度波动
- 工业场景要求测速误差通常小于 0.1%
技术原理详解
ABZ 信号特征
ABZ 编码器输出三路信号:
- A/ B 相 :相位差 90°的方波(正交信号)
- 旋转方向判断:A 相上升沿时 B 相电平状态
-
每转脉冲数(PPR)决定分辨率
-
Z 相 :每转产生一个索引脉冲
- 用于机械位置清零
- 消除累计误差的关键

(注:此处应为 A / B 相正交波形与 Z 脉冲的位置关系示意图)
测速方法对比
1. 脉冲计数法(M 法)
- 原理 :固定时间内统计脉冲数量
- 优点 :低速时精度高
- 缺点 :高速时可能丢失脉冲
- 适用场景 :转速 <100RPM
2. 周期测量法(T 法)
- 原理 :测量单个脉冲周期时间
- 优点 :高速时分辨率好
- 缺点 :低速时误差显著
- 适用场景 :转速 >1000RPM
(注:展示两种方法在不同转速区间的误差曲线)
STM32 实战代码
TIM 编码器接口配置
// 使用 TIM3 的通道 1 / 2 接编码器 A / B 相
void Encoder_Init(void) {TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 0xFFFF; // 16 位计数器
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
// 编码器模式配置(X4 倍频)sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 6; // 设置数字滤波器 (参考时钟频率配置)
// 类似配置 IC2 参数...
HAL_TIM_Encoder_Init(&htim3, &sConfig);
// 启动编码器接口
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
}
速度计算算法
// 每 100ms 调用一次速度计算
float Get_Speed_RPM(void) {
static uint16_t last_count = 0;
uint16_t current_count = TIM3->CNT;
int16_t delta = (int16_t)(current_count - last_count);
// 考虑计数器溢出情况
if(delta < -30000) delta += 65536;
else if(delta > 30000) delta -= 65536;
last_count = current_count;
// 单位转换公式:// RPM = (Δcount * 60) / (PPR * 4 * 采样时间)
// 假设 PPR=500, 采样时间 =0.1s
return (delta * 60.0f) / (500 * 4 * 0.1f);
}
性能优化策略
转速范围适配
- 低速优化 (<100RPM):
- 增大采样周期(如 500ms)
-
启用 TIM 的输入捕获滤波器(IC1F=0xF)
-
高速优化 (>3000RPM):
- 采用周期测量法
- 使用 TIM 输入捕获直接测量脉冲宽度
中断与 DMA 选型
- 中断方式 :
- 适用于单轴或低频率场景
-
需要优化 ISR 执行时间(<5μs)
-
DMA 方式 :
- 多轴系统首选
- 配置 TIM 触发 DMA 传输计数值
- 推荐使用循环缓冲模式
生产环境避坑指南
信号抖动处理
- 硬件滤波 :
- RC 滤波截止频率计算:
f_c = 1/(2πRC) 建议 f_c > 10 倍最大信号频率 -
典型值:R=1kΩ, C=100nF(截止频率≈1.6kHz)
-
软件滤波 :
- 移动平均滤波(窗口大小 4~8)
- 中值滤波(适用于异常脉冲)
多轴同步采集
- 中断冲突解决 :
- 分配不同优先级(NVIC 分组)
-
关键轴使用抢占优先级
-
时间同步技巧 :
- 使用 TIM 从模式 + 触发输入
- 所有编码器共用同一个时基
计数器溢出预防
- 32 位扩展方案 :
volatile uint32_t total_count = 0; void TIM3_IRQHandler(void) {if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE)) {if(TIM3->CNT > 0x7FFF) total_count += 0x10000; else total_count -= 0x10000; } }
进阶思考题
-
Z 相校准实现 :如何利用 Z 相信号建立机械零点?需要考虑哪些误差因素?
-
高速算法优化 :当转速超过编码器最大响应频率时,有哪些间接测速方法?
-
编码器类型差异 :光电编码器与磁编码器在信号质量上有何区别?对应的处理策略有何不同?
结语
通过本文的实践,我们实现了从 ABZ 编码器信号采集到速度计算的全流程。实际项目中还需要注意电缆屏蔽、电源去耦等工程细节。建议先用信号发生器模拟编码器波形进行系统验证,再接入真实电机测试。对于更高精度的需求,可以考虑使用 Sin/Cos 型编码器配合专用解码芯片的方案。
正文完
