共计 1292 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
370 电机编码器是小型直流电机常用的位置反馈装置,在机器人关节、云台控制、传送带定位等场景中至关重要。它像电机的 ” 眼睛 ”,实时告诉控制系统:电机轴转了多少角度、转速多快、朝哪个方向转。没有它,电机就像蒙眼走路,容易出现失步或定位不准。

技术原理:增量式编码器三兄弟
增量式编码器通过 ABZ 三相输出信号:
- A 相和 B 相 :两路脉冲信号,相位差 90 度。正转时 A 相比 B 相超前,反转时 B 相超前
- Z 相(零位信号):每转一圈输出一个脉冲,用于绝对位置校准
实际使用时,通过统计 A 相脉冲数知道转动距离,通过 AB 相顺序判断方向,Z 相用来消除累计误差。
硬件连接:给信号穿上 ” 防弹衣 ”
典型的接口电路需要三个关键设计(示意图描述):
- 上拉电阻 :通常 4.7kΩ,确保信号线默认高电平
- RC 低通滤波 :100Ω 电阻 +0.1μF 电容组合,滤除高频干扰
- 施密特触发器 :如 74HC14 芯片,对信号整形
连接示例:
编码器 单片机
A 相 ----> PA0(TIM2_CH1)B 相 ----> PA1(TIM2_CH2)Z 相 ----> PC13(外部中断)GND ---- 共地
软件配置:STM32 的编码器模式
使用 HAL 库快速配置 TIM2 为编码器模式:
// 初始化结构体
TIM_Encoder_InitTypeDef encoder = {
.EncoderMode = TIM_ENCODERMODE_TI12, // AB 相都计数
.IC1Polarity = TIM_ICPOLARITY_RISING,
.IC2Polarity = TIM_ICPOLARITY_RISING,
.IC1Filter = 6, // 滤波系数
.IC2Filter = 6
};
// 启动编码器接口
HAL_TIM_Encoder_Init(&htim2, &encoder);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
数据处理:从脉冲到实用信息
转速计算(伪代码):
每 100ms 执行:当前计数 = TIM2->CNT
脉冲数 = (当前计数 - 上次计数) & 0xFFFF // 处理溢出
转速 RPM = (脉冲数 * 600) / (编码器线数 * 0.1)
上次计数 = 当前计数
方向判断:
检查 TIM2->CR1 寄存器的 DIR 位,0 表示正转,1 表示反转
新手避坑指南
- 信号毛刺 :软件去抖可采用连续采样 3 次一致才确认有效
- 计数溢出 :32 位变量累加计数值,而不是直接使用 16 位 CNT
- 线数混淆 :确认编码器真实线数(如 13 线电机实际输出 52 脉冲 / 转)
- 电源干扰 :电机与编码器电源建议用磁珠隔离
性能优化技巧
测试数据表明:
– 500Hz 采样率适合低速场景(<100RPM)
– 1kHz 采样率平衡精度与资源消耗
– 10kHz 以上可能引入噪声,需加强滤波
进阶思考
- 如何利用 Z 相信号实现多圈绝对位置记录?
- 当电机转速超过编码器最大响应频率时,有哪些替代方案?
- 在电池供电场景下,如何降低编码器电路的功耗?
实践体会
第一次调试时,我的电机转速显示总是跳变,后来发现是电源地线没有接好。用示波器看原始信号才发现有 200mV 的震荡。这个小教训让我明白:硬件电路的基础可靠性永远比软件算法更重要。现在每次接新编码器,我都会先测波形再写代码,效率反而更高。
正文完
发表至: 未分类
近两天内
