尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

高频注入无感FOC零低速转子位置估计原理与代码实现

高频注入无感FOC零低速转子位置估计原理与代码实现 做无感FOC的十有八九都被同一个问题卡过电机刚上电或者转速很低的时候反电动势太小滑模观测器也好、磁链观测器也好根本提取不出有效的位置信息。这时候你就必须让电机先动起来而动起来的前提是先知道转子在哪儿。高频注入HFIHigh Frequency Injection干的就是这件事——在零低速下把转子位置“照”出来。这篇文章我想从代码层面把高频注入无感FOC这条链路完整拆开注入什么信号、怎么滤波、怎么解调、锁相环怎么收敛、最后怎么判断磁极的N/S方向。适合正在调无感FOC但被零低速启动折磨的朋友也适合想系统搞懂HFI原理、准备在项目里落地的人。1. 高频注入无感FOC的整体思路拆解1.1 为什么零低速必须换赛道先说清楚一个根本问题为什么反电动势法到了零低速就不好使了。反电动势的大小和转速成正比转速趋近于零的时候反电动势也趋近于零。你靠一个几乎测不到的信号去估算位置信噪比直接崩掉。这时候滑模观测器里的反电动势项基本淹没在噪声里观测出来的角度要么抖动得厉害要么干脆发散。所以业内通行的做法是零低速用高频注入中高速切换回反电动势法中间留一个过渡区域做切换。那高频注入为什么在零低速下还能用因为它利用的不是反电动势而是电机的凸极效应saliency。简单说就是转子结构导致d轴和q轴的电感不一样Ld ≠ Lq这个电感差异和转速无关电机静止时它也存在于物理结构里。你往定子绕组里注入一个高频电压信号电感的不对称会让高频电流响应里带上转子位置的信息。把这部分信息提取出来就能算出转子角度。这个思路有点像拿着手电筒在黑屋子里找东西——你不需要物体自己发光你拿光照它通过反射回来的信号判断它的位置。高频注入就是那束光。1.2 高频注入信号链全景从整体上看一条完整的高频注入无感FOC信号链大概是这样的在估计的d轴电压指令上叠加一个高频余弦或正弦电压信号采集三相电流变换到估计的dq坐标系用带通滤波器把高频响应分量从电流里分离出来对高频分量做同步解调乘以同频的参考信号用低通滤波器把解调后的直流分量提取出来得到位置误差信号把误差信号喂给锁相环PLL或观测器收敛出转子位置和速度因为电感周期是180度解调出来的角度会有N/S极的180度模糊额外做一次磁极极性判断这条链路里每一步都有坑。我强烈建议在动手写代码之前先把这条链路的每个环节在脑子里过一遍想清楚每个信号在做什么、为什么存在。否则你调的时候会完全不知道是哪里出了问题。1.3 旋转高频注入和脉振高频注入怎么选高频注入从实现方式上分两大流派旋转高频注入和脉振高频注入。旋转高频注入是在静止坐标系下注入一个旋转的高频电压矢量类似一个在空间旋转的“探照灯”。它得到的电流响应里直接包含位置信息对电感凸极率的要求相对宽松在内置式永磁同步电机IPMSM上效果很稳。脉振高频注入是在估计的dq坐标系里只在d轴方向注入一个脉振的高频电压。它的优势是实现的数学形式更简洁误差信号直接和位置误差角的正弦值挂钩后面接PLL非常方便。缺点是它本质上要求d轴和q轴电感有明显的差异对凸极率较低的电机比如表贴式SPMSM效果要差一些。我做项目时内置式电机IPMSM我基本都用脉振高频注入因为实现简单、代码量小、收敛稳定表贴式电机如果凸极率实在不够再考虑旋转注入或者换用其他方法。下面这张表是我在实际选型时参考的对比对比项旋转高频注入脉振高频注入注入坐标系静止αβ系估计dq系代码实现复杂度较高较低对凸极率要求相对宽松相对严格误差信号形式需解调两个分量直接正比于sin(2Δθ)适用电机IPMSM、部分SPMSMIPMSM为主滤波设计带通两个解调支路带通一个解调支路2. 从代码角度看信号的注入与解调2.1 注入信号怎么加到控制环先看高频信号怎么注入。脉振高频注入的做法是在估计的d轴电压给定上叠加一个高频余弦分量。这里要注意注入的是电压叠加点一般在电流环PID输出之后、SVPWM之前。如果你的控制周期是PWM中断频率那注入信号需要用角增量累加或者直接用时间戳计算。我贴一段我常用的初始化代码里面定义了注入频率、注入幅值和信号发生器的累加器// 高频注入参数定义 #define HFI_INJ_FREQ 1000.0f // 注入频率1kHz #define HFI_INJ_AMP 30.0f // 注入电压幅值单位V需要根据母线电压调整 #define HFI_INJ_TS 0.0001f // 控制周期100us对应10kHz // 信号发生器状态 static float hfi_theta 0.0f; // 注入信号相位累加器 static float hfi_sin_val 0.0f; static float hfi_cos_val 0.0f; // 中断里更新注入信号 void HFI_GenerateSignal(void) { hfi_theta 2.0f * 3.14159265f * HFI_INJ_FREQ * HFI_INJ_TS; if (hfi_theta 2.0f * 3.14159265f) { hfi_theta - 2.0f * 3.14159265f; } hfi_sin_val arm_sin_f32(hfi_theta); hfi_cos_val arm_cos_f32(hfi_theta); }注入幅值的选择我多说一句。幅值太小电流响应里的高频分量微弱信噪比不够解调出来的误差信号噪声很大幅值太大会产生明显的电磁噪声还可能让电流环饱和甚至过流。我一般从额定电压的3%到8%开始试母线电压越低比例相对越要保守。比如48V母线我先给1.5V左右试示波器看电流波形上的高频纹波大小再微调。注入频率的选择同样有讲究。太低的话电流环会把它当成参考指令跟踪掉就收不到位置信息了太高的话受到数字控制采样率和PWM开关频率的限制。一般取PWM频率的1/10到1/5比较稳妥比如10kHz PWM用1kHz到2kHz注入。频段上也要和电流环带宽拉开距离否则注入信号和电流环响应混在一起不好分离。注入之后电流环会努力跟踪这个高频指令吗这里有个关键点电流环带宽通常远低于注入频率所以电流环基本“追不上”这个高频分量高频注入电压主要激励出的是高频电流响应而不是被电流环指令抵消掉。这也是为什么要选远高于电流环带宽的注入频率。2.2 电流响应的提取与同步解调注入高频电压之后转子位置信息藏在检测到的三相电流里。问题是电流里同时有基波分量、高频分量、PWM开关噪声、测量噪声。所以第一步是滤波。先用带通滤波器把高频分量从电流里选出来。带通中心频率就是注入频率。这里我提醒一个容易犯的错带通滤波器要同时作用于电流的d轴和q轴分量在估计dq系下不要只滤一个轴。滤波完得到电流的高频响应分量 I_dh 和 I_qh。接下来的解调是整个HFI里的核心操作原理上就是乘法器 低通滤波。你把这个高频分量和注入信号的参考波形sin或cos相乘乘积里会出现一个直流项和一个二倍频交流项再用低通把二倍频滤掉剩下的直流项就包含位置误差信息。从数学上看脉振高频注入的解调误差信号可以化简成这样的形式ε ≈ k * (Ld - Lq) * sin(2Δθ)其中 Δθ 是真实转子位置和估计位置之间的误差k 是一个包含注入幅值、频率、电感值的系数。也就是说误差信号和位置误差的两倍角正弦值成正比。如果估计位置等于真实位置即 Δθ 0那误差信号就是0如果估计位置偏了误差信号的正负号能告诉你偏的方向大小告诉你偏了多少。这里有个看起来反直觉、但非常关键的结论位置误差信号不是直接正比于 Δθ而是正比于 sin(2Δθ)。这意味着当角度偏差达到90度的时候误差信号反而回到零。所以锁相环从这个信号里收敛位置的时候必须保证初始角度误差不太大否则可能收敛到错误的平衡点。这也是为什么高频注入通常会搭配一个预定位或者初始位置粗估计的环节。我现在做项目零低速启动前都会先做一次预定位比如注入直流电压把转子拉到一个已知角度让位置误差落在收敛域里。2.3 解调后的误差信号长什么样我们实际操作时解调出来的不是一个光鲜的正弦信号而是一个带噪声的小信号。它的特点有几个第一信号幅值和电机的凸极率直接相关。Ld和Lq差别越大误差信号越大越好解调差别小信号就弱。所以表贴式电机做HFI比内置式电机难度大根源就在这。第二这个信号在真实的转子位置附近是近似线性的。因为小角度下 sin(2Δθ) ≈ 2Δθ所以你可以把整个系统近似成一个线性闭环这对后面设计PLL参数很友好。第三信号里叠加了很多谐波和噪声。低通滤波器的截止频率不能太低否则动态响应太慢也不能太高否则噪声窜进来导致角度抖动。这本质上是在动态和稳态之间做取舍。我在调试时习惯把解调后的误差信号直接通过DAC输出或者用调试器实时观察。如果电机静止时你能看到这个信号随着手动转动转子而呈现正弦变化、且在某个位置过零那说明整条解调链路是通的。如果这个信号杂乱无章优先检查滤波参数和注入信号是否正常工作。3. IIR滤波器的选型、设计与相位补偿3.1 为什么选IIR而不是FIRHFI这条链路里要用到带通滤波器和低通滤波器。很多从算法仿真转过来的人第一反应是FIR因为线性相位特性好。但到了单片机嵌入式环境里我几乎都用IIR原因很朴素计算量小得多。举个例子一个40阶的FIR滤波器每个采样周期要做40次乘加运算而一个二阶IIR只需要5次乘加。单片机上的FOC一般跑在10kHz到20kHz中断里留给HFI滤波的CPU预算本来就不多。IIR用两个二阶节级联就能获得可接受的频率选择性性价比远高于FIR。当然IIR的相位是非线性的而且存在稳定性的问题。但如果我们只关心中心频率附近的相位、并且对滤波器做固定补偿IIR完全够用。工程上稳定压倒一切计算时间就是实打实的资源我宁可在软件里做相位补偿也不想让CPU满载跑FIR。IIR的实现形式我用直接I型结构简单直观数值特性在低阶时也够用。直接II型的状态变量更少但系数顺序处理不好容易出问题。我贴一段标准二阶IIR直接I型的代码// 二阶IIR直接I型 // y[n] b0*x[n] b1*x[n-1] b2*x[n-2] - a1*y[n-1] - a2*y[n-2] typedef struct { float b0, b1, b2; float a1, a2; float x1, x2; float y1, y2; } IIR2_Filter; float IIR2_Process(IIR2_Filter *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; }这里有个细节所有系数要用float或double计算特别是当采样率和中心频率差距较大的时候系数会接近单位圆量化误差可能导致极点漂移甚至不稳定。在Cortex-M4/M7这类带FPU的单片机上直接用float没问题但如果是定点MCU建议把所有系数放大到Q15格式并小心处理乘法溢出。3.2 带通和低通的参数设计实际HFI代码里至少需要两个滤波器第一个是带通滤波器用来从电流里提取高频分量。中心频率取注入频率带宽不需要太宽我一般取中心频率的20%到30%。带宽太窄会拖慢响应带宽太宽会把基波和开关噪声放进来。二阶带通滤波器的参数可以直接用双线性变换法从模拟原型设计也可以查表。实际工程里如果你不想自己推导系数可以用MATLAB的fdatool或者Python的scipy.signal.iirfilter快速生成。关键是生成之后要把系数写到C代码里并且用和实际采样率一样的参数去设计。很多新手在这里犯的错误是仿真里用1e-4的步长设计滤波器到了单片机上采样周期变成1e-4但没改设计参数导致滤波器实际中心频率偏到不知道哪里去了。第二个是低通滤波器用在同步解调之后把二倍频分量滤掉。截止频率要远低于两倍注入频率同时又要高于你期望的位置环带宽。比如注入1kHz解调后出现的二倍频是2kHz低通截止频率我放在50Hz到200Hz之间。再结合锁相环带宽整体上让误差信号的带宽覆盖位置环需求就够了。我给出一个实际用过的参数参考采样率10kHz注入频率1kHz滤波器类型参数用途BPF_Id带通中心1kHz带宽200Hz二阶提取d轴电流高频分量BPF_Iq带通中心1kHz带宽200Hz二阶提取q轴电流高频分量LPF_Err低通截止100Hz二阶滤除解调后的二倍频分量实际调的时候我会把带通滤波器的中心频率做成可配置的这样调试时改注入频率不用重新编译烧录直接在调试器里改参数就行。3.3 相位滞后是最大的坑IIR滤波器最大的坑不是计算量而是相位滞后。带通滤波器在中心频率处会引入一个固定的相位偏移这个偏移会让解调出的误差信号整体平移最终导致锁相环收敛到一个带固定误差的角度。这个误差有多严重如果你用的带通滤波器在1kHz处的相位延迟是30度那解调出来的误差信号相当于真实误差信号平移了30度锁相环收敛后位置角度就错30度。30度的位置误差在FOC里会导致力矩输出偏差启动时可能表现为抖动、反转甚至过流。解决办法有两种。第一种是补偿法先通过仿真或者实测测出带通滤波器在注入频率处的相位然后把这个相位值加到解调参考信号上抵消滤波带来的平移。第二种是无偏解调在解调时同时用sin和cos两个正交参考信号提取出复数形式的误差信号再用atan2计算误差角相位滞后就不会影响最终角度了。我实际项目里两种都用过。无偏解调更稳健因为滤波器的相位不需要提前精确知道但代价是解调链路里要多一路乘法运算和一个atan2。如果你用的是高性能单片机推荐无偏解调如果资源吃紧就用补偿法但一定要在实验台架上验证补偿角度的正确性。这里我想强调一个经验滤波器相位滞后的影响通常在低速或静止时看不出来因为HFI本来就是零低速用的。但如果你在切换区比如转速几百转时做反电动势法和高频注入的切换相位补偿不准确会导致切换瞬间角度跳变、力矩波动甚至过流。所以设计HFI时最好从开始就把相位补偿做成一个可标定的参数切换区再单独校准一遍。4. 位置估计与磁极极性判断4.1 用锁相环从误差信号里收敛角度解调出来的误差信号 ε 正比于 sin(2Δθ)我们需要一个闭环把这个误差收敛到零。工程上最常用的就是锁相环PLL。它的结构并不复杂误差信号经过一个PI调节器输出是角速度角速度再积分得到角度。当误差为零时PLL输出的角度就锁在了真实位置上。PLL的参数整定是HFI里花时间最多的环节之一。带宽太宽角度抖动大带宽太窄收敛慢、动态响应差。我一般这样设计先根据解调误差信号的增益包含电感差、注入幅值等折算出一个等效的线性增益K然后按典型的二阶系统设计PI参数让闭环带宽控制在50Hz到200Hz之间。具体公式不复杂但增益K的测量很关键——一个实用的办法是在零速下手动给定一个角度偏置记录解调误差信号的大小直接反推K。我贴一段PLL实现的代码骨架// HFI位置锁相环 // 输入为解调误差信号 hfi_err输出为估计角度 hfi_theta static float pll_integral 0.0f; static float pll_omega 0.0f; static float pll_theta 0.0f; // PI参数需要根据增益K整定 static float pll_kp 200.0f; static float pll_ki 8000.0f; // 角度归一化到0~2π float HFI_PLL_Update(float hfi_err) { // 比例项 积分项 pll_omega pll_kp * hfi_err pll_integral; // 限幅角速度防止启动时失控 if (pll_omega MAX_HFI_OMEGA) pll_omega MAX_HFI_OMEGA; if (pll_omega -MAX_HFI_OMEGA) pll_omega -MAX_HFI_OMEGA; // 更新积分 pll_integral pll_ki * hfi_err * HFI_INJ_TS; // 角度积分 pll_theta pll_omega * HFI_INJ_TS; if (pll_theta 2.0f * 3.14159265f) { pll_theta - 2.0f * 3.14159265f; } if (pll_theta 0.0f) { pll_theta 2.0f * 3.14159265f; } return pll_theta; }这里有个细节值得多说一句在HFI模式下你得到的电角度里包含了极对数关系电角度 机械角度 × 极对数所以PLL输出的角速度也是电角速度。你要做速度环或者转速显示要除以极对数。很多新手在这里会直接拿电角速度当机械转速结果速度环乱套。另一个容易踩的坑是PLL和电流环的带宽耦合。HFI的PLL带宽如果和电流环带宽接近两个环路之间容易互相干扰体现在电流波形上会出现低频振荡。我一般会把HFI的PLL带宽设计成电流环带宽的1/5到1/10保证时间尺度上分离开。4.2 为什么解调结果有180度模糊现在到了HFI里最容易被忽略、但恰恰最容易导致启动失败的一环磁极极性判断。如果你只做完了上面的解调、滤波、PLL你会发现PLL收敛的角度可能是真实转子位置也可能差了180度。为什么因为前面提到的误差信号是 sin(2Δθ)它的周期是180度。电机的电感分布确实也是以180度为周期的——你把转子从θ转到θ180度电感矩阵完全相同高频注入看到的“凸极”完全一致。但是永磁体的N极和S极是不同的。转子位置如果差180度虽然电感一样但电机产生的力矩方向会相反。如果你带着180度误差启动电机不会正常往前转可能乱抖、反转或过流。这就好比有人告诉你“门在正前方”但没说门是在你面前的那堵墙上还是在墙后面——电感对称性告诉你的位置是“模180度”的你需要额外一步来把模糊消除。4.3 工程上怎么判断N/S极磁极极性判断的物理基础是磁饱和效应。当高频注入的磁场方向和永磁体的磁场方向一致时磁路更容易饱和等效电感会变小相反方向时磁路不容易饱和等效电感相对更大。电感大小直接反映在高频电流响应的幅值上——N极方向电流大S极方向电流小。工程上最常用的极性判断方法有两种。第一种是电压脉冲法。在PLL收敛的角度 θ 和 θπ 两个方向上分别施加同样幅值和宽度的电压脉冲然后比较电流响应大小。电流大的方向就是N极方向。这个方法的实现很直接但需要注意两点一是脉冲幅值要足够大能让磁路进入明显的饱和区否则电感差异太小测不出来二是脉冲宽度不能太宽否则电流太大可能过流或者电机已经开始转动了。我一般用额定电流的30%到50%作为脉冲限幅宽度控制在1ms到3ms。脉冲法在静止状态下很好用但如果你需要在电机旋转中判断极性比如在线切换场景脉冲就不太合适。这时候用二次谐波法。它利用的是磁饱和效应让高频电流响应里出现二倍于注入频率的谐波分量这个分量的相位和磁极方向相关。你可以通过检测这个二次谐波的极性来判断N/S。不过这种方法对采样同步性要求高运算量也大我一般不作为首选。还有一种做法是偏移误差法。原理是给解调参考信号中故意加入一个微小的偏置观察PLL收敛点是否偏移根据偏移方向判断极性。这个方法不需要额外的脉冲注入但它依赖比较精确的模型对电机参数变化敏感我只在一些特定场合用过。综合来看我推荐电压脉冲法作为首选因为它实现简单、对参数不敏感、可解释性强。下面是我常用的极性判断流程HFI的PLL收敛稳定后记录估计角度 θ_est在这基础上分别朝 θ_est 和 θ_est π 方向注入等幅限宽电压脉冲每次脉冲结束后记录峰值电流比较两次数值电流较大的方向为N极方向若N极方向在 θ_est π则最终角度 θ_est π归一化到0~2π启动前用最终角度完成一次位置修正需要说明的是判断极性是一次性的只要电机没有失步、没有重新上电不需要反复判断。所以这个流程放在启动阶段即可不会增加运行时的CPU负担。5. 完整实现流程与代码骨架5.1 初始化与配置HFI的初始化工作不复杂但必须细致。第一步是确定控制参数PWM频率、电流环带宽、注入频率、注入幅值。这些参数之间相互牵连我建议在代码里做成可配置的宏并写好注释。第二步是滤波器系数初始化。无论用MATLAB离线算还是用现成库在线算最后都要填到IIR结构体里。我习惯把带通滤波器和低通滤波器分别封装成独立的模块方便单测和调试。第三步是状态变量清零。特别提醒所有IIR的状态变量、PLL的积分项、注入信号累加器都要在启动时清零否则上一次运行的残留值会污染启动过程。void HFI_Init(void) { // 清零IIR状态 memset(bp_filter_id, 0, sizeof(bp_filter_id)); memset(bp_filter_iq, 0, sizeof(bp_filter_iq)); memset(lp_filter_err, 0, sizeof(lp_filter_err)); // 清零PLL状态 pll_integral 0.0f; pll_omega 0.0f; pll_theta 0.0f; // 清零注入信号累加器 hfi_theta 0.0f; hfi_sin_val 0.0f; hfi_cos_val 0.0f; // 配置滤波器系数在别处计算好 // IIR2_SetCoeff(bp_filter_id, bp_coeffs); // IIR2_SetCoeff(bp_filter_iq, bp_coeffs); // IIR2_SetCoeff(lp_filter_err, lpf_coeffs); }5.2 PWM中断里的高频处理流程HFI的核心处理代码放在电流环中断里。整个流程的顺序很关键我按实际执行顺序列出来读取ADC采样电流做标定和坐标变换先得到αβ轴电流再用估计角度变换到估计dq轴把估计d轴电流和q轴电流分别送入带通滤波器得到高频分量 I_dh、I_qh用同步解调把高频分量转换成误差信号这里使用的是上一步生成的 sin/cos 参考误差信号通过低通滤波器低通滤波后的误差送入PLL更新估计角度和速度用更新后的估计角度做电流环的Park变换、PID计算在PID输出电压的d轴分量上叠加高频注入电压做逆Park变换送入SVPWM并更新占空比这里有个容易错的地方步骤6和步骤7的顺序。理论上应该先用当前周期的估计角度做电流环再叠加注入电压再用同一个角度做逆变换。这样整个控制环的时序是一致的。如果你把角度更新放在电流环之后会出现一拍滞后角度和电压对不上HFI解调出来的误差信号会有额外偏置。我这个流程的C语言骨架大致如下void CurrentLoop_ISR(void) { // 1. 电流采样与坐标变换 float ia Get_CurrentA(); float ib Get_CurrentB(); Park_Clarke_Transform(ia, ib, i_alpha, i_beta, i_d, i_q, pll_theta); // 2. 带通滤波提取高频电流分量 float i_dh IIR2_Process(bp_filter_id, i_d); float i_qh IIR2_Process(bp_filter_iq, i_q); // 3. 同步解调 float err_dh i_dh * hfi_cos_val; float err_qh i_qh * hfi_sin_val; // 具体正负号依系统和参考信号相位而定 float err_raw err_dh - err_qh; // 4. 低通滤波 float err_smooth IIR2_Process(lp_filter_err, err_raw); // 5. PLL更新 pll_theta HFI_PLL_Update(err_smooth); // 6. 电流环PI这一步利用更新后的角度 vd_pi PI_Update(i_d_ref, i_d); vq_pi PI_Update(i_q_ref, i_q); // 7. 叠加高频注入电压 HFI_GenerateSignal(); vd_out vd_pi HFI_INJ_AMP * hfi_cos_val; vq_out vq_pi; // 若使用脉振注入q轴不叠加 // 8. 逆变换与PWM更新 InversePark_Transform(vd_out, vq_out, pll_theta, v_alpha, v_beta); SVPWM_Update(v_alpha, v_beta); }5.3 极性判断的插入时机极性判断是在HFI的PLL收敛之后、电流环正式出力之前做的。这个“收敛之后”怎么判断我一般用一个状态机启动时先让HFI跑固定时间比如50ms到100ms观察PLL输出角度变化是否足够小或者直接用一个“收敛标志”来判断。判断极性时整个控制环需要临时进入一个特殊状态。这时候电流环给定要置零SVPWM先停一拍然后注入脉冲。脉冲注入结束后不能立刻恢复FOC运行因为脉冲测试之后磁路里有剩磁直接跑大电流可能会饱和过流。我习惯在极性判断完成后做一个短暂的去磁过程在d轴反向施加一个小电压脉冲把铁芯里的剩磁消掉再恢复正常的FOC运行。这个过程看起来简单但在实际项目中坑不少。比如脉冲注入时如果电流环还处于自动限幅状态限幅值和脉冲宽度配合不当电流峰值一下就飙上去。我做这块时的经验是极性判断期间完全绕过电流环PI直接开环给电压用ADC采样监控电流峰值超过安全阈值立刻关断PWM并报错。6. 高频注入调试中的常见问题速查6.1 角度偏置与启动反转HFI最典型的故障现象电机静止时一切正常一给启动指令就抖动、反转或直接过流。排查顺序我建议这样走先看解调误差信号是否为标准的正弦形且过零点是否平稳。如果误差信号有直流偏置或波形畸变优先怀疑滤波器相位补偿不准、电流采样偏移未校准、带通滤波器参数不对。接着看PLL收敛后的角度是否稳定如果角度在某个固定值附近抖动说明误差信号噪声太大或PLL带宽太高。最后检查极性判断是否做反了如果N/S判断失败启动瞬间就会反转。你可以用调试器实时改写极性判断的最终角度偏移量手动加180度再启动。如果加了180度后启动就正常了那问题一定出在极性判断逻辑上而不是滤波器或电流环。6.2 高频噪声串到电流环HFI运行时电流环给定里叠加了高频分量这会导致电流波形上有高频纹波。这本身是正常的但如果纹波过大会影响电流环的稳定性和噪声表现。我处理这个问题的思路是在电流反馈通道上做窄带陷波或者让电流环PI的采样和HFI的采样在时间上错开。还有一种很有效的工程办法把注入频率选在PWM边带谐波的间隙里避免和PWM纹波混叠。另外要注意高频注入电压叠加后SVPWM的调制波可能出现饱和。特别是在母线电压利用率本来就高的场合叠加的注入电压可能导致过调制反而让电流环失真。这时候要么降低注入幅值要么在注入叠加前做一个整体电压限幅并提示用户该工况不适合继续注入。6.3 解调信号弱、收敛慢如果你发现电机转起来后角度跟踪明显滞后、启动时收敛时间很长或者某些位置启动容易失败多半是解调信号幅值不够。提高解调信号幅值可以从几个方向入手提高注入电压幅值、优化带通滤波器带宽让更多有用信号通过、降低低通滤波器截止频率来减少噪声抬高信噪比、检查电流采样增益是否设置过低导致高频分量被淹没在量化噪声里。从一个项目经验说起我有一台样机表贴式电机凸极率只有1.1左右解调信号弱到示波器上看几乎是一条直线。后来我发现问题不在算法而在电流采样的ADC触发时刻不对采样点落在了PWM开关噪声尖峰上导致有用信号被大量噪声淹没。把ADC采样点挪到PWM中心对齐之后信号立刻清晰了。这个经验分享出来是因为它提醒我们算法再正确硬件采样不好也一样白搭。高频注入后续的扩展空间我个人在实际操作中的体会是HFI的难点从来不在某一个环节而在整条链路的配合。滤波、解调、PLL、极性判断每一环都是前面一环的结果消费方任何一环的参数变了后面全要跟着调。所以做HFI之前先把信号链在纸上画清楚再把每个环节做成可单独调试的模块最后才联调这样会省掉大量排查时间。最后分享一个调试小技巧在HFI初步跑通后我用一个偏移角度直接写入PLL角度输出让程序认为自己已经锁住了再观察解调误差信号的变化。这能帮助你快速验证解调链路和PLL参数是否正常比盲目调PI参数高效得多。这个内容后续还可以往两个方向扩展一个是高频注入与反电动势法的在线切换策略一个是考虑交叉饱和效应后的凸极轨迹补偿等有精力再写一篇。
返回列表