拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

高频注入法辨识PMSM电感参数:原理、实现与工程实践

高频注入法辨识PMSM电感参数:原理、实现与工程实践

1. 为什么要在电机控制里死磕电感参数辨识

做电机控制这行的,尤其是搞永磁同步电机(PMSM)无位置传感器控制的,迟早会撞上电感参数这个坎。很多人一开始觉得电感就是个常数,查手册、拿LCR表测一下填进去就完事了,结果一到低速、零速工况就发现电流环震荡、位置估算发散、转矩脉动大得离谱。问题往往就出在电感参数上——它根本不是一个固定值,而是随电流、温度、磁饱和程度动态变化的量。

我最早接触这个方向是在做一套低速大扭矩直驱系统的时候。当时用的是一台表贴式PMSM,d轴和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上实现过这套方案,主频200MHz,PWM频率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.35mH+1.8%
Lq8.2mH8.28mH+1.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配置、滤波器设计上,这些基础工作做扎实了,算法才能发挥出应有的水平。

返回列表