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 直流注入法的核心流程
为了让大家更直观地理解整个过程,我画了一张流程图。
3.6 注意事项与避坑指南
做直流注入实验,有几个坑我替你们踩过了,直接说重点。
避坑一:电流不能太大
我曾经在一个项目里,为了追求"更精确的定位",把电流加到了额定值的40%。结果电机没转几秒就开始发烫,吓得我赶紧断电。后来拆开一看,绕组绝缘层都有点变色了。记住,10%-20%的额定电流完全够用,转子定位不需要蛮力。
避坑二:稳定时间要够
转子从开始转动到完全停止,需要时间。我见过有人只等200ms就开始读数,结果偏差大了好几度。我的经验是:至少等500ms,如果电机比较大或者负载惯量高,建议等1秒以上。
避坑三:注意机械回差
如果电机带有减速器或者联轴器,机械回差会影响定位精度。我建议在同一个通电模式下,正反方向各做一次,取平均值。这样可以抵消一部分机械回差的影响。
小技巧:如果你发现每次测得的偏差值都不太一样,别急着怀疑方法。先检查一下编码器的安装是否牢固,联轴器有没有松动。我遇到过好几次,最后发现是编码器螺丝没拧紧。
3.7 方法的优缺点
| 优点 | 缺点 |
|---|---|
| 原理简单,容易实现 | 需要电机处于自由状态 |
| 不需要复杂的数学计算 | 有负载时无法使用 |
| 定位精度高(±0.5°以内) | 电机静止时可能产生轻微抖动 |
| 适合批量生产中的快速标定 | 大电机需要较长的稳定时间 |
总的来说,直流注入法是我在项目中最常用的离线校正手段。它不花哨,但可靠。你想想看,一个方法能在工业现场用了几十年还没被淘汰,本身就说明问题了。
嗯,这一章的内容就到这儿。方法虽然简单,但细节决定成败。下次你们做实验的时候,记得把上面说的几个坑避开,应该一次就能拿到准确的结果。