共计 2033 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要正交编码器?
在直流伺服电机控制系统中,我们经常需要实时获取电机的转速和位置信息。想象一下工业机械臂的关节控制:如果不知道当前电机轴转到了什么角度,就像蒙着眼睛走路一样危险。编码器就是电机的 ” 眼睛 ”,而 1024 线正交编码器凭借其高分辨率和抗干扰能力,成为运动控制领域的标配传感器。

编码器类型选择指南
- 绝对式编码器 :直接输出轴位置绝对值,断电不丢失信息,但成本较高
- 增量式编码器 :通过脉冲计数计算相对位移,性价比高但需要参考点
1024 线意味着编码器转一圈会产生 1024 个脉冲周期,配合 4 倍频技术可实现 4096 个计数点 / 圈的分辨率(约 0.088 度),这对需要精确定位的 CNC 机床、3D 打印机等设备至关重要。
正交信号解码原理
典型 A / B 相输出波形如下:
A 相 __|¯¯|____|¯¯|____|¯¯|__
B 相 ¯¯|__|¯¯¯|__|¯¯¯|__|¯¯
↑ 正转 ↑ 反转
- 正转时 A 相领先 B 相 90 度
- 反转时 B 相领先 A 相 90 度
- 每个边沿变化都携带位置信息
STM32 硬件接口配置
使用 TIM2 定时器的编码器接口模式,关键配置代码如下:
// 初始化结构体
TIM_Encoder_InitTypeDef encoderConfig = {
.EncoderMode = TIM_ENCODERMODE_TI12, // 双通道模式
.IC1Polarity = TIM_ICPOLARITY_RISING, // A 相上升沿触发
.IC1Selection = TIM_ICSELECTION_DIRECTTI,
.IC1Prescaler = TIM_ICPSC_DIV1, // 无分频
.IC1Filter = 6, // 8 个时钟周期滤波
// B 相同样配置...
};
HAL_TIM_Encoder_Init(&htim2, &encoderConfig);
// 启动编码器接口
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
通过配置 TIMx_SMCR 寄存器的 SMS[2:0] 位为 011(编码器模式 3),定时器会自动根据 A / B 相边沿变化更新 CNT 计数器。
信号处理实战技巧
消抖处理
#define FILTER_WINDOW 4
int32_t filtered_count = 0;
int16_t history[FILTER_WINDOW];
void UpdatePosition() {
// 滑动窗口滤波
static uint8_t idx = 0;
history[idx++] = __HAL_TIM_GET_COUNTER(&htim2);
if(idx >= FILTER_WINDOW) idx = 0;
// 中值滤波
filtered_count = median_filter(history, FILTER_WINDOW);
}
4 倍频实现
硬件自动完成 4 倍频的原理:
- A 相上升沿 + B 相低电平 → 计数 +1
- B 相上升沿 + A 相高电平 → 计数 +1
- A 相下降沿 + B 相高电平 → 计数 +1
- B 相下降沿 + A 相低电平 → 计数 +1
抗干扰设计要点
- 双绞线传输:A/ B 相使用双绞线对,Z 相单独屏蔽
- 终端匹配:在编码器端并联 120Ω 电阻
- 电源滤波:0.1μF 陶瓷电容靠近编码器接口放置
- 接地策略:采用单点接地,避免地环路干扰
实战挑战:位置闭环控制
基于 PID 算法实现位置跟踪:
void PositionPID_Update(int32_t target, int32_t current) {
static int32_t last_error = 0;
static int32_t integral = 0;
int32_t error = target - current;
integral += error;
// 抗积分饱和
integral = constrain(integral, -INTEGRAL_LIMIT, INTEGRAL_LIMIT);
int32_t derivative = error - last_error;
last_error = error;
// 计算 PID 输出
int32_t output = KP * error + KI * integral + KD * derivative;
// 驱动电机
Set_Motor_PWM(output);
}
通过实时读取编码器计数值作为反馈,配合 PID 控制算法,即可构建完整的位置闭环系统。建议先用示波器观察阶跃响应,逐步调整 PID 参数直到获得理想的动态性能。
性能优化对比
测试条件:STM32F407@168MHz,1000rpm 转速
| 解码方式 | CPU 占用率 | 最大跟踪转速 |
|---|---|---|
| 硬件解码 | <1% | 15000rpm |
| 软件中断解码 | 15%~20% | 3000rpm |
硬件解码方案明显更高效,这也是推荐使用定时器编码器接口的主要原因。
经验总结
- 安装精度直接影响测量结果,确保编码器与轴同心
- 超过 5 米传输距离建议改用 RS422 差分接口
- 定期检查编码器连接器接触电阻
- 零位校准建议采用机械硬限位 + Z 相信号组合方式
通过本指南的实践,你应该已经掌握了 1024 线正交编码器的核心应用技术。接下来可以尝试拓展应用场景,比如多轴同步控制或者结合 CAN 总线实现分布式运动控制网络。
正文完
发表至: 未分类
近一天内
