4. 位置与速度检测:旋转变压器与编码器原理、SPI/SSI接口时序、速度计算(M法/T法/MT法)
位置和速度,是电机控制的「眼睛」。没有它们,你的FOC算法再漂亮也是盲人摸象。我在弱磁项目里见过太多因为位置信号抖动导致电流失控的案例,说白了,源头往往不是算法,而是传感器这一关就没过。
这一章我们聚焦三个核心问题:用什么传感器?怎么把数据读回来?怎么算出速度?
4.1 旋转变压器 vs 编码器:选型前的灵魂拷问
先说说两种主流传感器的脾气。你想想看,一个在高温油污的工业现场,一个在追求极致精度的伺服平台,它们的选择逻辑完全不同。
| 特性 | 旋转变压器 | 编码器(增量式/绝对式) |
|---|---|---|
| 原理 | 电磁感应,类似小型变压器 | 光电/磁电,码盘+读数头 |
| 抗环境能力 | 极强(耐高温、振动、油污) | 一般(怕粉尘、油污、振动) |
| 精度 | 中等(12~16位,依赖RDC芯片) | 高(17~23位,甚至更高) |
| 成本 | 较高(本体+RDC解码芯片) | 中低(增量式便宜,绝对式贵) |
| 典型应用 | 电动汽车、军工、重载伺服 | 机器人、数控机床、轻载伺服 |
我个人习惯:做弱磁控制,如果目标转速超过10000rpm,我优先考虑旋变。为什么?因为编码器在高速下容易丢脉冲,而旋变是模拟量输出,没有这个烦恼。当然,代价是解码电路更复杂。
4.2 旋转变压器的工作原理与解码
旋变本质上是一个旋转变压器。它的定子有励磁绕组,转子有两相正交的输出绕组。当你给励磁绕组通入高频正弦波(比如10kHz),转子旋转时,两相输出信号的幅值会随角度变化:
Vsin = Vp * sin(θ) * sin(ωt)
Vcos = Vp * cos(θ) * sin(ωt)
其中θ就是转子角度。解码芯片(比如ADI的AD2S1205、TI的PGA411)会实时跟踪这两个信号,解算出θ和转速。嗯,这里要注意:励磁频率和解码带宽是匹配的,频率越高,带宽越宽,但抗干扰能力会下降。
4.3 编码器:增量式与绝对式
编码器就简单多了。增量式输出A、B、Z三路脉冲,通过相位差判断方向,通过脉冲计数算位置。绝对式则直接输出一个二进制码,代表当前绝对位置。
但增量式有个致命弱点:断电后位置丢失。所以上电必须找零。绝对式就没这个烦恼,但接口通常更复杂——SPI或SSI。
4.4 SPI/SSI接口时序:把数据读回来
不管是旋变的RDC芯片,还是绝对式编码器,它们和MCU通信最常用的就是SPI或SSI。SSI其实是SPI的变种,区别在于:
- SPI:全双工,有MISO/MOSI,时钟由主机提供,片选CS控制。
- SSI:半双工,只有一根数据线(或差分对),时钟由主机提供,数据在时钟上升沿/下降沿输出。
以绝对式编码器常用的SSI协议为例,时序是这样的:
// 伪代码:SSI读取绝对位置
uint32_t ReadSSI(void) {
uint32_t data = 0;
// 拉低时钟,启动传输
CLK_LOW();
delay_us(1);
// 产生N个时钟脉冲(N=位数,比如25位)
for(int i = 0; i < 25; i++) {
CLK_HIGH();
delay_us(0.5);
data <<= 1;
if(DATA_IN == HIGH) data |= 1;
CLK_LOW();
delay_us(0.5);
}
// 等待编码器准备下一帧
delay_us(20);
return data;
}
4.5 速度计算:M法、T法、MT法
位置读回来了,怎么算速度?三种经典方法,各有适用场景。
4.5.1 M法(测频法)
在固定时间T内,统计编码器脉冲数M。速度 = M / (T * 编码器线数)。
- 优点:高速时精度高。
- 缺点:低速时M很小,误差大。
4.5.2 T法(测周法)
测量两个相邻脉冲的时间间隔T。速度 = 1 / (T * 编码器线数)。
- 优点:低速时精度高。
- 缺点:高速时T很小,误差大。
4.5.3 MT法(综合法)
同时测量固定时间T内的脉冲数M,以及最后一个完整脉冲的时间T0。速度 = M / (T0 * 编码器线数)。
- 优点:全速域精度都高。
- 缺点:计算复杂,需要高精度定时器。
| 方法 | 适用速度 | 精度 | 实时性 | 实现难度 |
|---|---|---|---|---|
| M法 | 中高速 | 中 | 高 | 低 |
| T法 | 低速 | 高 | 中 | 低 |
| MT法 | 全速域 | 高 | 中 | 高 |
4.6 知识体系总览
下面这张图把本章的核心逻辑串起来了。从传感器选型,到接口时序,再到速度计算,每一步都有坑,也都有技巧。
4.7 实战建议
最后,给几个我在项目中踩过的坑和总结的经验:
- 滤波不能省:位置信号进来,先做低通滤波。我习惯用一阶IIR,截止频率设在速度环带宽的5~10倍。
- 速度计算要同步:速度环的采样时刻,必须和位置采样对齐。否则会有相位滞后,导致系统振荡。
- 编码器线数不是越高越好:线数高了,脉冲频率也高,MCU的QEP模块可能处理不过来。我一般选1024~4096线,够用就行。
- 旋变的励磁频率要稳定:如果励磁信号有抖动,解码出来的角度也会抖。用晶振或者DDS生成,别用MCU的PWM直接滤波。