2. 静态校准法:基于直流定位的零位标定技术

静态校准,说白了就是给电机通个直流电,让它自己跑到一个固定的电气位置,然后我们把这个位置记下来,当作零位。这个方法听起来简单,但里面门道不少。我最早接触这个技术是在一个伺服驱动器项目上,当时觉得不就是给个电流嘛,能有多复杂?结果第一次实验就发现电机抖得跟筛子似的……嗯,后来才明白,细节都在电流控制和判断逻辑里。

2.1 基本原理

永磁同步电机的转子自带磁性。如果我们给定子通一个固定的直流电流,就会产生一个静止的磁场。这个磁场会拉着转子转到某个特定角度——也就是定子磁场的方向。这时候,转子的位置就和电流角度对应起来了。

具体来说,我们给电机施加一个固定的电流矢量,比如让 Id = 0,Iq = Iref。这时候定子磁场方向就是 q 轴方向。转子会被拉过去,最终停在 q 轴方向上。这时候编码器读到的角度,就是零位偏差。

核心公式:

θoffset = θencoder - θelectrical

其中 θelectrical 就是我们施加的电流角度。如果施加的是 q 轴电流,θelectrical = 90°(电角度)。

2.2 操作步骤

我习惯把静态校准分成五个步骤。每一步都有坑,我一个个说。

  1. 预定位:先给电机通一个较小的电流(比如额定电流的 20%),让转子初步对齐。这一步是为了避免一开始电流太大导致转子猛转,撞到机械限位。
  2. 正式定位:把电流加到额定值(或者你设定的标定电流),保持一段时间。我一般保持 2-3 秒,确保转子完全稳定。
  3. 角度读取:在电流稳定的最后时刻,读取编码器角度值。注意要多次读取取平均,避免单次采样噪声。
  4. 重复验证:换个方向再通一次电流(比如通负 q 轴电流),看两次读到的角度差是不是 180°。如果不是,说明有问题。
  5. 写入存储:把计算出的偏差值写入 EEPROM 或 Flash,下次上电直接加载。

我的经验:预定位电流不要太小,否则摩擦力大的电机可能转不动。我遇到过一台带减速器的电机,20% 电流根本拉不动,后来加到 40% 才动起来。这个值要根据实际负载情况调整。

2.3 电流选择策略

电流选多大?这是个好问题。选小了拉不动,选大了可能烧电机。我整理了一个参考表:

电机类型 标定电流(%额定) 保持时间(s) 注意事项
小功率伺服(< 200W) 30% - 50% 1 - 2 注意散热,连续多次标定可能过热
中功率伺服(200W - 2kW) 20% - 30% 2 - 3 确保转子能自由转动
大功率伺服(> 2kW) 10% - 20% 3 - 5 必须考虑机械限位和制动器
带减速器电机 40% - 60% 3 - 5 减速比越大,需要的电流越大

你可能会问:为什么不直接用额定电流?因为有些电机长时间通额定电流会发热,尤其是静止状态下散热差。我一般建议用 30% 额定电流,如果转子能稳定对齐,就够用了。

2.4 判断对齐成功的标准

怎么知道转子已经对齐了?光靠眼睛看可不行。我总结了几条判断标准:

  • 电流稳定:q 轴电流反馈值波动小于 ±2% 额定电流,持续 0.5 秒以上。
  • 角度稳定:编码器读数波动小于 ±1 个 LSB,持续 0.5 秒以上。
  • 位置误差:如果电机有霍尔传感器,可以对比霍尔信号和编码器角度是否一致。
  • 重复性:多次标定得到的偏差值差异小于 ±0.5° 电角度。

注意:如果电机带负载,尤其是带弹性负载(比如皮带、弹簧),转子可能永远无法完全稳定。这时候需要加一个低通滤波器,或者延长保持时间。我曾经在一个带皮带的传送带上做标定,角度一直抖,后来发现是皮带弹性导致的振荡。解决办法是增加保持时间到 5 秒,同时把电流环带宽降低一半。

2.5 代码实现示例

