
1. 为什么我们需要高频信号注入法电机控制这行干久了你会发现一个很有意思的现象实验室里跑得好好的算法一到现场就各种水土不服。尤其是那些标榜无位置传感器的方案低速段的表现简直可以用惨不忍睹来形容。问题的根源在哪很大程度上就出在电感参数上。永磁同步电机的电感参数不是固定值它随转子位置变化随电流大小变化甚至随温度漂移。你拿万用表或者LCR表在静止状态下测出来的那个数值装到机器上跑起来根本不是那么回事。特别是凸极率比较高的内置式永磁电机交直轴电感差异明显这个差异恰恰是无位置传感器控制赖以工作的基础。如果电感参数辨识不准观测器算出来的转子位置就会偏轻则效率下降、噪音增大重则直接失步停机。高频信号注入法就是冲着这个痛点来的。它的核心思路很直接既然电机在低频段对凸极效应不敏感那我就往定子绕组里注入一个高频电压信号利用高频下电感呈现出的阻抗特性差异把转子位置和电感参数给逼出来。这个方法的好处是不依赖反电动势在零速和极低速下照样能工作而且对参数变化的鲁棒性比模型参考自适应那类方法要好不少。我接触这个方法大概是在五六年前当时手头一个项目要求电机在零速下输出额定转矩而且不能装编码器。试过滑模观测器低速下抖得厉害试过扩展卡尔曼滤波参数一漂就发散。最后转到高频注入这条路上才算把问题按住了。下面我就把这几年的工程经验整理一下从原理到代码实现再到现场调试踩过的坑尽量说透。这篇文章适合谁看如果你正在做无位置传感器控制、被低速性能困扰、或者单纯想搞明白电感参数到底怎么辨识才靠谱那接下来的内容应该对你有用。我会尽量避开纯理论推导多讲工程上怎么落地。2. 高频注入法的核心原理拆解2.1 从电机的物理结构说起要理解高频注入得先回到电机的物理本质上。永磁同步电机的定子绕组通交流电会产生旋转磁场转子上的永磁体也有自己的磁场。对于表贴式电机永磁体贴在转子表面交直轴磁路基本对称电感差异很小。但对于内置式电机永磁体嵌在转子铁芯内部直轴方向的磁路要穿过永磁体磁阻大交轴方向主要是铁芯磁阻小。这个磁阻差异直接导致直轴电感Ld小于交轴电感Lq。这个差异有多大以我手头一台1.5kW的内置式永磁电机为例Ld大约在8mH左右Lq在14mH左右凸极率接近1.75。这个差异在低频下几乎看不出来因为低频时绕组阻抗主要由电阻和反电动势决定电感的影响被淹没了。但到了高频段比如1kHz以上感抗ωL占主导地位电感差异就会被放大成明显的电流响应差异。你可以这样理解低频时电机像一个电阻高频时电机像一个电感。高频注入法就是利用这个电感视角通过检测电流响应来反推电感值进而锁定转子位置。2.2 高频数学模型到底长什么样在静止坐标系下高频电压方程可以写成这样[udh] [Rs jωh·Ld 0 ] [idh] [ ] [ ] [ ] [uqh] [0 Rs jωh·Lq ] [iqh]这里ωh是注入信号的角频率下标h表示高频分量。当注入频率远高于基波频率时电阻Rs的影响可以忽略方程简化为纯电感模型。这时候如果在估计的d轴方向注入电压实际电流响应中会包含一个与转子位置误差相关的分量。具体来说假设估计的转子位置角为θ_est实际位置为θ_real定义位置误差Δθ θ_real - θ_est。在估计的d轴注入高频电压Vh·cos(ωh·t)那么估计的q轴电流响应幅值中会包含sin(2Δθ)的项。当Δθ趋近于零时这个分量也趋近于零。这就是高频注入法锁定转子位置的基本逻辑。注意这里说的是估计的d轴不是实际的d轴。实际工程中我们并不知道真实位置只能在一个估计的坐标系里注入然后通过电流响应来修正估计角。2.3 为什么选择高频而不是低频有人可能会问既然电感差异在低频也存在为什么不直接注入低频信号原因有两个。第一低频注入会与基波驱动信号混在一起滤波分离极其困难。第二低频时反电动势不可忽略会严重干扰参数辨识。高频注入则天然避开了这两个问题频率高到反电动势可以忽略又可以通过带通滤波器与基波分离。那频率选多高合适我的经验是取PWM频率的1/10到1/5之间。比如PWM载波频率10kHz注入频率可以选1kHz到2kHz。太低的话滤波分离困难太高的话开关死区和采样延迟的影响会变大。另外注入频率也不能太接近电机的机械谐振频率否则会激起振动。2.4 旋转注入与脉振注入的取舍高频注入法主要分两派旋转电压注入和脉振电压注入。旋转注入是在αβ坐标系下注入一个旋转的高频电压矢量脉振注入是在估计的d轴方向注入一个脉振电压。旋转注入的优点是实现简单不需要知道估计角度直接注入就行。缺点是会在q轴产生转矩脉动带来噪音和振动。脉振注入则只在d轴注入对转矩影响小但需要依赖估计角度存在收敛性问题。我个人的选择是如果对噪音要求不高旋转注入上手快如果应用场景对NVH敏感比如家电或者车内电机那还是老老实实用脉振注入。下面代码示例我用的是脉振注入因为工程上更常用。3. 电感参数辨识的完整实操流程3.1 硬件平台与信号链设计先说一下我的测试平台配置方便你对照参考。主控用的是TI的TMS320F28069PWM频率10kHz死区时间1微秒。逆变器是三相全桥电流采样用的是霍尔传感器采样率跟PWM同步。电机是一台1.5kW内置式永磁同步电机额定电流5A极对数4。信号链的关键在于电流采样精度。高频注入产生的电流响应幅值通常只有额定电流的5%到10%如果采样噪声太大信噪比不够辨识结果会抖得厉害。我的做法是在电流采样后加一级硬件低通滤波截止频率设在PWM频率的一半左右先把开关噪声滤掉。然后在软件里再做一次带通滤波中心频率对准注入频率。实操心得霍尔传感器的带宽要足够至少是注入频率的5倍以上。我试过用采样电阻加运放方案带宽没问题但温漂比较大后来还是换回了霍尔。3.2 注入信号的参数计算注入电压幅值的选取需要权衡。太小了信噪比不够太大了会带来额外损耗和噪音。我的经验公式是Vh 0.1 × Vdc × sqrt(Ld / Lq)以Vdc300VLd8mHLq14mH为例Vh大约在22V左右。实际调试时我会先从这个值开始然后根据电流响应的信噪比微调。如果电流响应幅值低于采样噪声的3倍就适当加大Vh。注入频率的选择前面说了取PWM频率的1/10到1/5。我这里PWM是10kHz注入频率选1.5kHz。这个频率下感抗ωh·Ld大约是75欧姆ωh·Lq大约是132欧姆差异明显便于辨识。带通滤波器的设计参数中心频率1.5kHz带宽200Hz用二阶巴特沃斯滤波器实现。带宽太窄的话收敛慢太宽的话滤波效果差。200Hz是我试下来比较平衡的值。3.3 带通滤波器的代码实现数字滤波器的实现我用的是双线性变换法先把模拟滤波器离散化。下面是二阶巴特沃斯带通滤波器的C代码实现可以直接移植到DSP上typedef struct { float b0, b1, b2, a1, a2; float x1, x2, y1, y2; } BiquadFilter; void Biquad_init(BiquadFilter *f, float fc, float bw, float fs) { float w0 2.0f * 3.1415926f * fc / fs; float alpha sinf(w0) * sinhf(logf(2.0f) / 2.0f * bw / fc * w0 / sinf(w0)); float cosw0 cosf(w0); float b0 alpha; float b1 0.0f; float b2 -alpha; float a0 1.0f alpha; float a1 -2.0f * cosw0; float a2 1.0f - alpha; f-b0 b0 / a0; f-b1 b1 / a0; f-b2 b2 / a0; f-a1 a1 / a0; f-a2 a2 / a0; f-x1 f-x2 f-y1 f-y2 0.0f; } float Biquad_process(BiquadFilter *f, float x) { float y f-b0 * x f-b1 * f-x1 f-b2 * f-x2 - f-a1 * f-y1 - f-a2 * f-y2; f-x2 f-x1; f-x1 x; f-y2 f-y1; f-y1 y; return y; }这段代码在中断里每个PWM周期调用一次输入是采样到的相电流输出是高频分量。注意浮点运算在定点DSP上会比较慢如果主频不够可以考虑用Q格式定点实现。3.4 电感参数的计算与提取带通滤波之后我们得到了高频电流的αβ分量iαh和iβh。接下来要从中提取电感信息。对于脉振注入在估计的d轴注入Vh·cos(ωh·t)那么高频电流的幅值包络与电感的关系是|idh| Vh / (ωh · Ld) |iqh| Vh / (ωh · Lq) · sin(2Δθ)从这两个式子可以反推出Ld和Lq。具体做法是对idh和iqh分别做包络检测可以用取绝对值再低通滤波的方式实现。然后Ld Vh / (ωh · |idh|_envelope) Lq Vh / (ωh · |iqh|_envelope / sin(2Δθ))当位置误差Δθ收敛到零时iqh的包络也趋近于零这时候Lq没法直接算。工程上的做法是给Δθ一个小偏置比如让估计角度在收敛点附近小幅摆动然后取多个点的数据做拟合。注意实际计算时ωh要用弧度制Vh是注入电压的峰值而不是有效值。这两个单位搞错的话算出来的电感会差根号2倍。3.5 位置观测器的设计电感参数辨识出来之后下一步就是用它来锁定转子位置。我用的是一个简单的锁相环结构把iqh的包络作为误差信号经过PI调节器后得到转速估计再积分得到位置估计。PI参数怎么调我的经验是先把积分增益设为零只调比例增益让系统对位置误差有响应但不振荡。然后慢慢加积分增益直到稳态误差消除。比例增益大概在0.5到2之间积分增益在10到50之间具体看电机惯量和注入频率。这里有个细节iqh包络的符号包含了位置误差的方向信息。如果Δθ为正iqh包络为正Δθ为负包络为负。所以PI调节器的输入直接用带符号的包络值就行不需要取绝对值。4. 现场调试中的典型问题与排查4.1 辨识结果跳动大怎么办这是最常见的问题。你盯着上位机看电感值一会儿8mH一会儿12mH根本没法用。原因通常有三个信噪比不够、滤波器参数不对、或者注入频率与PWM谐波发生了拍频。排查顺序我一般是这样的先看电流采样的原始波形用示波器看采样电阻两端的信号如果噪声峰峰值超过信号幅值的20%那就是硬件问题得从采样电路下手。如果原始信号干净那就看带通滤波后的波形如果滤波后还有明显杂波那就是滤波器带宽太宽或者阶数不够。拍频问题比较隐蔽。注入频率和PWM频率如果成整数倍关系开关谐波会混进来。解决办法很简单把注入频率稍微偏一点比如从1.5kHz改成1.47kHz避开整数倍关系。4.2 低速下位置估计发散有时候电感辨识没问题但位置观测器就是收敛不了。这种情况我遇到最多的是PI参数太激进。高频注入的位置误差信号本身含有噪声如果PI增益太大噪声会被放大导致估计角度来回跳。另一个可能的原因是注入电压幅值不够。低速下反电动势小但如果有负载转矩电流会偏大高频响应相对就弱了。这时候可以适当加大注入幅值或者降低注入频率让感抗小一点提高电流响应。还有一种情况是电机凸极率太低。表贴式电机的Ld和Lq几乎相等高频注入法基本失效。这种电机就别折腾了老老实实装编码器或者用其他方法。4.3 常见问题速查表现象可能原因排查方法解决措施电感辨识值跳动信噪比不足示波器看原始采样波形加大注入幅值或优化采样电路位置估计发散PI参数过激观察误差信号波形降低比例和积分增益电流响应太小注入频率过高计算感抗值降低注入频率或加大电压噪音明显增大注入幅值过大听电机声音降低注入幅值收敛速度慢滤波器带宽太窄观察收敛过程适当加宽带宽稳态误差大积分增益不足检查稳态误差加大积分增益4.4 几个容易被忽略的细节第一个是死区补偿。逆变器的死区会导致输出电压畸变这个畸变在低频时影响不大但在高频注入时会被放大。我的做法是在注入电压上叠加一个死区补偿量具体值根据死区时间和开关频率计算。第二个是采样延迟。从PWM更新到电流采样再到算法执行中间有延迟。如果延迟接近注入周期的四分之一会导致相位偏差。解决办法是在算法里做相位补偿或者把采样时刻提前。第三个是温度影响。电感随温度变化铜绕组的电阻也随温度变化。虽然高频下电阻影响小但长时间运行后电感值还是会漂。如果应用对精度要求高可以加一个温度传感器做补偿。5. 进阶优化与扩展思路5.1 方波注入替代正弦注入正弦注入的缺点是信噪比有限因为电流响应幅值受限于注入电压。方波注入则可以在相同电压幅值下获得更大的电流变化率信噪比更好。实现上就是把注入信号从正弦改成方波然后通过检测电流的斜率来提取电感信息。方波注入的另一个好处是不需要带通滤波器直接用电流差分就行计算量小很多。但缺点是方波含有丰富的高次谐波可能激起机械谐振。我在一台小惯量电机上试过噪音比正弦注入大不少后来还是换回了正弦。5.2 多参数同时辨识高频注入法不仅能辨识电感还能同时辨识电阻和磁链。做法是在不同频率下注入利用阻抗随频率变化的特性分离出电阻和电感。低频段电阻占主导高频段电感占主导两个频率点的数据联立就能解出两个参数。磁链辨识则需要在注入的同时施加一个缓慢变化的转矩观察反电动势的变化。这个方法我试过精度还可以但需要额外的转矩控制环路实现复杂度高。5.3 与基波控制的融合高频注入信号和基波驱动信号是叠加在一起的最终送到逆变器的电压指令是两者的和。这里有个细节注入信号的幅值不能超过逆变器的线性调制区否则会削顶。我的做法是在电压指令合成后做一个限幅如果超出线性区就按比例缩小注入幅值。另外高频注入会带来额外的铜损和铁损。虽然幅值不大但长时间运行温升还是会高几度。如果应用对效率敏感可以在高速段关闭注入切换到反电动势观测器。5.4 代码架构建议最后说一下代码架构。高频注入法的算法模块最好独立出来跟基波控制解耦。我的做法是电流采样后先分两路一路进基波控制一路进高频处理。高频处理模块输出电感估计值和位置修正量基波控制模块用这些信息做坐标变换和电流调节。中断优先级上高频处理可以放在跟PWM同步的主中断里保证时序确定性。参数辨识和位置观测的计算量不大在10kHz中断里跑绰绰有余。如果主频不够可以把辨识算法降频到1kHz执行位置观测保持10kHz。实操心得调试的时候一定要把中间变量通过DAC或者串口输出出来看。光看最终结果很难定位问题。我一般会把带通滤波后的电流、包络值、位置误差、估计角度这几个量都输出用上位机画波形一眼就能看出哪一环出了问题。这套方法我在三四个项目上用过从几百瓦的小电机到几十千瓦的大电机都有核心逻辑是一样的。区别主要在于注入频率和幅值的选取大电机电感大注入频率可以低一些幅值要高一些。小电机则相反。具体数值需要根据实际电机参数计算不能照搬。电感参数辨识这块精度做到5%以内就算不错了。追求更高精度的话得考虑温度补偿和磁饱和补偿那就复杂了。对于大多数工业应用5%的精度足够观测器稳定工作。如果你发现辨识结果跟LCR表测出来的差很多先别怀疑算法检查一下LCR表的测试频率是不是跟注入频率一致。不同频率下测出来的电感值本来就不一样这是正常现象。