多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

高频注入法电机电感参数辨识:原理、实现与工程避坑指南

高频注入法电机电感参数辨识:原理、实现与工程避坑指南 1. 电机电感参数辨识为什么值得死磕做电机控制这行的绕不开一个坎电感参数到底准不准。很多人调电流环的时候发现明明按照铭牌参数整定好的PI参数一到实际工况就振荡或者动态响应慢得像蜗牛。排查半天问题往往出在电感值上——要么是铭牌给的精度不够要么是运行中磁饱和导致电感大幅偏移。我在早期做永磁同步电机PMSM驱动项目时就吃过这个亏。当时用的是一个表贴式电机铭牌标称d轴电感0.8mHq轴0.85mH看着挺正常。结果在低速大扭矩工况下电流环带宽一拉高就啸叫后来用高频信号注入法一测实际q轴电感在饱和区已经掉到0.5mH左右了。这个偏差足以让控制器“失稳”。高频信号注入法就是解决这个问题的核心手段之一。它的基本思路是在电机绕组上叠加一个远高于基波频率的高频电压或电流信号通过检测对应的高频电流或电压响应反推出电感值。因为高频下电阻压降可以忽略模型退化成纯电感网络计算简单、鲁棒性好。这套方法能干什么简单说三件事离线辨识电机d-q轴电感、在线跟踪电感随工况的变化、为无位置传感器控制提供转子位置信息。适合谁看做电机控制算法、伺服驱动器、变频器、新能源汽车电驱的工程师以及相关专业的研究生。哪怕你刚入行只要懂基本的电机方程和Clarke/Park变换跟着下面的思路走也能把整套逻辑跑通。2. 高频注入法的核心原理拆解2.1 从电机高频模型说起要理解高频注入先得把电机模型在“高频”这个前提下的样子搞清楚。PMSM在d-q坐标系下的电压方程完整版长这样ud Rs*id Ld*d(id)/dt - ωe*Lq*iq uq Rs*iq Lq*d(iq)/dt ωe*Ld*id ωe*ψf这里面有电阻压降、旋转反电势、交叉耦合项。但当我们注入的信号频率ωh远大于基波频率ωe时情况变了。假设注入频率是1kHz基波才50Hz那ωh是ωe的20倍。此时电阻压降Rsih相比ωhLih可以忽略因为ωhL通常比Rs大一到两个数量级旋转反电势ωe*ψf是基波量高频响应里看不到交叉耦合项ωeLiq也是基波量高频下忽略于是高频模型退化成udh ≈ Ld * d(idh)/dt uqh ≈ Lq * d(iqh)/dt这就是高频注入法的根基——高频下电机就是一个纯电感网络d轴和q轴解耦各自独立。你给d轴注入高频电压产生的就是d轴高频电流幅值只跟Ld有关q轴同理。注意这个简化成立的前提是注入频率足够高。工程上一般要求ωh至少是基波频率的10倍以上同时要低于PWM开关频率的一半避免混叠。比如开关频率10kHz注入频率选1kHz左右比较稳妥。2.2 旋转高频电压注入 vs 脉振高频电压注入高频注入法按信号形式分两大类选哪种直接决定了后续信号处理的复杂度。旋转高频电压注入是在α-β静止坐标系下注入一个旋转的电压矢量uαh Vh * cos(ωh*t) uβh Vh * sin(ωh*t)这个矢量在空间上匀速旋转。由于电机凸极效应Ld ≠ Lq高频电流响应的幅值会随转子位置变化通过解调电流幅值就能提取转子位置和电感信息。优点是位置信息直接体现在电流包络里不需要额外坐标变换缺点是解调算法复杂需要用到外差法或锁相环。脉振高频电压注入是在估计的d轴或实际d轴方向注入一个脉振信号udh Vh * cos(ωh*t) uqh 0这个信号只在一个方向上“抖动”。如果注入方向跟实际d轴有偏差q轴就会感应出高频电流这个电流的幅值正比于角度误差。优点是解调简单一个带通滤波加同步解调就能提取误差信号缺点是需要知道大致转子位置误差小于30度否则可能收敛到错误点。我个人的经验是离线辨识电感用旋转注入更直接因为不需要预知转子位置一次注入就能把Ld和Lq都测出来在线跟踪或无位置传感器控制用脉振注入更稳计算量小适合嵌入式平台。2.3 电感辨识的数学推导以旋转高频电压注入为例推导一下电感是怎么算出来的。在α-β坐标系下注入旋转电压经过Park变换到d-q坐标系后高频电压在d-q轴上的分量为udh Vh * cos((ωh - ωe)*t) uqh Vh * sin((ωh - ωe)*t)当电机静止或低速时ωe≈0简化为udh Vh * cos(ωh*t) uqh Vh * sin(ωh*t)高频电流响应为idh (Vh / (ωh*Ld)) * sin(ωh*t) iqh -(Vh / (ωh*Lq)) * cos(ωh*t)再变换回α-β坐标系得到iαh Idh_amp * sin(ωh*t) * cos(θ) Iqh_amp * cos(ωh*t) * sin(θ) iβh Idh_amp * sin(ωh*t) * sin(θ) - Iqh_amp * cos(ωh*t) * cos(θ)其中Idh_amp Vh/(ωhLd)Iqh_amp Vh/(ωhLq)。可以看到高频电流的幅值包络里同时包含了转子位置θ和电感信息。通过提取电流矢量的椭圆轨迹长短轴就能解出Ld和LqLd Vh / (ωh * Idh_amp) Lq Vh / (ωh * Iqh_amp)实际操作中我们不需要手动去拟合椭圆。更工程化的做法是对高频电流做同步解调乘以同频正弦和余弦再低通滤波得到两个直流量分别对应d轴和q轴的高频电流幅值然后直接套上面的公式。提示这里的推导假设了电机是理想的凸极模型没有考虑交叉饱和和涡流损耗。实际电机在高频下会有铁损等效电感会略小于静态电感这个偏差在5%~15%左右做高精度控制时需要补偿。3. 工程实现的关键细节与参数选择3.1 注入频率和幅值怎么定这是实操中最容易翻车的地方。注入频率选高了PWM分辨率不够电流采样噪声大选低了跟基波耦合解调不出来。我的经验公式是ωh 2π * fh, fh (0.1 ~ 0.3) * fsw其中fsw是PWM开关频率。比如10kHz开关频率fh选1kHz到3kHz。但还要满足fh 10 * fe基波频率如果电机最高运行频率是200Hz那fh至少2kHz。两个条件取交集。注入幅值Vh的选择更微妙。太小了信噪比不够电流响应淹没在噪声里太大了电机发热、噪声、转矩脉动都上来了。一般取额定电压的5%~15%Vh (0.05 ~ 0.15) * Vdc / sqrt(3)以300V直流母线为例Vh大约在8V到26V之间。我通常从10%开始试观察高频电流幅值是否在额定电流的5%~20%范围内。如果电流太小加大Vh如果电机明显发热或啸叫减小Vh。下面这张表是我在几个不同功率等级电机上实测的推荐值供参考电机功率开关频率注入频率注入幅值高频电流幅值200W10kHz1.5kHz15V0.3A1kW10kHz1kHz20V0.8A5kW8kHz800Hz30V2.5A15kW6kHz600Hz50V6A注意注入幅值跟母线电压直接相关不同母线电压下要重新标定。上表假设母线电压300V左右。3.2 信号解调的三种实现方式高频电流采回来之后怎么把电感信息“抠”出来有三种常见做法。第一种带通滤波 包络检波。先用带通滤波器把高频电流从基波电流里分离出来中心频率设在fh带宽200~500Hz。然后对高频电流做绝对值或平方运算再低通滤波得到包络。包络的幅值就对应电感。这种方法最简单适合资源紧张的MCU但精度一般受噪声影响大。第二种同步解调锁相解调。把高频电流分别乘以cos(ωht)和sin(ωht)得到iαh * cos(ωh*t) 0.5*Iαh_amp 0.5*Iαh_amp*cos(2*ωh*t) iαh * sin(ωh*t) 0.5*Iαh_amp*sin(2*ωh*t)然后低通滤波去掉2倍频分量剩下的直流量就是幅值。这种方法精度高抗噪好是我最推荐的方案。计算量也不大两个乘法加两个低通滤波而已。第三种DFT离散傅里叶变换单点提取。直接对高频电流做一个周期的DFT提取fh频率处的实部和虚部。精度最高但需要一个完整周期的数据动态响应慢适合离线辨识。我在实际项目中用的是第二种在STM32F407上跑解调加滤波总共耗时不到5微秒完全不影响电流环执行。3.3 低通滤波器的设计要点同步解调之后的低通滤波器截止频率要选好。太低了响应慢电感跟踪跟不上工况变化太高了2倍频分量滤不干净纹波大。截止频率fc一般取fh的1/10到1/5fc (0.1 ~ 0.2) * fh比如fh1kHzfc选100~200Hz。滤波器阶数用二阶巴特沃斯就够了再高没必要反而增加相位滞后。离散化的时候注意如果电流环执行频率是10kHz那低通滤波器的采样频率就是10kHz。用双线性变换把模拟滤波器转成数字滤波器系数算好之后直接写差分方程。实操心得我习惯在代码里把滤波器系数做成可调参数调试阶段用上位机实时改找到最佳值后再固化。这样比反复烧录程序快得多。4. 从零搭建一套电感辨识流程4.1 硬件与软件环境准备硬件上需要一台待测电机、一套三相逆变器、一个能采三相电流的控制器、一个直流电源。如果要做在线辨识还需要编码器或旋变给转子位置离线辨识不需要。软件环境我用的主控是TI的TMS320F28069CCS开发环境电流环中断频率10kHz。如果你用STM32F4系列也够用但要注意浮点运算能力F1系列没有FPU跑浮点滤波会很吃力。代码框架分四块高频注入模块在电流环中断里叠加高频电压到d轴或α-β轴电流采样与预处理采三相电流Clarke变换带通滤波提取高频分量同步解调与低通滤波提取高频电流幅值电感计算与输出套公式算Ld、Lq做限幅和滤波后输出4.2 离线辨识的完整操作步骤离线辨识最简单电机不转没有基波干扰信噪比最高。步骤如下第一步电机静止转子定位。给d轴通一个直流电流比如额定电流的50%持续1秒把转子拉到d轴对齐位置。这一步是为了让转子位置已知θe0。第二步配置注入参数。设定fh1kHzVh20V注入时间2秒。注入方式选旋转注入在α-β轴叠加。第三步采集高频电流。在每个PWM周期采样三相电流做Clarke变换得到iα、iβ。用中心频率1kHz、带宽400Hz的带通滤波器提取高频分量。第四步同步解调。将iαh和iβh分别乘以cos(ωht)和sin(ωht)低通滤波fc150Hz得到四个直流量Iα_cos、Iα_sin、Iβ_cos、Iβ_sin。第五步计算电感。根据前面的推导高频电流矢量的椭圆轨迹长短轴对应Ld和Lq。具体计算Ih_amp sqrt(Iα_cos^2 Iα_sin^2 Iβ_cos^2 Iβ_sin^2) θ_ellipse 0.5 * atan2(2*(Iα_cos*Iβ_cos Iα_sin*Iβ_sin), Iα_cos^2 Iα_sin^2 - Iβ_cos^2 - Iβ_sin^2) Ld Vh / (ωh * Ih_amp * (1 |cos(2*θ_ellipse)|) / 2) Lq Vh / (ωh * Ih_amp * (1 - |cos(2*θ_ellipse)|) / 2)如果觉得椭圆拟合太麻烦有个简化做法分别在d轴和q轴注入脉振信号各测一次。先注入d轴测出Idh_ampLd Vh/(ωhIdh_amp)再注入q轴测出Iqh_ampLq Vh/(ωhIqh_amp)。这样计算量小很多精度也够用。第六步重复验证。改变注入幅值比如15V、20V、25V各测三次取平均。如果三次结果偏差超过5%说明信噪比不够要加大Vh或优化滤波。4.3 在线辨识的注意事项在线辨识的难点在于基波电流和高频电流混在一起而且基波幅值通常比高频大得多基波可能几十安高频才零点几安。带通滤波器的阻带衰减必须足够大否则基波泄漏会淹没高频信号。我的做法是带通滤波器用四阶巴特沃斯中心频率fh带宽±200Hz。在fh处增益为1在基波频率处衰减至少60dB。这样即使基波是高频的100倍滤波后也只剩1/1000不会干扰。另一个坑是PWM死区效应。死区会导致输出电压畸变产生低次谐波这些谐波可能落在带通滤波器的通带边缘。解决办法是在注入电压上叠加死区补偿或者把注入频率选得离死区谐波远一点。还有采样同步问题。高频电流的采样必须跟PWM载波同步否则会有相位误差。我一般把采样点放在PWM周期的中点避开开关瞬间的振铃。踩过的坑有一次在线辨识时电机运行在低速大扭矩工况电感辨识结果跳变很厉害。排查发现是磁饱和导致电感快速变化而我的低通滤波器截止频率只有50Hz跟踪跟不上。后来把fc提到200Hz同时加了变化率限幅才稳定下来。5. 常见问题排查与实战避坑指南5.1 高频电流采不到或幅值异常这是最常见的问题。现象是解调出来的高频电流幅值接近零或者忽大忽小。排查顺序检查注入电压是否真的加上了。用示波器看逆变器输出相电压应该有明显的高频纹波。如果没有检查代码里注入模块是否被正确调用或者注入幅值是否被限幅了。检查带通滤波器中心频率。如果fh设1kHz但滤波器中心频率算错了比如离散化系数写错高频信号会被滤掉。用MATLAB或Python先仿真验证滤波器频响。检查电流采样时序。如果采样点正好落在高频电流的过零点那采到的就是零。把采样点移到高频周期的峰值附近。检查电机是否真的静止。如果电机在转基波反电势会干扰高频响应。离线辨识时确保电机堵转或空载。5.2 电感辨识结果偏差大如果辨识出的Ld、Lq跟铭牌值差很多超过30%可能的原因注入频率太低电阻压降不可忽略模型简化不成立。提高fh试试。注入幅值太大导致磁饱和电感下降。减小Vh再测。交叉饱和效应d轴电流影响q轴电感反之亦然。如果电机本身饱和严重需要在不同电流点分别辨识做成二维查表。铁损等效电阻高频下铁损明显等效电路里电感并联了一个电阻导致测出的电感偏小。这个偏差通常在10%左右可以通过提高fh来减小。下面这张表是我整理的问题速查表现象可能原因排查方法解决措施高频电流幅值接近零注入未生效/滤波器中心频率错示波器看相电压/仿真滤波器检查代码/重算系数电感值偏大注入频率太低/幅值太小提高fh/加大Vh重新标定电感值偏小磁饱和/铁损减小Vh/提高fh多点辨识/补偿结果跳变低通滤波截止频率太高/基波干扰降低fc/加强带通滤波优化滤波器电机发热/啸叫注入幅值太大测量高频电流幅值减小Vh5.3 在线辨识的稳定性问题在线辨识时电感值会随工况变化如果直接把辨识结果喂给电流环可能导致参数突变、系统振荡。我的做法是对辨识结果做变化率限幅比如每个控制周期电感变化不超过1%加一个一阶低通滤波时间常数50~100ms设置合理范围限幅比如Ld在0.5~2倍铭牌值之间超出就保持上一次有效值这样即使辨识偶尔跳变也不会对控制环造成冲击。独家技巧我习惯在辨识模块里加一个“置信度”标志。当高频电流幅值在合理范围内、解调信噪比高于阈值时置信度为1否则为0。只有置信度为1时才更新电感值否则保持。这个简单的逻辑能过滤掉90%的异常跳变。6. 进阶玩法把电感辨识做成产品级功能6.1 参数自整定与电流环联动电感辨识的最终目的是服务控制。我现在的做法是上电时先做一次离线辨识得到Ld、Lq的初始值自动计算电流环PI参数Kp ωc * L Ki ωc * R其中ωc是期望的电流环带宽一般取开关频率的1/10到1/20。比如10kHz开关频率ωc取500~1000rad/s。这样每次换电机或换工况控制器都能自动适配不需要人工调参。运行过程中在线辨识持续跟踪电感变化PI参数也跟着微调。但注意在线调整PI参数要慢否则会引入额外振荡。我一般只在电感变化超过20%时才更新PI参数。6.2 无位置传感器控制的融合高频注入法本身就是无位置传感器控制的核心技术之一。电感辨识和位置观测可以共用同一套高频信号——注入一个信号同时解调出电感信息和转子位置。具体做法旋转高频电压注入后高频电流矢量的椭圆轨迹长轴方向就是d轴方向也就是转子位置。椭圆的长短轴比就是凸极率Lq/Ld。所以一次注入两个信息都拿到了。我在一个风机项目上就是这么干的低速时用高频注入观测位置同时辨识电感高速时切换到反电势观测电感值用低速时辨识的结果。全速域运行平稳位置误差小于5度。6.3 多电机适配的工程化考虑如果你做的产品要适配不同型号的电机电感辨识模块需要做成参数化的。我的做法是把注入频率、幅值、滤波器系数做成配置表不同电机加载不同配置辨识流程做成状态机上电自动执行不需要人工干预辨识结果存入非易失存储器下次上电直接加载只有检测到电机更换时才重新辨识这样产线工人不需要懂算法接上电机上电就行大大降低了使用门槛。7. 我在这条路上踩过的几个坑第一个坑是滤波器离散化。早期我直接用MATLAB的c2d函数把模拟滤波器转成数字滤波器没注意采样频率和预畸变结果高频段频响完全不对。后来老老实实用双线性变换手动推导或者用MATLAB的bilinear函数加预畸变参数才解决。第二个坑是注入频率跟PWM谐波重合。有一次选fh2kHz开关频率10kHz结果2kHz正好是开关频率的1/5PWM边带谐波落在注入频率上解调出来全是噪声。后来把fh改成1.7kHz避开谐波立刻干净了。选注入频率时一定要避开开关频率的整数分之一。第三个坑是电机绕组不对称。有一台电机三相电感不一致导致高频电流负序分量很大解调出的椭圆轨迹畸变电感辨识误差超过20%。后来在算法里加了负序补偿才把精度拉回来。如果你的电机是手工绕制的这个问题要特别注意。第四个坑是温度影响。电感本身对温度不敏感但永磁体的磁链随温度变化会影响高频下的等效电感。在高温工况下我实测电感会偏移3%~5%。如果应用对精度要求极高需要做温度补偿。这套方法我从实验室搬到产线前后调了大概三个月。现在整套辨识流程跑下来离线辨识精度能到3%以内在线跟踪误差5%左右完全满足工业伺服和电驱系统的需求。如果你也在做类似的事情希望这些经验能帮你少走点弯路。
返回列表