2. 标定基础概念:零位偏移、增益误差、非线性误差、正交误差
好,咱们正式开始聊标定。说实话,很多做电机控制的工程师,一上来就急着调PID参数,结果电机转起来抖得像筛子一样。我见过太多这种情况了。其实问题往往不在控制算法本身,而是角度传感器根本没标定好。
今天这节,咱们就把标定里最核心的四个概念掰扯清楚。零位偏移、增益误差、非线性误差、正交误差。这四个家伙,是角度传感器所有误差的根源。搞懂了它们,你调电机的时候心里就有底了。
2.1 零位偏移(Offset Error)
先说说最简单的——零位偏移。说白了,就是传感器在0度位置,读出来的数不是0。
举个例子。你用手把电机轴转到物理0度位置,理论上传感器应该输出0。但实际一读,可能是2.3度,也可能是-1.5度。这个固定的偏差,就是零位偏移。
为什么会这样?原因很多。传感器安装的时候没对准,磁铁贴歪了,或者芯片内部电路有直流偏置。我在一个扫地机器人项目里遇到过,换了一批传感器,零位偏移从0.5度直接跳到了3度。查了半天,发现是磁铁充磁不均匀。
关键点:零位偏移是一个常数,不随角度变化。它只影响绝对角度,不影响角度变化量。
怎么处理?简单。标定的时候,记下这个偏移值,然后在软件里减掉就行。
// 零位补偿示例
float raw_angle = read_sensor();
float offset = 2.3f; // 标定得到的零位偏移
float calibrated_angle = raw_angle - offset;
嗯,这里要注意:零位偏移的标定,最好在系统上电后做一次。因为温度变化会引起偏移漂移。我习惯在电机启动前,先让传感器静止几秒钟,采集100个样本取平均,作为当前的零位偏移。
2.2 增益误差(Gain Error)
增益误差,也叫灵敏度误差。你想想看,理想情况下,传感器转一圈,输出应该从0变到360度。但实际呢?可能只变了350度,或者变了370度。
这个比例偏差,就是增益误差。它表现为传感器输出曲线的斜率偏离了理想值。
我做过一个伺服驱动器项目,用的磁编码器。标定时发现,电机转一圈,传感器读数只增加了355度。少了5度!这意味着每转1度,实际误差会累积0.014度。转100圈,误差就累积到1.4度了。对于高精度位置控制来说,这完全不能接受。
| 误差类型 | 表现形式 | 典型原因 |
|---|---|---|
| 零位偏移 | 固定偏差 | 安装偏差、电路偏置 |
| 增益误差 | 斜率偏差 | 磁铁强度、气隙变化 |
增益误差的补偿也很直接。标定时,让电机转一整圈,记录实际角度变化量,然后算一个比例系数。
// 增益补偿示例
float raw_angle = read_sensor();
float offset = 2.3f;
float gain = 360.0f / 355.0f; // 理想范围 / 实际范围
float calibrated_angle = (raw_angle - offset) * gain;
小技巧:我建议标定增益误差时,让电机正反转各转几圈取平均。这样可以消除机械回程差的影响。
2.3 非线性误差(Nonlinearity Error)
这个就有点意思了。零位偏移和增益误差都是线性误差,补偿起来很简单。但非线性误差,它不按套路出牌。
非线性误差,指的是传感器输出曲线偏离理想直线的程度。它不是固定的,也不是成比例的,而是在不同角度位置,误差大小不一样。
举个例子。在0度位置,误差可能是0.1度。到了90度位置,误差变成了0.8度。到了180度,又变成了0.3度。你没法用一个简单的加减乘除去补偿它。
为什么会这样?传感器芯片本身的非线性、磁铁形状不完美、安装时的机械变形,都会导致非线性误差。我记得有一次调试一个工业机器人关节,电机在低速运行时,力矩波动特别大。查了半天,发现是磁编码器在45度和135度附近有较大的非线性误差,导致电流环反馈不准。
警告:非线性误差是导致电机低速抖动和转矩脉动的主要元凶之一。如果你的电机在低速运行时声音不对,先检查非线性误差。
怎么处理非线性误差?常用的方法有两种:
- 查表法:在多个角度位置标定误差值,建立查找表。运行时根据当前角度查表修正。
- 多项式拟合:用多项式函数拟合误差曲线,运行时计算修正值。
我个人更推荐查表法。虽然占用一点存储空间,但精度高,而且调试起来直观。你想想看,用多项式拟合,万一阶数选错了,反而会引入新的误差。
// 查表法非线性补偿示例
float lookup_table[360]; // 每个角度对应的误差补偿值
float raw_angle = read_sensor();
int index = (int)(raw_angle + 0.5f) % 360;
float compensation = lookup_table[index];
float calibrated_angle = raw_angle + compensation;
2.4 正交误差(Quadrature Error)
最后这个,是专门针对正余弦编码器和旋转变压器的。对于只输出绝对角度的数字传感器,可以跳过这节。但如果你用的是模拟输出的传感器,正交误差你必须搞懂。
正余弦传感器输出两路信号:sin和cos。理想情况下,这两路信号相位差正好是90度。但实际中,由于制造工艺或安装偏差,这个相位差可能不是精确的90度。这个偏差,就是正交误差。
正交误差会导致什么后果?你算出来的角度会带有周期性误差。而且这个误差在45度、135度、225度、315度这些位置特别明显。
我曾经调试过一个电动助力转向系统,用的就是正余弦编码器。方向盘在中间位置附近时,手感特别奇怪,有轻微的卡顿感。排查了很久,最后发现是编码器的正交误差达到了3度。补偿掉之后,手感立马就顺滑了。
正交误差的补偿公式稍微复杂一点:
// 正交误差补偿
// sin_raw, cos_raw 是原始信号
// alpha 是正交误差角度
float sin_comp = sin_raw;
float cos_comp = (cos_raw - sin_raw * sin(alpha)) / cos(alpha);
float angle = atan2(sin_comp, cos_comp);
核心思路:正交误差补偿的本质,是把不正交的两路信号,通过数学变换,还原成正交的信号。然后再用atan2计算角度。
标定正交误差的方法,我建议用最小二乘法。让电机匀速转几圈,采集sin和cos的数据,然后拟合出正交误差角。这个方法在工程上很成熟,精度也够用。
小结
好了,四个基础概念讲完了。咱们捋一捋:
- 零位偏移:固定偏差,减掉就行
- 增益误差:比例偏差,乘个系数
- 非线性误差:位置相关的偏差,查表或拟合
- 正交误差:正余弦信号相位偏差,数学变换补偿
实际项目中,这四个误差往往是同时存在的。我建议的标定顺序是:先补偿零位偏移和增益误差,再处理非线性误差,最后处理正交误差(如果有的话)。一步一步来,别想着一步到位。
下一节,咱们会聊具体的标定流程和工具。到时候我会拿一个实际项目案例,手把手带你走一遍完整的标定过程。嗯,敬请期待。