ARTICLE DETAIL

资讯详情

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

FOC中断里Ud/Uq与控制频率、HFI注入频率的设计链路

FOC中断里Ud/Uq与控制频率、HFI注入频率的设计链路 前阵子调一个无感FOC项目低速段的高频注入HFI位置估计突然乱跳电流波形肉眼看过去就是一层毛刺。查了三天根子居然不在解调算法而在FOC中断里Ud/Uq的更新时序和注入频率的比值设计上。那次经历让我把中断、Ud/Uq、控制频率和HFI注入频率从头捋了一遍才发现这几个参数根本不是孤立存在的控制频率决定了FOC中断的节奏Ud/Uq是中断里算出来的核心结果而HFI注入频率则必须在控制频率的约束下设计。这篇就按这条链路讲透适合正在调无感FOC、或者刚把SVPWM跑通想往深了做的人。1. FOC中断是一切的起点控制频率怎么来的1.1 中断里从头到尾的任务链FOC代码里的“控制频率”其实就是定时器中断被触发的频率。STM32系的芯片基本都挂在PWM的定时器上配置里写死载波频率10kHz那中断一秒钟进来一万次每次都要把下面这一串干完读ADC结果通常由DMA搬到内存里如果是母线采样方案做三相电流重构否则直接读两相电流Clarke变换把三相电流从abc坐标系转到αβ静止坐标系Park变换把αβ电流转到dq旋转坐标系这一步需要转子角度θ两个电流环PI分别输出Ud和Uq逆Park变换把dq电压转回αβ坐标系得到Uα、UβSVPWM把Uα、Uβ换算成三路比较器的占空比写PWM比较寄存器退出中断等下一次触发。这个清单每个周期都完整跑一遍。以10kHz为例一个周期只有100μs中断里所有的浮点运算、条件判断、查表全部要在这100μs内完成否则就会挤占下一个周期的采样窗口。我见过有人把速度环也塞进这个中断结果20kHz的PWM下根本没时间跑满反而拖垮了电流环的时序。提示如果你在做无感FOC位置观测器滑模、龙伯格、HFI解调一般也放在这个中断里或者至少放在一个和电流环同步的较低频率任务里。观测器的运行频率与控制频率的比值会直接影响估计角度的平滑度和延迟这个放后面细说。1.2 控制频率与PWM频率的组合关系很多人第一次接触FOC代码时会把“PWM频率”和“控制频率”当成同一个东西其实它们可以是倍数关系。单次更新每个PWM周期只在一次中断里更新占空比控制频率 PWM频率。这是最常用的配置比如10kHz PWM 10kHz控制频率。双重更新PWM的上溢和下溢都触发中断、都更新占空比等效控制频率 2 × PWM频率。比如PWM 10kHz控制频率20kHz。好处是电流响应更细腻坏处是CPU负载翻倍、ADC采样时序更紧张。模式PWM频率控制频率中断周期适合场景单次更新10 kHz10 kHz100 μs大多数驱动器双重更新10 kHz20 kHz50 μs带宽要求高、低电感电机单次更新16 kHz16 kHz62.5 μs噪音敏感的伺服高频注入项目里我更推荐先把单次更新的时序理清楚再去碰双重更新因为注入电压的累加、电流采样的相位对齐在单次更新下更容易理解和排查。我见过不少新手一上来就开双采样结果HFI解调乱得没法看最后改回单次更新反而一次跑通。2. Ud/Uq电流环的答卷也是HFI的宿主2.1 从电流误差到Ud/Uq的计算链路标题里写了Ud/Uq有的文档写成U_d/U_q其实说的是同一个东西旋转d-q坐标系下的定子电压指令。这两种写法只是下划线的表达差异在不同厂商的代码、论文里交替出现别被符号绕晕。电流环PI算出来的是电压指令通俗讲就是“电流环为了把Id、Iq追到目标值需要的两个电压分量”。公式写出来很朴素Ud Kp_d × (Id_ref - Id) Ki_d × ∫(Id_ref - Id) dt Uq Kp_q × (Iq_ref - Iq) Ki_q × ∫(Iq_ref - Iq) dt有的工程代码还会叠加上前馈项比如d轴的交叉耦合补偿、反电动势前馈这部分先不展开。关键在于Ud/Uq是建立在转子同步旋转坐标系里的所以后面必须跟着一步逆Park变换用它和当前角度θ合成Uα、Uβ再去驱动SVPWM。有高频注入时Ud/Uq的角色会多一层注入电压通常是直接叠加在Ud或Uq上的这对应脉振注入也有叠加在Uα/Uβ上的对应旋转注入。不管哪种电流环的输出和注入信号都在同一条链路上汇合最终一起被SVPWM调制到PWM波上。正因为它们共用了同一套链路注入频率和控制频率的关系才格外重要。2.2 你写出来的Ud/Uq真正落到电机上时已经滞后了这是我在调试中花了很多时间才真正想明白的一点也是很多新手看原理图时最容易忽略的中断里算出的Ud/Uq并不是在当前时刻作用到电机上的。数字控制的链路是采样时刻读电流 → 中断里计算 → 更新比较寄存器 → 逆变器在下个PWM周期才输出新的占空比。这意味着从电流采样到电压实际作用有一个完整的时间差工程上粗略近似为1.5到2个控制周期。以单次更新10kHz为例采样发生在t0附近的上下溢时刻PI在t0到20μs之间算完占空比在t0写入但逆变器输出电压的平均效果要等到本周期结束也就是t100μs时才真正形成电流响应对这个电压的反映又得再往后拖一段时间。把这笔账算到控制环路上10kHz控制频率1.5个周期就是150μs的纯滞后。如果你想把电流环带宽推到1kHz150μs对应的相位滞后大约54度。相位裕度被吃掉一大半电流环就很容易振荡。这就是“控制频率越高电流环带宽才敢推得越高”的根本原因。在高频注入场景这个延迟还有个额外影响注入电压的相位在dq坐标系里发生了平移解调出来的位置误差信号会带一个恒定相位偏置。如果不补偿观测到的转子角度就和真实角度差一个固定值带载后表现为转矩偏置、效率下降。这一步补偿通常靠标定实现别指望PI输出角度就万事大吉。2.3 电压限幅Ud/Uq超限时会发生什么电流环PI输出如果不管限幅抗积分饱和也无从谈起。Ud、Uq合成为一个电压矢量后幅值不能超过逆变器的线性调制范围。对SVPWM来说相电压峰值极限是Udc除以根号3Umax_svpwm Udc / √3假设母线电压48V那么Umax大约是27.7V。也就是说Ud² Uq² 再开根号一旦超过27.7VSVPWM就进入过调制区。过调制不是不能用但它会引入低频谐波、加剧电流畸变。HFI模式通常在低速下运行低速下反电动势极小需要的Ud/Uq本身不大正常情况下不会碰限幅。真正会碰限幅的情况一是PI参数没调好二是启动瞬间的抗积分饱和没做Ud/Uq瞬间顶到限幅值电流环响应变得很“肉”。注意高频注入电压叠加到Ud/Uq之后总电压有可能在个别PWM周期逼近限幅。如果限幅策略做得粗暴注入信号的波形会被削顶解调出的误差信号出现额外谐波位置估计就会跳。实测下来叠加注入后留出15%到20%的电压裕量是比较稳的做法。3. 控制频率的选择为什么多数项目落在8k~20kHz3.1 控制带宽与数字延迟的对赌控制频率的第一约束来自你想达到的电流环带宽。从自动控制原理看一个控制周期Ts就是一步纯滞后电流环可实现的交越频率大致只有控制频率的1/20到1/10。想推高带宽就得提高控制频率。实际项目中8kHz控制频率适合对成本敏感、电感比较大的电机电流环带宽能到400到800Hz对大多数泵类、风机应用足够10kHz控制频率最通用的配置电流环带宽800Hz到1kHz是很多驱动器和伺服DEMO的默认值16k/20kHz控制频率低电感、高速、高动态场景电流环带宽能到1.5kHz以上但MCU负载和开关损耗也上来了。下面这张速查表是从几个量产项目里凑出来的经验值不是理论值但拿来选型很实用控制频率中断周期大概能实现的电流环带宽MCU负载典型场景8 kHz125 μs400~800 Hz低泵、风机、低成本驱动10 kHz100 μs800 Hz~1 kHz中多数通用伺服12 kHz83.3 μs900 Hz~1.2 kHz中高中小功率伺服16 kHz62.5 μs1~1.5 kHz高低电感、低噪音需求20 kHz50 μs1.2~1.8 kHz很高高端伺服、机器人关节3.2 单片机的算力预算一个控制周期只有几十微秒控制频率每高一档中断周期就明显缩短。20kHz对应50μs你要在这50μs里完成前面说的八步任务链。拿常见的Cortex-M4比如STM32F405在168MHz下运行举例浮点FOC八步大概要15到25μs再加上HFI解调、位置观测器、保护逻辑20kHz下算力余量非常紧张。如果你的项目既想要20kHz控制频率又想跑HFI我的建议是分频处理。也就是说控制频率20kHz但HFI解调部分降频到10kHz甚至5kHz执行位置观测器可以降到2kHz。很多商业方案都是这么干的。高频注入的“高频”是相对电机电频率而言的不是相对控制频率而言的没必要让所有计算在每个中断里暴力跑满。这里分享一个我的判断标准如果你在一个中断里开始纠结“要不要省掉这个滤波器的历史值数组”说明控制频率的选型已经压到算力极限了。省掉滤波器尺寸等于牺牲解调质量不如果断降一档控制频率把时序做干净。3.3 与控制频率相关的隐性代价开关损耗PWM频率提高逆变器开关次数线性上涨损耗也跟着涨。散热条件差的小板子在这点上比MCU负载更早到达瓶颈。死区影响死区时间占PWM周期的比例控制频率越高越明显。死区会带来电压误差和电流畸变对HFI这种靠高频电流小信号解调的场景尤其不利。10kHz下死区2μs占比2%20kHz下同样2μs就占4%影响直接翻倍。ADC采样窗口控制频率越高留给ADC采样、转换和DMA传输的时间窗越窄。如果采样时间不足相位电流重构会引入误差这部分误差比HFI注入信号混叠更难排查。控制频率的选择本质上是四线博弈带宽需求、算力上限、开关损耗、死区占比四者互相牵制。对HFI项目死区占比这个指标经常被忽略但它恰恰是低速位置估计精度的主要干扰源之一。4. HFI注入频率无感低速段的关键参数设计4.1 为什么要注入高频信号无感FOC在零低速段的痛点很明显反电动势正比于转速速度越低反电动势越小到了零速干脆没有普通的反电动势法观测器直接失效。高频注入法是绕开这个问题的经典手段主动往电机里注入一个高频电压然后从高频电流响应里抠出转子位置信息。它的物理基础是凸极性。表贴式电机虽然Ld约等于Lq但磁路饱和时d轴和q轴的高频阻抗会出现差异内置式电机本身就有凸极。不管哪种情况转子位置都会被调制到高频电流响应的幅值或相位里再用锁相环或反正切解调出来。这里的“高频”指的是比电机电频率高很多、又远低于PWM控制频率的频段。比如一个电机额定转速3000rpm、4对极电频率最高200Hz那么注入频率取500Hz到2kHz都很合适既不会和基波打架又能保证足够的采样点数。4.2 注入频率的上下边界怎么卡注入频率有两条硬边界一上一下。下边界是“和电机电频率拉开距离”。注入信号要能在解调端和基波电流分离电频率和注入频率之间至少要隔一个数量级或者一个明显的频带空隙否则你想用来分辨位置的信号会被正常驱动电流淹没。电机高速时电频率会逼近注入频率这也是HFI一般只用于低速段的根本原因。上边界是采样定理。数字控制里电流是被离散采样的。如果采样频率通常等于控制频率是Fs最高可无混叠恢复的信号频率是Fs/2。但工程上不能卡在奈奎斯特临界值你至少要让注入频率等于控制频率的1/10到1/4才能在每一个注入周期里拿到足够数量的采样点去做解调。以控制频率10kHz为例注入频率500Hz每周期20个采样点解调非常稳但注入频率偏低需要再处理电流环和位置环的分离注入频率1kHz每周期10个采样点我最常用的配置信噪比和解调复杂度平衡得很好注入频率2.5kHz每周期只有4个采样点勉强能用但低通滤波和延迟补偿的难度明显上升。如果控制频率是20kHz注入频率可以放宽到2kHz左右对应每周期10个采样点这也是双采样配置的一大优势。4.3 注入幅值、解调带宽与电流环带宽的限制注入幅值我一般取直流母线电压的5%到15%。幅值太低高频电流响应信噪比差位置估计抖动大幅值太高电流纹波大、噪声大还可能把总电压推到限幅区。解调端的低通滤波器或锁相环带宽一般取10到50Hz。这个带宽决定了位置估计的响应速度也决定了它对转速变化的跟踪能力。带宽设高了噪声和振铃都上来带宽设低了加减速时位置跟踪滞后明显。还有一个容易被忽视的约束电流环带宽和注入频率之间也要拉开距离。电流环的本质是PID它对任何频率成分都有响应。如果电流环带宽比注入频率高PI环路就会去“追”高频注入电流把注入信号当成误差来消除结果就是解调端看到的信号衰减甚至消失。经验法则是电流环带宽尽量低于注入频率的二分之一到三分之一或者专门做一个陷波滤波器把注入频率处的响应滤掉。我在低速HFI项目里常把电流环PI带宽压到300Hz左右注入频率设在1kHz。这样PI基本不响应注入成分解调时能拿到干净的误差信号。代价是电流环动态变差所以高低速切换时我会换一组PI参数这个后面详说。5. 把FOC中断和HFI排进同一个时间表实操与踩坑5.1 一种经过验证的中断时序与代码结构以下是我在STM32平台上用过很多次的结构单次更新控制频率和PWM都是10kHz上溢中断触发读ADC在当前周期的采样窗口末端拿到三相电流跑Clarke和Park得到Id、Iq跑电流环PI得到Ud、Uq把高频注入的查找表值叠加到Ud上跑逆Park和SVPWM写比较寄存器退出中断前更新高频注入的相位累加器。伪代码示意def foc_isr(): ia, ib read_adc() i_alpha, i_beta clarke(ia, ib) i_d, i_q park(i_alpha, i_beta, theta) ud pi_d(i_d_ref - i_d) uq pi_q(i_q_ref - i_q) ud_inj, phase_acc hfi_lookup(phase_acc) ud ud_inj u_alpha, u_beta inv_park(ud, uq, theta) ta, tb, tc svpwm(u_alpha, u_beta) update_compare(ta, tb, tc)这段代码看起来简单但有两个细节值得注意。第一注入是叠加在d轴、q轴还是αβ轴取决于你用的注入策略。上面演示的是脉振d轴注入代码里必须写清楚叠加点否则解调时极性会反。第二相位累加器的更新一定要放在中断末尾保证下次中断时查找表指针已经前进了一步不要把它和电流环计算混在一起。5.2 注入电压的生成查找表与相位累加器高频注入信号不是真的另起一个高频PWM而是在每个控制周期里改变叠加在Ud/Uq上的电压值让输出序列的包络呈现正弦变化。所以核心实现就是一个查找表和一个相位累加器。相位累加器的步长取决于注入频率和控制频率的比值step 2π × Finj / FcFinj1kHz、Fc10kHz时step 2π × 0.1 36度。每个中断相位累加一次查正弦表乘上注入幅值加进Ud。这个方法的精度取决于查找表长度。我用512点的表1kHz注入时分辨率足够。需要注意如果相位增量和π的整除关系不好会出现周期性取整误差时间长了可能产生低频漂移。查找表点数取2的幂比如512或1024配合相位累加的定点取整可以把漂移压到最小。5.3 我踩过的四个坑这四个坑是我在实际项目里逐个踩过才想明白的直接列出来供参考。坑一注入频率与采样频率接近导致混叠。我最早图省事把注入频率设成3kHz控制频率10kHz。表面看每周期3.3个采样点还觉得够用结果解调出来的信号杂乱无章。问题出在3kHz已经接近10kHz采样率的奈奎斯特边缘混叠分量直接落在了解调低频段。后来把注入频率降到1kHz问题立刻消失。实测教训宁可降低注入频率也不要让注入频率超过控制频率的四分之一。坑二采样点落在注入信号过零点附近。高频注入会让电流里出现一个与注入电压不同相的高频分量。如果采样时刻恰好落在该分量过零点你采到的电流几乎不含位置信息解调会间歇性掉链子。解决思路是调整PWM采样时刻或者在多个采样点之间做平均或滤波不要只依赖单点采样。我后来把采样窗口从PWM上溢时刻移到周期中间位置估计的抖动明显下降。坑三电流环PI把注入电压“消化”了。一次我为了提高动态响应把电流环带宽从300Hz提到了800Hz结果HFI位置估计开始抖动。原因就是我前面说的PI的响应频率已经覆盖了1kHz的注入频率它把注入电流当成误差去压等效削弱了注入信号。把带宽调回300Hz或者加陷波器问题就没了。如果你的项目要在高低速之间切换建议为HFI模式和正常模式分别准备一组PI参数切换时动态换参不要共用一组参数硬扛两个场景。坑四Finj与Fc非整数比出现拍频。Finj1.5kHz、Fc10kHz时采样相对注入相位每个周期移动54度解调低频端会出现周期性的拍频纹波表现为位置估计周期性摆动。要么把Finj改成Fc的整数分之一比如1kHz要么在解调时对采样序列做重采样。工程上最省事的做法就是把Finj固定在Fc的五分之一到十分之一之间选整数除法干净的值。5.4 调试HFI频率参数时的一个实用习惯HFI这东西参数表上有无数个“推荐值”但每个电机、每个驱动板都不一样最终只能靠实测收敛。我的建议是先固定控制频率再把注入频率按控制频率的十分之一起调幅值从5%母线电压起调重点盯着位置估计的噪声方差和电流波形的毛刺。每次只改一个参数记录波形变化再决定下一步往哪个方向动。这样踩坑的成本最低调出来的参数才真正属于你的系统。实际项目里注入频率从1kHz调到1.25kHz可能就够让位置误差显著变化别迷信理论公式多花半小时在示波器上比在代码里反复试参数要快得多。控制频率定了中断时序干净了Ud/Uq没有额外抖动HFI的注入问题往往就解决了一大半。
返回列表