3. 离线校正方法(一):直流注入法原理与实现

各位做电机控制的朋友,咱们今天聊一个很实在的话题——怎么在电机还没转起来的时候,就把电角度偏差给找出来。

你可能会问:电机都没动,我怎么知道转子在哪儿?

嗯,这就是直流注入法的本事了。说白了,就是给电机定子通一个直流电,让转子自己乖乖地跑到一个已知位置上去。然后我们通过编码器读到的角度,跟这个已知位置一对比,偏差就出来了。

我在项目里用过不下十种找零位的方法,但直流注入法始终是我个人最信赖的"第一枪"。它简单、可靠,而且不需要什么复杂的数学运算。

3.1 直流注入法的物理原理

先说说原理,其实不复杂。

三相永磁同步电机的定子绕组,你给它通直流电,就会产生一个静止的磁场。这个磁场会吸引转子上的永磁体,让转子转到跟定子磁场对齐的位置。

关键点来了:这个对齐位置,就是我们人为定义的"电零度"。

具体来说,如果我们给A相和B相通电,让电流从A相流入、B相流出,产生的合成磁动势方向是固定的。转子最终会停在某个角度上。这个角度对应的编码器读数,跟理论值之间的差,就是我们要找的电角度偏差。

核心公式:

θ偏差 = θ编码器 - θ理论

其中θ理论取决于你选择的通电方式。比如A+B-方式,理论值是0°(或30°,取决于绕组定义)。

我记得第一次带团队做这个实验时,有个同事死活想不通:为什么通直流电就能定位?我让他拿个指南针放在线圈旁边比划了一下,他立马就明白了。磁场对齐,就是这么直观。

3.2 通电方式与理论角度对照

不同的通电组合,对应不同的理论电角度。我整理了一张表,大家做实验时可以直接查。

通电方式 电流路径 理论电角度 适用场景
A+B- A相流入,B相流出 0° 最常用,定位准确
B+C- B相流入,C相流出 120° 验证用,交叉检查
C+A- C相流入,A相流出 240° 验证用,交叉检查
A+C- A相流入,C相流出 300° 反向验证

你可能会问:为什么是0°、120°、240°这些值?

这跟三相绕组的空间分布有关。A、B、C三相在空间上互差120°电角度。电流从哪一相流入、哪一相流出,决定了合成磁场的指向。

个人经验:我建议至少做两组不同通电方式的实验(比如A+B-和B+C-),对比两次测得的偏差值。如果偏差一致,说明结果可靠;如果偏差很大,那就要检查接线或者编码器安装问题了。

3.3 实验步骤详解

好,原理讲完了,咱们直接上手。下面是我在实际项目中反复验证过的操作流程。

步骤一:准备工作

  • 确保电机处于自由状态,没有机械负载
  • 编码器已安装并上电,能正常读数
  • 驱动器工作在电流环模式,电流限幅已设置
  • 准备好示波器或数据记录工具(可选,但推荐)

步骤二:施加直流电流

  • 设置目标电流值:建议从额定电流的10%开始
  • 选择通电方式:以A+B-为例
  • 缓慢增加电流,观察转子是否转动
  • 转子停止后,保持电流1-2秒,记录编码器读数

警告:电流不要超过额定值的30%!我曾经见过有人为了"定位更准"把电流开到50%,结果电机发热严重,差点烧了绕组。记住,直流注入法不需要大电流,10%-20%就足够了。

步骤三:记录数据

  • 记录当前编码器角度值θenc
  • 记录对应的理论电角度θref(查上表)
  • 计算偏差:θoffset = θenc - θref
  • 重复3次,取平均值

步骤四:交叉验证

  • 更换通电方式(如B+C-),重复步骤二和三
  • 对比两次计算的θoffset,误差应在±1°以内
  • 如果误差过大,检查机械安装或电气连接

3.4 代码实现示例

下面是一段我在STM32平台上写过的直流注入代码片段。你拿过去改改就能用。

// 直流注入法找电角度偏差
// 参数:target_current - 目标电流值(0.0 ~ 1.0,标幺值)
//       injection_mode - 通电模式(0:A+B-, 1:B+C-, 2:C+A-)
// 返回:电角度偏差值(单位:度)

