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

文章详情

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

无感FOC关键参数:中断、Ud/Uq与HFI注入频率详解

无感FOC关键参数:中断、Ud/Uq与HFI注入频率详解 干电机控制的兄弟姐妹们迟早要跟FOC正面硬碰硬。无感FOC里中断、Ud/Uq、控制频率、HFI注入频率这几个词拆开都认识凑在一起就能让你抓狂。我调试无感FOC那阵子白天看波形晚上啃文档踩过的坑都能填满一个游泳池。今天就把中断、Ud/Uq、控制频率和HFI注入频率这四根线彻底捋直从原理到参数计算再到实际调试经验一次讲清楚。这篇内容适合正在做PMSM无感FOC控制的学生、嵌入式工程师以及想从有感切无感但被低速启动卡住的朋友。看完你会明白Ud/Uq到底是什么鬼控制频率怎么跟中断频率匹配高频注入的注入频率为什么不能随便拍脑袋定以及你真的在中断里“跑FOC”时最容易翻车的地方在哪里。1. 为什么中断、Ud/Uq和HFI总是纠缠在一起1.1 FOC的“心跳”从ADC到PWM的每一步FOC本质上是一个实时闭环系统它的每一个控制周期都由“采样-计算-输出”三步组成而这三步全部靠中断来驱动。典型流程是PWM定时器产生载波在载波周期某个时刻触发ADC采样三相电流。ADC转换完成要么触发DMA搬运结果要么直接触发一个中断。在中断服务函数里你做完Clarke变换、Park变换、电流环PI、逆Park变换、SVPWM最后更新PWM比较寄存器。整个流程必须在一个控制周期内跑完所以中断服务函数的执行时间直接决定你能跑多高的控制频率。很多人第一次看FOC代码满脑子疑问为什么中断里这么多代码为什么不能在主循环里慢慢算答案很简单——你算得越慢环路的相位滞后越大电流环的稳定裕度就越低。就好比你开车眼睛看到了弯道但手要过一秒钟才能打方向盘那车早就冲出路面了。1.2 Ud/Uq到底是给谁看的Ud和Uq是Park变换之后在同步旋转坐标系下的d轴和q轴电压指令。这两个值说白了就是电流环PI控制器的输出。在转子磁场定向坐标系下d轴对应励磁方向q轴对应转矩方向。对表贴式PMSMLd近似等于Lqd轴电流通常控制为零所以Ud主要是克服d轴反电动势和耦合项q轴电流则是真正的转矩电流Uq承担了大部分“使劲”的任务。但无感FOC里有个关键区别因为没有物理位置传感器你用的角度是观测器的估计角度而不是真实角度。这就导致Ud/Uq的含义变得微妙——它们不仅仅是电压指令还隐含了角度误差的信息。如果观测器角度偏了电流环会输出奇怪的Ud/Uq补偿波形上能直接看出来。很多新手调试时会盯着Ud/Uq的波形发现它们抖动厉害就以为是电流环参数问题。实际上大概率是观测器没收敛或者角度延迟太大。所以理解Ud/Uq不能孤立地看要结合整个控制链路的时序。2. 控制频率怎么定电流环、速度环、注入频率的三餐关系2.1 电流环频率等于PWM频率先搞清楚采样点常见做法是电流环控制频率等于PWM载波频率或者等于一半的PWM频率。比如PWM频率16kHz那么在PWM周期中点或峰值处采样一个载波周期计算一次FOC电流环就是16kHz。这里要分清几个概念PWM载波频率决定开关管的开关损耗和电流纹波。ADC采样频率可能等于PWM频率也可能一个周期采多次然后取平均。电流环控制频率FOC算法被调用的频率决定电流环带宽。速度环控制频率一般远低于电流环1kHz左右很常见。比如你PWM用20kHz电流环也跑20kHz速度环跑2kHz那主循环里每10个电流环周期才更新一次速度环。这种非对称结构在工程里非常普遍。我这个项目里PWM和电流环都是16kHz速度环1kHz。中断里只做电流环和坐标变换速度环放在主循环里。这就是典型的“快速内环、慢速外环”结构。关键是中断服务函数里绝对不要做除法、浮点开方这种耗时的东西否则控制频率一高整个系统就崩。2.2 速度环频率与“周期错位”速度环更新速度慢意味着它在每个电流环周期看到的转速是“过期的”。这个延迟如果太大会导致电流环的给定转矩和实际需要不一致。怎么理解你把速度环想象成一个指挥官它每1毫秒发一次指令而电流环是个勤快的士兵每62.5微秒就执行一次动作。指挥官已经很努力了但士兵执行期间指挥官的命令还没更新所以士兵只能按照上次的指令干。如果转速变化很快指令更新跟不上转矩就会滞后。所以设计控制频率时要保证速度环带宽至少是电流环带宽的1/10以下。速度环更新周期内电流环已经完成多次调节让电流环去“跟随”转矩指令变化。HFI注入频率也要跟速度环解耦。如果你的注入频率低于速度环带宽那位置误差信号就会被速度环的调节动作淹没根本解调不出来。2.3 高频注入频率在频率坐标上的位置把整个控制系统放在频率轴上重新看一遍就清晰了电流环带宽几百Hz到几kHz受PWM频率限制经验上不超过PWM频率的1/10到1/20。速度环带宽几十Hz上限是电流环带宽的1/10左右。HFI注入频率既要避开电流环带宽也要避开速度环带宽更不能跟PWM谐波混叠。所以注入频率通常选在1kHz到2kHz之间具体要看你的电流环频率。比如电流环16kHz注入频率选2kHz一个注入周期内有8个采样点还能勉强做同步解调。如果你把注入频率提到5kHz那就只剩3个采样点滤波和解调都会很痛苦。3. 高频注入的原理与参数选择3.1 为什么低速就靠HFI续命无感FOC在中高速靠反电动势观测就行但电机静止或低速时反电动势太小信噪比极差。这时候就得强行给电机打“标记”——注入一个已知频率的高频信号通过观察高频电流响应来反推转子位置。原理其实不复杂凸极性电机转子不同位置对应不同的电感高频电流的幅值或相位就会随位置变化。你注入一个高频电压然后从电流里把同频分量抠出来通过解调就能得到位置误差。这就像你在一堆人里喊一嗓子听回音大致判断墙在哪里。3.2 注入频率选择的硬约束注入频率的选择有几个硬约束缺一不可。第一要高于电流环带宽。如果注入频率落在电流环带宽内电流环PI会把你注入的信号当成干扰拼命调节最后注入信号被抵消位置信息根本提取不出来。第二要低于PWM频率的一半也就是采样频率的一半满足奈奎斯特条件。注入频率的谐波不能跟PWM谐波混叠否则滤波器怎么设计都白搭。第三一个注入周期内至少有6-10个采样点否则你连高频电流的幅值都算不准。我实测下来PWM 16kHz、电流环16kHz的板子注入频率选1kHz最稳。1kHz时一个注入周期16个采样点做带通滤波和同步解调都很从容。曾经试过2kHz也能跑但相位延迟明显变大位置收敛变慢。注入电压幅值也很讲究一般取母线电压的5%到10%。太大了会增加损耗和噪声太小了解调信号被淹没。具体数值要跟你的电流采样分辨率配合最好在开环状态下先注入用示波器看高频电流幅值再微调。3.3 注入位置d轴还是αβ轴注入方式常见两种旋转高压注入在αβ轴叠加圆形旋转的高频电压。脉振高压注入在估计的d轴方向注入高频正弦信号。我推荐先搞脉振注入简单直接解调也直观。注入到估计d轴的电压会在q轴产生一个跟位置误差成正比的高频电流分量用带通滤波提取q轴电流的注入频率分量乘以同频参考信号再低通滤波就得到位置误差信号。这个信号喂给PLL锁相环收敛之后就把转子位置估计出来了。下面是一个简化的脉振注入信号生成与解调伪代码#define HFI_FREQ 1000.0f // 注入频率1kHz #define HFI_AMP 0.08f // 注入幅值8%母线电压 #define PWM_FREQ 16000.0f #define N_PER_CYCLE 16 // 每注入周期采样点数 float hfi_sin sinf(2.0f * PI * HFI_FREQ * t); float u_d_inj HFI_AMP * Vbus * hfi_sin; // 在电流环中断里 float i_q_hf bandpass(i_q, HFI_FREQ, PWM_FREQ / 2); float err lpf(i_q_hf * hfi_sin); // err - 送入PLL - 得到估算角度4. 从FOC中断到高频注入的实操落地4.1 中断优先级与FOC时序FOC中断不能随便用优先级必须最高或者至少高于所有通信类中断。否则你做电流采样算到一半被USART中断打断等回去算完PWM该更新的时刻已经过去了输出晚了一个周期电流环直接起飞。我的做法是让定时器更新事件产生ADC触发ADC中断触发FOC计算。FOC中断优先级设为唯一的抢占优先级最低数值即最高优先级里头只干最核心的事读ADC、坐标变换、PI、SVPWM、更新PWM寄存器。速度环和HFI解调的低通滤波全部拆出去要么放在主循环要么用另一个低优先级定时器处理。中断里不能等。比如ADC转换完成标志位如果你用DMA就不用等直接读DMA寄存器里的结果就行。我见过有人中断里写while(ADC_GetFlagStatus(RESET)RESET)来等标志位那种代码看着都想哭。4.2 代码级实现注入信号加入控制环路把HFI注入加进已有的FOC代码核心是改两个地方第一在逆Park变换之前把注入电压加在估计d轴电压上。注意不要加到真实Ud上而是加到Ud_ref上然后再做逆Park。第二在电流采样之后对q轴电流做带通滤波提取注入频率分量再解调。带通滤波器的实现有很多种最简单的就是二阶IIR带通中心频率1kHzQ值取5到10。Q值太高收敛慢太低会串扰。我实际用过一阶带通加同步解调效果也够。关键是滤波器的相位延迟要尽量一致前后两个信号解调时才不会出现额外偏置。4.3 实测效果与波形分析给电机上电先开环转起来然后把注入信号加上去。你会在定子电流波形上看到明显的高频纹波这就是注入信号的痕迹。这时候用示波器看q轴电流经过带通滤波后的波形应该能看到1kHz附近的正弦波。把参考信号跟它相乘再用低通滤波截止频率100Hz拉平得到的直流分量就是位置误差。我实测中堵转情况下位置误差信号稳定在零附近然后手动转动转子误差信号会跟着变化。这其实就是PLL闭环运作的结果。特别注意高频注入会让电机发出高频啸叫这是正常的不用慌。如果你听到的是“吱吱”的持续高频声说明注入频率在听觉范围且幅值偏大。降低注入幅值到5%母线电压叫声会明显减弱同时还能保持位置跟踪。5. 常见问题与排查技巧实录5.1 中断跑飞、频率不对齐怎么办现象一FOC中断偶尔卡死系统跑一段时间就失控。排查顺序先看中断里有没有调用了printf或者延时的蠢操作再看中断优先级是不是被别的外设抢占实在不行用IO翻转测量中断执行时间和PWM周期比对。我遇到过最坑的ADC采集用的DMA传输完成中断和FOC中断是两个不同中断入口DMA中断优先级更高导致FOC计算被不断抢占。把DMA直接配置成循环模式用DMA标志位在FOC中断里读取问题迎刃而解。5.2 Ud/Uq波形异常的排查Ud/Uq在无感FOC里是诊断利器。如果Uq持续饱和到限幅值大概率是电流环跑不过去要么就是速度环给定转矩超过电机能力。如果Ud和Uq都有较大的抖动优先怀疑观测器的角度滤波和延迟补偿。这里有个技巧调好电流环之后把速度环断开直接给一个恒定速度指令观察Ud/Uq是否平滑。如果不平滑回头查电流环PI如果平滑再查速度环。5.3 HFI不收敛的排查速查表下面是我整理的HFI调试问题速查表遇到问题直接照着查。症状可能原因排查方法位置误差信号始终为零注入信号没加对地方检查是不是加到了实际d轴而不是估计d轴位置误差信号噪声巨大带通滤波器中心频率不对用示波器看滤波前后的频率成分电机启动时震荡严重注入频率太低和速度环带宽重叠拉高注入频率到2kHz同时调低速度环带宽位置收敛到固定偏差解调参考信号相位延迟给参考信号加一个相位补偿角度低速能转高速就飞注入信号在高速时被反电动势淹没中高速切换回反电动势观测器做融合过渡针对“位置收敛到固定偏差”这一条我踩过最深。当时怎么调PLL都有一两度的角度偏置后来发现是带通滤波器在1kHz附近有60度相位延迟加上电流环本身的延迟一共快90度了。给参考信号补一个固定相位之后偏置基本消失。调试HFI有个笨办法但非常有效用一个外部编码器或手摇转子把真实角度和估计角度打印出来画波形。别嫌麻烦很多莫名其妙的相位问题都能一眼看穿。5.4 一个真实的启动调试案例我曾经做过一个项目无感FOC驱动一个小功率PMSM要求低速0.5Hz以下平稳运转。最开始直接注入1.5kHz、幅值8%电压电机启动时总在正负20度之间震荡根本锁不住。排查下来问题出在位置环PLL带宽太高。HFI解调出来的位置误差信号经过低通滤波后带宽只有50Hz我却给了PLL一个300Hz的带宽结果PLL把噪声全部放大了。把PLL带宽降到30Hz之后电机启动平稳用手捏住转子它会轻微抖一下然后稳稳停住但不会乱转。这个案例说明HFI的精度和收敛速度是相互制约的你必须根据自己的应用场景找一个平衡点。别指望一套参数跑遍所有工况。6. 个人调试心得与建议做了这么多无感FOC项目我最大的体会是控制频率不能贪高注入频率不能乱选中断里不能堆垃圾代码。所有看似无关的参数实际上都在频率这根轴上有明确的位置你把它们画在一张频率坐标图上冲突一眼就能看出来。最后分享一个小技巧也是我后来一直沿用的调试套路给FOC中断加一个执行时间统计变量每算完一次就记录一下时间戳在主循环里周期性上报。这样你能精确知道中断占用率频率往上调之前先看看这个数字心里就有底了。HFI注入频率和幅值也一样每次改动之后先看通电电流和噪声再看位置跟踪波形别上来就往极限里推。慢慢地你就会发现无感FOC的所有烦恼其实都源自你对中断、Ud/Uq、控制频率和注入频率的理解还不够系统。把这些理顺了剩下的就只是参数微调的问题了。
返回列表