位置检测元件:从增量式编码器到磁编码器
做FOC位置环,说白了就是让电机知道「自己转到哪了」。
我刚开始搞这个的时候,总觉得位置检测不就是读个角度嘛,有啥难的?结果第一次调试,电机抖得像筛糠一样。后来才明白——位置检测的精度和实时性,直接决定了你的闭环能不能稳住。
这一章,咱们就把几种主流的位置检测元件掰开揉碎讲清楚。
增量式编码器:ABZ信号与原理
增量式编码器,我个人习惯叫它「增量码盘」。它不告诉你绝对位置,只告诉你「我动了多少」。
工作原理
码盘上刻着密密麻麻的条纹。光透过条纹,被接收器检测到,就产生脉冲。A相和B相相差90度电角度,用来判断方向。Z相每转一圈出一个脉冲,用来找零点。
我举个例子你就明白了:
- A相上升沿,B相是高电平 → 正转
- A相上升沿,B相是低电平 → 反转
- Z相脉冲 → 一圈的参考点
核心参数:
- 分辨率:比如2500线,就是一圈2500个脉冲
- 倍频:4倍频后,2500线变成10000个计数/圈
- 最大响应频率:决定了你能跑多快
ABZ信号怎么用?
我建议你用定时器的编码器模式。STM32的TIM有专门的编码器接口,硬件自动处理A/B相计数,CPU几乎零开销。
// 以STM32为例,配置TIM3为编码器模式
TIM_EncoderInterfaceConfig(TIM3, TIM_ENCODERMODE_TI12, TIM_ICPOLARITY_RISING, TIM_ICPOLARITY_RISING);
TIM_EncoderInterfaceConfig(TIM3, TIM_ENCODERMODE_TI12, TIM_ICPOLARITY_RISING, TIM_ICPOLARITY_RISING);
// 使能定时器
TIM_Cmd(TIM3, ENABLE);
// 读取位置
int16_t position = TIM_GetCounter(TIM3);
我的经验:Z相一定要接!我有个项目没接Z相,每次上电位置都是随机的,电机直接飞车。后来加了Z相归零,世界清净了。
绝对式编码器:多圈数据与单圈角度
绝对式编码器就高级多了。它一上电就知道自己转了多少度,不需要找零点。
单圈 vs 多圈
- 单圈绝对式:只能记录0~360度内的位置。断电后位置丢失?不会,它靠机械码盘记住。
- 多圈绝对式:内部有齿轮或电池,能记录转了多少圈。比如4096圈,每圈4096个位置。
我做过一个机械臂项目,用的就是多圈绝对式编码器。每次上电直接读位置,不用回零,用户体验好很多。
通信协议
绝对式编码器一般走SSI、BiSS、EnDat等协议。我常用SSI,简单可靠:
// SSI读取24位数据示例
uint32_t ReadSSI(void) {
uint32_t data = 0;
for(int i=0; i<24; i++) {
CLK_LOW;
delay_us(1);
data = (data << 1) | MISO_READ;
CLK_HIGH;
delay_us(1);
}
return data;
}
注意:多圈数据有溢出问题。比如4096圈,转超过4096圈后,圈数会回零。我遇到过客户机器连续运行一周,圈数溢出导致位置跳变。解决方案是软件记录圈数,或者用更大范围的多圈编码器。
磁编码器:以AS5048为例
磁编码器是近几年的热门方案。它靠霍尔效应检测磁场角度,没有光学码盘,不怕油污和振动。
AS5048的特点
- 14位分辨率,即0.022度/步
- SPI接口,读取速度快
- 内置自诊断功能
- 工作温度范围宽
我有个项目在高温高湿环境,光学编码器三天两头坏。换成AS5048后,再也没出过问题。
SPI读取示例
// AS5048 SPI读取角度
uint16_t AS5048_ReadAngle(void) {
uint16_t raw = 0;
CS_LOW;
// 发送0xFFFF读取角度寄存器
raw = SPI_ReadWrite(0xFFFF);
CS_HIGH;
// 解析数据,去掉奇偶校验位
raw = raw & 0x3FFF;
// 转换为角度:0~16383对应0~360度
float angle = (float)raw * 360.0f / 16384.0f;
return raw;
}
避坑指南:磁编码器对安装距离很敏感。我曾经把磁铁装得太远,角度读数跳来跳去。后来查手册,发现距离要控制在0.5~1.5mm之间。你想想看,0.1mm的偏差就能让精度掉一个档次。
三种编码器对比
| 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 增量式 | 便宜、简单、高速 | 需回零、怕掉电 | 普通伺服、步进电机 |
| 绝对式 | 上电即用、精度高 | 贵、协议复杂 | 机器人、高端设备 |
| 磁编码器 | 抗污染、体积小 | 精度有限、对安装敏感 | 恶劣环境、低成本方案 |
知识体系图
嗯,到这里你应该对三种编码器心里有数了。我个人建议:
- 做产品原型,先用磁编码器,便宜好调试
- 做高性能伺服,上绝对式编码器
- 做低成本方案,增量式加Z相回零
下一章咱们聊怎么把这些位置信号变成FOC能用的角度值。到时候你会看到,同样的编码器,不同人的代码读出来的角度能差十万八千里。
公众号:蓝海资料掘金营,微信deep3321