第三章 旋变与编码器调试:旋变解码芯片配置、初始角度的自动与手动校准、编码器零位对齐
好,咱们进入第三个核心章节。旋变和编码器,说白了就是电机的「眼睛」。眼睛要是没校准,你给再大的电流、再好的算法,电机也跑不顺。我刚开始做伺服驱动那会儿,就吃过这个亏——电机嗡嗡响,力矩抖得跟筛糠似的,折腾了两天,最后发现是旋变初始角度偏了3度。嗯,从那以后,我再也不敢轻视这个环节。
3.1 旋变解码芯片配置
旋变输出的是模拟信号,咱们的MCU不认识。中间需要一颗解码芯片,比如ADI的AD2S1200、TI的PGA411,或者国产的某些替代型号。我个人习惯用AD2S1200,皮实,抗干扰能力不错。
配置解码芯片,核心就三件事:
- 激励频率设定:旋变需要激励信号,通常是10kHz左右的正弦波。芯片内部有DDS,你通过SPI写寄存器,设好频率和幅值。我建议激励频率选10kHz,太高了线缆衰减大,太低了响应慢。
- 分辨率与跟踪速率:AD2S1200支持10位、12位、14位、16位分辨率。分辨率越高,角度数据越精细,但跟踪速率会下降。做高速电机(比如1万转以上),我一般用12位;做低速高精度的,用14位或16位。
- 故障检测配置:芯片会检测信号丢失、过速、正弦/余弦失配等故障。我建议把故障中断打开,一旦旋变线断了,立刻让电机停机。我在项目里遇到过线缆被老鼠咬断的情况,幸亏故障检测及时,没烧驱动器。
关键寄存器配置示例(AD2S1200):
// 配置激励频率为10kHz,分辨率12位
SPI_Write(0x00, 0x7E); // 控制寄存器:激励频率=10kHz,分辨率=12位
SPI_Write(0x01, 0x20); // 故障配置:使能LOS、DOS、LOT中断
我的小技巧: 上电后先读一下芯片的状态寄存器,确认旋变信号幅值在正常范围内(通常2V±0.5V)。如果幅值偏低,检查激励电压或线缆屏蔽层是否接地。
3.2 初始角度的自动与手动校准
旋变安装到电机上,它的零位和电机的电气零位之间,有一个固定的偏差角。这个偏差必须校准掉,否则你给Id=0控制,实际会有Id分量,电机发热、效率低。
校准方法分两种:自动和手动。
3.2.1 自动校准
现在很多驱动器支持一键自动校准。原理很简单:给电机一个固定的电流矢量,让转子转到某个位置,然后读取旋变角度,记下来。再给一个反向电流矢量,转子转到对称位置,再读一次。两次取平均,就能算出偏差。
我常用的自动校准流程:
- 给电机通一个直流电流(比如额定电流的30%),方向为A相正、B相负、C相悬空。转子会锁在一个固定位置。
- 读取旋变角度θ1。
- 改变电流方向(A相负、B相正),转子转到对称位置。
- 读取旋变角度θ2。
- 计算偏差角 = (θ1 + θ2) / 2。
自动校准代码片段:
// 自动校准初始角度
float CalibrateOffset() {
SetCurrentVector(0.3, 0); // Id=0.3pu, Iq=0
delay_ms(500); // 等待转子稳定
float theta1 = ReadResolverAngle();
SetCurrentVector(-0.3, 0); // 反向电流
delay_ms(500);
float theta2 = ReadResolverAngle();
float offset = (theta1 + theta2) / 2.0f;
if (offset > 180.0f) offset -= 360.0f; // 归一化到[-180,180]
return offset;
}
注意: 自动校准的前提是电机能自由转动。如果电机带负载或者抱闸没松开,转子转不动,校准结果就是错的。我曾经遇到过现场工程师没松开抱闸就做校准,结果偏差角差了90度,电机一启动就飞车。
3.2.2 手动校准
自动校准虽然方便,但有些场合不适用。比如电机带了大惯量负载,转子转不动。这时候就得手动校准。
手动校准的核心思路:用示波器看反电动势波形,和旋变输出波形对比。
具体步骤:
- 把电机轴用外力(比如手摇)转到某个位置。
- 用示波器探头夹在电机UV两相之间,看反电动势波形。
- 同时用示波器另一通道看旋变的余弦输出(或正弦输出)。
- 调整旋变安装角度,或者软件里加偏移量,让反电动势过零点与旋变余弦信号的峰值对齐。
嗯,这个方法比较费时,但很可靠。我当年在实验室调一个定制电机,旋变安装座有加工误差,自动校准总是偏2度,最后用手动校准才搞定。
3.3 编码器零位对齐
编码器和旋变不同,它输出的是数字脉冲或绝对值数据。但零位对齐的原理是一样的——找到编码器零位和电机电气零位的对应关系。
对于增量式编码器,有个Z信号(零位脉冲)。每转一圈,Z信号出现一次。我们需要让Z信号出现的时刻,正好对应电机A相反电动势的过零点。
对齐方法:
- 方法一:用直流定位法。给电机通直流电,让转子锁在固定位置。然后手动转动编码器外壳(或者调整编码器安装角度),直到Z信号刚好出现。这个方法简单,但精度取决于你的手稳不稳。
- 方法二:软件对齐法。先不管机械安装,上电后让电机转一圈,记录下Z信号出现时的编码器计数值。然后把这个计数值作为零位偏移,存到EEPROM里。每次上电后,读取这个偏移值,在角度计算中补偿。
软件对齐法代码示例:
// 编码器零位对齐
uint32_t encoder_offset = 0;
void CalibrateEncoderZero() {
// 让电机匀速转一圈
RunMotorAtSpeed(100); // 100rpm
delay_ms(600); // 等待转完一圈
// 记录Z信号出现时的编码器值
while(!Z_Signal_Detected());
encoder_offset = GetEncoderCount();
// 保存到EEPROM
EEPROM_Write(0x00, encoder_offset);
}
float GetElectricalAngle() {
uint32_t raw = GetEncoderCount();
uint32_t adjusted = (raw - encoder_offset + ENCODER_RESOLUTION) % ENCODER_RESOLUTION;
return (float)adjusted / ENCODER_RESOLUTION * 360.0f;
}
避坑指南: 我曾经遇到过编码器Z信号抖动的问题,每次上电读到的零位都不一样。后来发现是编码器安装间隙太大,导致Z信号触发点有机械游移。解决办法是加一个软件滤波——连续读10次Z信号位置,取平均值。
3.4 调试中的常见问题与对策
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 电机低速抖动 | 初始角度偏差 > 5度 | 重新校准,用示波器验证 |
| 电机高速失步 | 旋变跟踪速率不够 | 降低分辨率,提高跟踪速率 |
| 编码器读数跳变 | 信号线干扰或接触不良 | 检查屏蔽层,加磁环,用差分信号 |
| 旋变故障报警 | 激励信号幅值异常 | 测量激励电压,检查线缆是否破损 |
最后说一句:旋变和编码器的调试,急不得。我见过太多工程师上来就调电流环,结果角度没校准,调了半天电流环也稳不住。先把眼睛擦亮,后面的路才好走。下一章咱们聊电流环调试,那才是真正见功夫的地方。