下面是一个简单的静态校准函数。我用的是伪代码风格,实际移植时根据你的 MCU 和驱动芯片调整。

// 静态校准函数
// 返回值:电角度偏差(单位:度)
float static_calibration(float I_q_ref, uint16_t hold_time_ms) {
    float angle_sum = 0;
    uint16_t sample_count = 0;
    
    // 1. 预定位:通 20% 电流 1 秒
    set_current_ref(0, I_q_ref * 0.2);
    delay_ms(1000);
    
    // 2. 正式定位:通目标电流
    set_current_ref(0, I_q_ref);
    delay_ms(hold_time_ms);
    
    // 3. 在最后 200ms 内采样角度
    uint32_t start_time = get_tick_ms();
    while (get_tick_ms() - start_time < 200) {
        angle_sum += get_encoder_angle();
        sample_count++;
        delay_ms(1);
    }
    
    // 4. 计算平均角度
    float avg_angle = angle_sum / sample_count;
    
    // 5. 偏差 = 编码器角度 - 90°(因为通的是 q 轴电流)
    float offset = avg_angle - 90.0f;
    
    // 6. 归一化到 [0, 360)
    if (offset < 0) offset += 360.0f;
    if (offset >= 360) offset -= 360.0f;
    
    // 7. 关断电流
    set_current_ref(0, 0);
    
    return offset;
}

注意:上面的代码假设编码器角度单位是度。如果是 rad,记得换算。另外,set_current_ref 函数的参数是 (Id, Iq),我这里只通 q 轴电流。

2.6 静态校准的局限性

静态校准虽然简单,但不是万能的。我遇到过几种情况,静态校准搞不定:

  • 齿槽转矩太大:有些电机的齿槽转矩比标定电流产生的电磁转矩还大,转子根本拉不动。这时候需要加大电流,或者改用动态校准。
  • 摩擦力不均匀:轴承或者减速器的摩擦力如果各向异性,会导致转子停的位置有偏差。我遇到过一台电机,正转和反转的摩擦力差 30%,静态校准出来的偏差在两个方向差了 5°。
  • 负载惯性太大:大惯量负载需要很长时间才能稳定,有时候等不起。这时候可以考虑用动态校准,或者加一个位置闭环。
  • 电机内部短路:如果电机绕组有轻微短路,通直流电时会发热不均匀,导致转子偏转。这种情况静态校准出来的值不可靠,需要先修电机。

2.7 知识体系总览

下面这张图总结了静态校准法的核心流程和关键点。你可以把它当作一个快速参考。

静态校准法知识体系 直流定位原理 操作步骤 电流选择策略 对齐判断标准 预定位 正式定位 角度读取 重复验证 写入存储 小功率:30%-50% 中功率:20%-30% 大功率:10%-20% 电流稳定 角度稳定 重复性验证 局限性:齿槽转矩、摩擦力不均、大惯量、绕组短路 → 无法适用时,考虑动态校准或闭环定位

2.8 避坑指南

最后,我把自己踩过的坑整理一下,希望能帮你少走弯路:

  • 不要在大负载下做静态校准:负载会改变转子的平衡位置,导致偏差值不准。如果必须带载,要确保负载是纯惯性的,而且摩擦力恒定。
  • 注意电流环的饱和:如果电流环带宽太高,通直流电时可能会振荡。我一般把电流环带宽降到 50-100 Hz 再做标定。
  • 多次标定取平均:单次标定可能有随机误差。我习惯做 5 次标定,去掉最大值和最小值,然后取平均。
  • 保存标定参数时要校验:EEPROM 写入可能失败。我每次写入后都会回读校验,如果校验失败就重新写一次。
  • 标定完成后要验证:给电机通一个旋转电流,看实际角度和给定角度是否一致。如果不一致,说明标定有问题。

曾经有一次:我在一个量产项目上用了静态校准,结果有 5% 的电机标定失败。查了很久才发现,是生产线上有一批电机的齿槽转矩特别大,标定电流拉不动。后来我们加了一个判断逻辑:如果标定过程中角度波动超过 ±3°,就自动加大电流重试。这才把不良率降下来。