float dc_injection_find_offset(float target_current, uint8_t injection_mode)
{
    float theta_enc, theta_ref, theta_offset;
    float ref_table[3] = {0.0f, 120.0f, 240.0f};  // 理论电角度
    
    // 1. 设置电流限幅
    set_current_limit(target_current * 1.2f);
    
    // 2. 根据模式设置PWM占空比
    switch(injection_mode) {
        case 0:  // A+B-
            set_pwm_duty(PHASE_A, target_current);
            set_pwm_duty(PHASE_B, -target_current);
            set_pwm_duty(PHASE_C, 0.0f);
            break;
        case 1:  // B+C-
            set_pwm_duty(PHASE_A, 0.0f);
            set_pwm_duty(PHASE_B, target_current);
            set_pwm_duty(PHASE_C, -target_current);
            break;
        case 2:  // C+A-
            set_pwm_duty(PHASE_A, -target_current);
            set_pwm_duty(PHASE_B, 0.0f);
            set_pwm_duty(PHASE_C, target_current);
            break;
    }
    
    // 3. 等待转子稳定(建议500ms以上)
    delay_ms(1000);
    
    // 4. 读取编码器角度
    theta_enc = get_encoder_angle();
    
    // 5. 获取理论角度
    theta_ref = ref_table[injection_mode];
    
    // 6. 计算偏差(处理角度环绕)
    theta_offset = theta_enc - theta_ref;
    if(theta_offset > 180.0f)  theta_offset -= 360.0f;
    if(theta_offset < -180.0f) theta_offset += 360.0f;
    
    // 7. 关闭电流
    set_pwm_duty(PHASE_A, 0.0f);
    set_pwm_duty(PHASE_B, 0.0f);
    set_pwm_duty(PHASE_C, 0.0f);
    
    return theta_offset;
}

注意:代码里我加了角度环绕处理。因为编码器读数可能从359°跳到0°,直接减会出问题。这个小坑我踩过,分享出来大家别重蹈覆辙。

3.5 直流注入法的核心流程

为了让大家更直观地理解整个过程,我画了一张流程图。

直流注入法离线校正流程 1. 系统准备 2. 选择通电模式 3. 施加直流电流 4. 等待转子稳定 5. 记录编码器角度 6. 计算电角度偏差 关键参数: • 电流:10%-20%额定值 • 稳定时间:≥500ms • 重复次数:≥3次 交叉验证: 更换通电模式重复 偏差误差应<±1°

3.6 注意事项与避坑指南

做直流注入实验,有几个坑我替你们踩过了,直接说重点。

避坑一:电流不能太大

我曾经在一个项目里,为了追求"更精确的定位",把电流加到了额定值的40%。结果电机没转几秒就开始发烫,吓得我赶紧断电。后来拆开一看,绕组绝缘层都有点变色了。记住,10%-20%的额定电流完全够用,转子定位不需要蛮力。

避坑二:稳定时间要够

转子从开始转动到完全停止,需要时间。我见过有人只等200ms就开始读数,结果偏差大了好几度。我的经验是:至少等500ms,如果电机比较大或者负载惯量高,建议等1秒以上。

避坑三:注意机械回差

如果电机带有减速器或者联轴器,机械回差会影响定位精度。我建议在同一个通电模式下,正反方向各做一次,取平均值。这样可以抵消一部分机械回差的影响。

小技巧:如果你发现每次测得的偏差值都不太一样,别急着怀疑方法。先检查一下编码器的安装是否牢固,联轴器有没有松动。我遇到过好几次,最后发现是编码器螺丝没拧紧。

3.7 方法的优缺点

优点 缺点
原理简单,容易实现 需要电机处于自由状态
不需要复杂的数学计算 有负载时无法使用
定位精度高(±0.5°以内) 电机静止时可能产生轻微抖动
适合批量生产中的快速标定 大电机需要较长的稳定时间

总的来说,直流注入法是我在项目中最常用的离线校正手段。它不花哨,但可靠。你想想看,一个方法能在工业现场用了几十年还没被淘汰,本身就说明问题了。

嗯,这一章的内容就到这儿。方法虽然简单,但细节决定成败。下次你们做实验的时候,记得把上面说的几个坑避开,应该一次就能拿到准确的结果。