
1. 为什么要在电机控制里死磕电感参数辨识做电机控制这行的尤其是搞永磁同步电机PMSM无位置传感器控制的迟早会撞上电感参数这个坎。很多人一开始觉得电感就是个常数查手册、拿LCR表测一下填进去就完事了结果一到低速、零速工况就发现电流环震荡、位置估算发散、转矩脉动大得离谱。问题往往就出在电感参数上——它根本不是一个固定值而是随电流、温度、磁饱和程度动态变化的量。我最早接触这个方向是在做一套低速大扭矩直驱系统的时候。当时用的是一台表贴式PMSMd轴和q轴电感理论上应该相等但实际跑起来发现q轴电流一上去电感就往下掉交叉饱和效应明显。用固定参数去调电流环轻载还行重载直接啸叫。后来查了不少资料也试了几种在线辨识方案最终把高频信号注入法作为主力手段落地下来。这套方法的核心思路其实不复杂往电机里注入一个高频电压或电流信号通过分析高频响应中的电流或电压分量把电感信息“解调”出来。它解决的核心问题是在电机运行过程中实时、准确地获取d轴和q轴电感而且不需要额外的机械传感器或复杂的离线实验设备。适合谁看如果你正在做无位置传感器控制、高性能电流环设计、或者电机参数自整定功能这篇内容应该能帮你少走不少弯路。下面我会从原理推导、信号处理、工程实现、踩坑经验几个维度把高频注入法辨识电感这件事讲透。2. 高频注入法辨识电感的核心原理拆解2.1 从电机高频模型说起要理解高频注入法得先把电机的高频等效模型搞清楚。在静止坐标系下PMSM的电压方程可以写成[ud] [Rs Ld*p -ωe*Lq ] [id] [0 ] [ ] [ ] [ ] [ ] [uq] [ωe*Ld Rs Lq*p] [iq] [ωe*ψf]当注入信号的频率远高于基波频率时通常高一个数量级以上电阻压降和反电动势项的影响可以忽略电机模型退化成纯电感网络。这时候在d-q轴上看高频电压和电流的关系就变得非常干净[udh] [Ld 0 ] [idh] [ ] [ ] [ ] * p [uqh] [0 Lq ] [iqh]也就是说高频下电机就是一个解耦的纯电感负载。你给d轴注入高频电压d轴就会产生高频电流幅值由Ld决定q轴同理。这就是高频注入法辨识电感的物理基础——通过测量高频电压和电流的幅值比直接算出电感。但这里有个关键点实际电机里d轴和q轴并不是完全解耦的交叉饱和会让Ldq、Lqd不为零。不过对于大多数工程应用忽略交叉耦合带来的误差在可接受范围内后面我会讲怎么处理这个残差。2.2 旋转高频注入与脉振高频注入的区别高频注入法按信号形式分两大类旋转高频注入和脉振高频注入。这两者在电感辨识上的表现差异很大选型时得想清楚。旋转高频注入是在静止坐标系下注入一个旋转的电压矢量比如Uαh Vh * cos(ωh*t) Uβh Vh * sin(ωh*t)这个旋转矢量在d-q轴上投影后会产生包含位置信息的电流响应。它的优点是同时激励了d轴和q轴理论上一次注入就能把两个电感都辨识出来。但缺点也很明显响应电流里混着转子位置信息需要额外的解调环节把位置和电感分离信号处理复杂度高。而且旋转注入会在电机里产生一个旋转的磁场可能引起额外的转矩脉动和噪声。脉振高频注入则是在估计的d轴或q轴方向上注入一个高频正弦电压比如Ud_hat Vh * cos(ωh*t) Uq_hat 0这个信号只在一个方向上“脉振”响应电流也只在这个方向附近波动。它的优势是信号处理简单解调后直接得到该方向的电感信息。缺点是一次只能测一个轴要测Ld和Lq得分别注入两次或者通过坐标变换间接计算。我在实际项目里更倾向用脉振注入原因很简单工程实现干净对系统扰动小而且电感辨识的精度足够。旋转注入更适合那些需要同时提取位置和电感信息的场景但如果你只是想做参数辨识脉振方案性价比更高。2.3 高频信号的频率和幅值怎么选这是高频注入法最核心的工程参数选不好要么辨识不准要么电机啸叫。频率选择有个经验法则注入频率至少是基波频率的10倍以上同时要低于逆变器的开关频率的1/5到1/10。比如开关频率10kHz注入频率可以选500Hz到1kHz。太低会跟基波耦合太高会被开关噪声淹没而且电感的集肤效应开始显现测出来的值跟低频时不一样。我一般会先扫频测试一下从200Hz到2kHz每隔100Hz注入一次看辨识结果的稳定性。通常会在某个频段内电感值比较平坦那个区间就是合适的注入频率。实测下来对于大多数工业伺服电机800Hz到1.2kHz是个甜点区。幅值选择要兼顾信噪比和扰动。幅值太小响应电流被噪声淹没幅值太大电机发热、噪声大甚至影响正常运行。我的做法是先设一个初始值比如额定电压的5%到10%然后看响应电流的幅值。理想情况下高频电流幅值应该在额定电流的5%到15%之间。如果太小就加大电压太大就减小。注意这个幅值是在高频下的实际电流有效值可能不大但峰值可能很高要确保不会触发过流保护。提示注入频率和幅值不是独立的频率越高同样电压下电流越小。所以调参数时要两个一起看别只调一个。3. 从响应电流里把电感“解调”出来的完整链路3.1 信号解调的数学过程假设我们在估计的d轴注入高频电压Vh*cos(ωh*t)那么在高频模型下d轴高频电流响应为idh (Vh / (ωh * Ld)) * sin(ωh*t)注意这里有个90度相位差因为电感电流是电压的积分。实际采样得到的电流里除了这个高频分量还有基波电流、PWM开关噪声、采样噪声。所以第一步是带通滤波把高频分量提取出来。带通滤波器的中心频率设成注入频率带宽要窄一般取注入频率的10%到20%。我用的是二阶巴特沃斯带通截止频率算好之后直接数字实现。滤波后的信号再跟一个同频的正弦参考信号相乘做同步解调idh_demod idh_filtered * sin(ωh*t)相乘之后信号里会出现一个直流分量和一个二倍频分量。直流分量正比于Vh/(ωh*Ld)二倍频分量用低通滤波器滤掉。最后得到的直流分量再经过标定就能反算出Ld。整个链路可以概括为注入→采样→带通→同步解调→低通→标定→电感值。每一步都有坑后面会细说。3.2 带通滤波器的设计细节带通滤波器是整条链路里最容易出问题的地方。设计不好要么把有用信号滤掉了要么让噪声漏进来。我一般用二阶巴特沃斯带通传递函数写成H(z) (b0 b2*z^-2) / (1 a1*z^-1 a2*z^-2)系数用双线性变换从模拟域映射过来。中心频率f0设成注入频率品质因数Q设成5到10。Q太高滤波器对频率偏移敏感电机参数变化时可能失谐Q太低选择性差基波和噪声抑制不够。实际调试时我会先用一个已知频率的正弦信号喂进去看滤波后的幅值和相位。如果幅值衰减超过3dB或者相位偏移超过10度就得重新调系数。还有一点滤波器的群延迟会影响解调的实时性但电感辨识本身不需要太快几十毫秒的延迟完全可以接受。注意数字滤波器的系数要用浮点算定点实现容易溢出或者精度不够。如果非要用定点至少留24位小数位。3.3 同步解调中的相位对齐问题同步解调看着简单但相位不对齐的话解调出来的直流分量会偏小导致电感辨识值偏大。原因在于如果参考信号和实际高频电流有相位差φ相乘后的直流分量会变成cos(φ)倍。相位差从哪来一是滤波器引入的相移二是采样和计算延迟三是注入信号生成时的初始相位。我通常会在解调前先做一次相位校准在已知电感的标准负载上跑一遍测出实际相位差然后在参考信号里补偿掉。具体操作是生成参考信号时用sin(ωh*t φ_comp)其中φ_comp就是校准得到的补偿角。这个角一旦标定好在同样的硬件和滤波器配置下基本不变可以固化到代码里。3.4 从解调值到电感值的标定解调出来的直流分量D跟电感的关系是D Vh / (2 * ωh * Ld)所以Ld Vh / (2 * ωh * D)但这是理论公式实际中Vh可能有衰减ωh可能有偏差D里还有残余噪声。所以我会做一个两点标定用两个已知电感比如一个空心电感和一个标准电机分别测出D值然后拟合出比例系数和偏移量。这样能把系统误差压到1%以内。标定之后每次辨识只需要读D值代入线性公式就能算出电感。整个过程在中断里跑耗时大概几十微秒对主控制循环影响很小。4. 工程落地时必须处理的五个现实问题4.1 逆变器非线性带来的电压误差理论推导里我们假设注入的电压就是设定值但实际逆变器有死区、管压降、开关延迟导致实际输出电压跟设定值有偏差。这个偏差在低频时影响不大但在高频注入下电压幅值本来就小误差占比就上去了。我实测过死区时间设2微秒开关频率10kHz注入电压5V实际输出电压可能只有4.2V左右误差16%。这直接导致电感辨识值偏大16%。解决办法有两个一是电压补偿根据电流极性把死区造成的误差补回去二是闭环注入不直接设定电压而是设定电流幅值用电流环去调节实际电压。第二种方法更稳但需要电流环有足够的带宽。我一般用第一种补偿公式根据逆变器手册和实测拟合。4.2 磁饱和导致的电感非线性电机铁芯不是线性的电流一大就饱和电感往下掉。高频注入法测的是高频小信号下的电感这个值跟大电流下的增量电感不是一回事。如果你用高频辨识出来的电感去调电流环重载时可能还是不对。我的处理方式是在不同基波电流下分别辨识建立电感随电流变化的表格。比如在0A、25%、50%、75%、100%额定电流下各测一次然后插值。这样虽然麻烦但能真实反映电机的饱和特性。实测下来q轴电感在额定电流下可能只有空载时的60%到70%这个变化量不补偿的话电流环增益至少差一倍。4.3 交叉饱和与轴间耦合前面提到过d轴和q轴不是完全解耦的。当q轴电流很大时d轴电感也会受影响反之亦然。高频注入法如果只在单轴注入测出来的电感里混着交叉耦合项。要精确处理这个问题需要做双轴注入同时在d轴和q轴注入不同频率的高频信号然后解调出四个电感参数Ldd、Lqq、Ldq、Lqd。但这样信号处理复杂度翻倍而且两个频率要选得互不干扰工程上比较麻烦。我的折中方案是先单轴辨识得到Ld和Lq的近似值然后在控制算法里加一个交叉耦合补偿项用查表或者在线估计的方式修正。对于大多数工业应用这个精度已经够了。4.4 采样噪声与信噪比优化高频注入的响应电流幅值通常不大如果采样噪声大解调出来的D值波动就大电感辨识结果跳来跳去。我遇到过最夸张的情况辨识值在±20%范围内随机跳根本没法用。优化信噪比有几个手段一是提高注入幅值但受限于电机噪声和发热二是增加解调积分时间用更长的低通滤波器牺牲动态换精度三是优化采样时刻避开PWM开关瞬间的噪声在开关周期的中间点采样。我一般会同时用这三招。特别是采样时刻一定要跟PWM载波同步在三角波的顶点或底点触发ADC这时候开关噪声最小。实测下来光这一项就能把信噪比提高6dB以上。4.5 辨识结果的验证与容错在线辨识最怕的是辨识错了还不知道拿着错误参数去跑控制轻则性能下降重则炸机。所以必须有一套验证和容错机制。我的做法是每次辨识出电感值后跟上一周期的值比较如果变化超过20%就认为这次辨识无效保持上一次的值。同时如果连续多次辨识都失败就切回默认参数并报故障码。另外还会用辨识出的电感去反算高频电流幅值跟实际采样值对比偏差超过15%就判定异常。这套机制看起来简单但能挡住绝大多数异常情况。我试过在电机堵转、缺相、采样线松动等情况下容错机制都能正确触发没有让错误参数进入控制环。5. 一套可复现的DSP实现方案5.1 整体软件架构我在TI的C2000系列DSP上实现过这套方案主频200MHzPWM频率10kHz注入频率1kHz。软件分成三个任务层级高频任务PWM中断10kHz生成注入信号、采样电流电压、带通滤波、同步解调。中频任务1kHz低通滤波、电感计算、标定、容错判断。低频任务100Hz参数更新、与主控制环交互、故障处理。这样分层的好处是高频任务只做最必要的运算保证实时性中频任务处理解调后的慢变信号低频任务负责跟上层逻辑对接。5.2 注入信号生成的代码实现注入信号用查表法生成表长设成1000点对应一个完整周期。这样每个PWM周期取一个点正好1kHz。代码大概长这样// 注入信号表预先算好 float inject_table[1000]; // 在PWM中断里 static uint16_t inject_index 0; float vh VH_AMPLITUDE * inject_table[inject_index]; inject_index (inject_index 1) % 1000; // 把vh加到d轴电压指令上 Ud_ref vh;查表法比实时算sin要快得多而且相位是确定的不会因为计算延迟导致相位漂移。表里的数据用sin(2*PI*i/1000)生成精度足够。5.3 带通滤波器的定点实现虽然我建议用浮点但有些低成本DSP只有定点单元。这时候带通滤波器要特别小心。我用的是Q15格式系数放大32768倍后取整。滤波器的状态变量用32位存防止溢出。// 二阶带通Q15格式 int32_t b0 1234, b2 -1234, a1 -30000, a2 14000; int32_t x1 0, x2 0, y1 0, y2 0; int32_t input (int32_t)(idh * 32768); int32_t output b0*input b2*x2 - a1*y1 - a2*y2; output output 15; x2 x1; x1 input; y2 y1; y1 output;实际系数要根据注入频率和采样率算这里只是示意。注意右移15位之前要确保不会溢出必要时先做饱和处理。5.4 同步解调与低通滤波同步解调在中断里做参考信号也用查表法生成跟注入信号同频同相补偿后。相乘之后送进一个一阶低通滤波器// 一阶低通截止频率10Hz float alpha 0.01; static float demod_lpf 0; float demod idh_filtered * ref_sin; demod_lpf demod_lpf alpha * (demod - demod_lpf);这个低通的时间常数大概100ms对应10Hz截止。如果觉得响应太慢可以加大alpha但噪声会变大。我一般取alpha在0.005到0.02之间根据实际噪声水平调。5.5 电感计算与参数更新在中频任务里每1ms读一次demod_lpf代入标定公式算电感float Ld_est VH_AMPLITUDE / (2 * PI * FH * demod_lpf * CALIB_GAIN);CALIB_GAIN是标定系数事先测好。算出来的Ld_est再经过容错判断通过后更新到控制参数里。整个流程跑下来从注入到电感更新延迟大概50ms到100ms。对于参数辨识来说这个速度完全够用因为电感变化本身是慢过程。6. 实测数据与踩坑记录6.1 一台1.5kW伺服电机的辨识结果我用这套方案测过一台1.5kW的表贴式PMSM额定电流5A额定转速3000rpm。空载下辨识结果参数LCR表测量值高频注入辨识值偏差Ld8.2mH8.35mH1.8%Lq8.2mH8.28mH1.0%偏差在2%以内对于工程应用足够了。加载到额定电流后Lq降到5.6mH左右Ld降到7.1mH饱和效应明显。把辨识出的电感表代入电流环重载下的电流THD从8%降到了3.5%效果立竿见影。6.2 踩过的坑注入频率跟电流环带宽打架有一次我把注入频率设成了500Hz结果电流环带宽只有800Hz注入信号被电流环衰减了一大半解调出来的D值小得可怜电感辨识值偏大30%。后来把注入频率提到1.2kHz电流环对它的衰减就很小了辨识恢复正常。教训是注入频率必须远高于电流环带宽至少3倍以上。否则电流环会把注入信号当成扰动给抑制掉你就白注入了。6.3 踩过的坑死区补偿没做对导致辨识值随电流方向跳变还有一次我发现辨识出的电感值在电流过零时会跳变正电流时8.3mH负电流时9.1mH。查了半天发现是死区补偿的方向判断有问题。死区造成的电压误差跟电流方向有关补偿时必须根据电流极性切换补偿量。我原来的代码里极性判断有延迟导致过零附近补偿错误。修复方法是在PWM中断里实时判断电流极性并且加一个小的滞环避免过零抖动。改完之后辨识值在过零附近的跳变从10%降到了1%以内。6.4 踩过的坑滤波器初始状态导致上电瞬间辨识错误数字滤波器有状态变量上电时如果状态是零前几个周期的输出会有一个暂态过程。如果这时候正好在跑辨识结果肯定不对。我一开始没注意上电后第一次辨识值总是偏大很多要过几百毫秒才稳定。解决办法很简单上电后先让滤波器空跑一段时间等状态稳定了再启动辨识。或者给滤波器状态赋一个合理的初值比如用第一个采样值填充。我一般用前者简单可靠。7. 这套方法还能怎么扩展高频注入法辨识电感只是参数辨识的一个分支但它打开了一扇门。同样的信号注入和解调思路可以用来辨识电阻、磁链、甚至转子位置。我在后续项目里把注入频率改了一下同时注入两个频率一个用来辨识电感一个用来辨识电阻效果也不错。另外现在很多电机控制器开始支持在线参数自整定上电后自动跑一遍辨识流程把电感、电阻、磁链都测出来然后自动整定电流环和速度环参数。高频注入法就是其中的核心环节。如果你在做这类功能建议把辨识流程做成状态机每个状态负责一个参数的辨识互相之间做好时序隔离避免信号串扰。最后说一个实际体会高频注入法的精度和鲁棒性很大程度上取决于你对硬件和信号链的理解。同样的算法在不同板子上跑出来的效果可能差很多。所以别光盯着算法多花点时间在采样电路、PWM配置、滤波器设计上这些基础工作做扎实了算法才能发挥出应有的水平。