新闻详情

新闻详情

首页 / 资讯中心 / 详情

无感FOC中的IIR滤波器:从Z平面到高频注入的工程实战

发布时间:2026/10/1 15:04:13来源:尧图网络
无感FOC中的IIR滤波器:从Z平面到高频注入的工程实战
调试无感FOC那阵子我几乎天天对着示波器发愣速度估算波形像心电图电流环输出毛刺扎手好不容易跑起来的电机一加载就开始抖。后来才想明白问题的根源往往不是PI参数没调好而是信号链上到处是没被认真对待的滤波器——滤波器的位置、结构和参数直接决定了控制环路的“视力”。这篇不是从教材抄来的Z平面理论而是把IIR数字滤波器在电机控制里怎么设计、怎么算、怎么用讲透先看清FOC环路上的滤波需求再从Z平面理解IIR的本质接着讲低通/带通滤波器的离散化与参数整定最后落到高频注入这一整套提取转子位置的链路——顺带把DSP定点实现的坑也交代清楚。适合正在调无感FOC、想搞懂高频注入怎么做信号处理、或者第一次把滤波器从MATLAB搬进单片机代码里的工程师。1. FOC环路上的滤波需求信号有多脏滤波就有多重要1.1 电流采样、反电动势和位置信号里的噪声去哪了电机控制里的滤波器不是可有可无的装饰而是控制环路里真正参与闭环的一环。拿最常见的电阻采样电流来说三相电流经过采样电阻、运放、ADC进MCU信号上叠加着PWM开关产生的尖峰、电源纹波和PCB串扰。就算你用了PWM中间的同步采样窗口去避开开关边沿残余的振铃和高频分量仍然存在。这些抖动进入电流环PI后会被控制器直接放大给电机带来附加转矩纹波。你听到电机嗡嗡响很多时候不是机械问题而是噪声被电流环闭环放大了。无感FOC里用来估算转速的反电动势就更“脏”了反电动势信号本身幅值随转速变化里面混着PWM谐波、齿槽转矩引起的扰动以及采样误差带来的高频毛刺。低速时反电动势幅值小信噪比极差不滤波根本没法用。编码器反馈倒相对干净但位置微分得到速度这个过程会放大量化噪声——位置分辨率有限差分之后全是台阶转速环看到这种速度信号会抖得厉害。滤波器要完成的核心任务是从这些混合信号里把“有用的那一段频率”干干净净地摘出来同时不引入过大的相位滞后。这不是随便写个低通就能搞定的必须对滤波器在环路里的位置、截止频率、阶数和实现方式做整体考虑。1.2 从FIR到IIR为什么电机控制几乎只用IIR很多人一上来就问FIR线性相位那么好为什么不用FIRFIR确实能在通带内保持线性相位不歪曲波形但代价是阶数太高。一个截止频率1kHz、采样率10kHz、过渡带稍陡的FIR可能需要几十甚至上百个系数同样的指标IIR用一个二阶节就基本够用了。电机控制里的实时中断是最残酷的资源战场。假设PWM频率10kHz每个PWM周期只有100微秒要在这个时间里完成电流采样、坐标变换、两个PI控制器、观测器、滤波、PWM更新可能还要跑高频注入的解调。每多一个乘法就意味着你要么换更贵的芯片要么牺牲其他算法的裕量。IIR阶数低、计算量小尤其是递归结构让一个二阶双二阶就能实现带通或陷波这正是高频注入场景最需要的“窄带摘取”能力。我在实际工程里几乎只用IIR最多在离线调试阶段用MATLAB里的FIR做个波形分析参考。这不是说FIR不好而是在硬实时的电机控制里性价比决定了IIR是唯一务实的选择。后面所有讨论都基于IIR。2. Z平面才是IIR的“性格测试仪”2.1 从差分方程到系统函数IIR滤波器的本质就是一个递归差分方程y[n] b0x[n] b1x[n-1] b2x[n-2] - a1y[n-1] - a2*y[n-2]二阶为例输出不仅依赖过去的输入还依赖过去的输出。正因为有这个递归项即使输入突然变成0输出也会继续震荡衰减很久这就是“无限冲激响应”这个名字的由来。FOC工程里绝大多数IIR都是二阶双二阶biquad一阶极少数三阶以上的直接结构我基本不用。对差分方程做Z变换就得到系统函数H(z) B(z) / A(z) (b0 b1z^-1 b2z^-2) / (1 a1z^-1 a2z^-2)Z变换把离散信号从时域映射到复平面也就是Z平面。z e^(jωT)这个点在单位圆上走一圈对应的就是频率从直流到采样频率的整个范围。频率响应就是令z e^(jωT)后的H值。换句话说单位圆是滤波器的“频率轴”。这个转换的价值在于滤波器的稳定性、频率选择性、暂态响应全部可以从H(z)的零极点图直接读出来不用每次都拉幅度响应曲线。我在调参时习惯先看零极点图心里对行为就有数了。2.2 极点是滤波器的“命门”极点是A(z)0的根决定了滤波器输出衰减或振荡的节奏。极点离单位圆越近对应频率上的增益峰越尖输出衰减越慢极点一旦跑出单位圆滤波器就直接发散——输出一路增大直到饱和这在电机控制里是灾难性的。看一个最简单的例子一阶低通 y[n] a*y[n-1] (1-a)*x[n]系统函数只有一个极点 z a。当a0.9极点靠近单位圆滤波器“记性好”截止频率低当a0.5记忆短截止频率高。我调参数的时候只要看一眼极点位置就能估算出这个滤波器的截止频率在什么量级根本不用去算完整的幅度响应。极点还有一个特性靠近实轴正半轴对应低频靠近实轴负半轴对应靠近奈奎斯特频率的高频落在复平面上则对应一个谐振峰。带通滤波器的极点就是一对共轭复数它们离单位圆越近谐振峰越尖选择性越好但相位延迟也越大。2.3 零点决定滤波器“堵死”哪些频率零点是B(z)0的根作用是让特定频率的信号完全被压制。经典的一阶低通会把一个零点放在z-1也就是奈奎斯特频率采样率的一半这样最高频分量被彻底干掉。这个零点也是低通滤波器在高频段衰减“贼快”的原因之一。电机控制里我最常用的两个零点安排在Z平面上的分布是速度估算低通零点放z-1压掉采样率一半附近的开关噪声高频注入带通零点放z1直流和z-1奈奎斯特保证基波直流分量和高频开关噪声都不通过只留注入频率附近的窄带信号。理解了零点和极点的位置你就不会再被“低通”“带通”这些名词框住——它们不过是零极点在不同位置上的排布而已。2.4 稳定性判断与定点实现中的极点偏移理论上判断稳定很简单所有极点必须在单位圆内。但工程上浮点系数搬到定点DSP上会引入量化误差极点可能被“挤出”单位圆。我在TMS320C6416上调试时就遇到过一次MATLAB里好好的一对共轭极点换成Q15格式定点系数后低通滤波变成了振荡器输出波形表现得很像电机扭矩异常的共振。排查好久才发现是极点量化后越过了单位圆。从那以后我给自己定了一条规矩所有极点的模值控制在0.95以下留出至少0.05的稳定裕量除非是主动设计谐振点的带通滤波器。这个裕量换来的不是性能损失而是定点和温漂环境下滤波器依旧稳定的底气。3. 低通/带通IIR怎么从“模拟原型”变成“控制器代码”3.1 双线性变换工程上几乎唯一的选择把模拟滤波器比如Butterworth、Chebyshev离散化成数字滤波器的方法有好几种冲激响应不变法、阶跃响应不变法、双线性变换法。电机控制里我几乎只认双线性变换。原因很直接它把整个s平面左半部映射到Z平面单位圆内部稳定的模拟滤波器离散化之后一定稳定而且不产生频谱混叠。双线性变换的映射关系是s (2/Ts) * (1 - z^-1) / (1 z^-1)代价是数字频率和模拟频率不是线性关系而是ωa (2/Ts) * tan(ωd * Ts / 2)其中ωd是数字角频率ωa是用于模拟原型的角频率。所以设计滤波器的截止频率时必须先做频率预畸变拿目标数字截止频率反推模拟截止频率用这个畸变后的频率设计模拟原型再代入双线性变换得到数字系数。3.2 一阶低通算一个可以“抄作业”的例子假设采样率Fs10kHzTs100us想设计一个截止频率500Hz的一阶低通。先做预畸变。数字角频率ωd2π*5003141.6 rad/sωa 20000 * tan(3141.6 * 0.0001 / 2) 20000 * tan(0.157) ≈ 3166 rad/s模拟一阶低通原型 H(s) ωa / (s ωa)代入双线性变换H(z) 3166*(1 z^-1) / [(200003166) - (20000-3166)*z^-1]归一化后得到数字系数b0 b1 0.1367递归系数 g 0.7266差分方程y[n] 0.1367x[n] 0.1367x[n-1] 0.7266*y[n-1]工程上还有一个更快的近似公式适合截止频率远低于采样率的场景fc Fs/20α exp(-2πfcTs) exp(-2π5000.0001) exp(-0.314) ≈ 0.7305然后 y[n] α*y[n-1] (1-α)*x[n]。这个结果和双线性变换算出来的g0.7266非常接近。我个人的习惯是fc/Fs小于1/20时用exp近似省事超过1/20时老实走双线性变换否则截止频率会偏得离谱。3.3 带通滤波器高频注入里的“信号摘取器”带通滤波器让某一小段频率通过其余衰减。它有两个关键参数中心频率f0和品质因数QQ f0 / 带宽。Q越高带宽越窄选择性越好但相位延迟变大、数值稳定性变差。做高频注入时通常向电机注入一个频率为f_h的正弦电压然后要从电流信号里提取出同样频率的响应分量。带通就设在f0 f_hQ取10左右比较合适。这个Q值下带宽约等于f0/10能有效滤掉基波电流、开关噪声和其他谐波又不会让滤波器本身延迟大到不可接受。二阶带通I I R的系数可以直接用经典的双二阶公式算。这里给一个可直接落地的版本中心频率f0、Q值、采样率Fs三个参数输入omega 2pif0/Fsalpha sin(omega) / (2*Q)b0 alpha / (1 alpha)b1 0b2 -alpha / (1 alpha)a1 -2*cos(omega) / (1 alpha)a2 (1 - alpha) / (1 alpha)举个例子f01kHzQ10Fs10kHz。omega0.6283sin0.5878cos0.8090alpha0.0294归一化后的系数b0 0.0286b2 -0.0286a1 -1.5717a2 0.9429差分方程y[n] 0.0286x[n] - 0.0286x[n-2] 1.5717y[n-1] - 0.9429y[n-2]我在仿真里用这个带通做了几组对比基波50Hz被衰减到大约1/100以下直流分量被完全压掉高频注入频率1kHz附近的信号几乎原样通过。这个选择性和计算量的平衡正是电机控制需要的。3.4 截止频率怎么定环路带宽说了算滤波器参数不是随便拍的要和控制环路的带宽匹配。我的经验规律是电流采样滤波截止频率取电流环带宽的5到10倍或者干脆只做轻微滤波主要靠PWM同步采样时序解决噪声。电流环带宽2kHz时采样滤波若设到5kHz相位延迟已经在吃掉宝贵的裕量了。速度滤波速度环带宽一般只有几十Hz所以100到200Hz的一阶低通非常安全能明显平滑速度波动。解调后低通取注入频率的1/10左右再和PLL带宽匹配。记住一个原则滤波器引入的相位滞后和PI控制器的零点一样都会吃掉系统的相位裕度。滤波越重信号越干净但环路越容易不稳定。这个矛盾就是做滤波器参数整定时真正的核心。4. 高频注入里IIR的角色把转子的“微表情”提取出来4.1 高频注入的根本逻辑凸极性高速运转的电机可以靠反电动势估算转子位置但零速和低速时反电动势几乎为零无感FOC就“失明”了。高频注入专门解决零低速下的转子位置观测问题尤其适用于内置式永磁同步电机IPM在两相混合式步进电机上同样有效。原理说起来不复杂PMSM的转子有凸极性d轴和q轴电感不相等。如果你在估计的d轴上叠一个高频电压信号比如1kHz到2kHz的正弦或方波定子电流里会产生对应的高频响应。这个响应的幅值和相位受到“转子实际位置与估计位置之差”的调制——高频电流的空间矢量会随着转子位置转动。把这个调制量解出来就能得到转子位置误差信号再送入PLL或观测器收敛出真实的转子位置。转子初始位置检测、零低速无感启动用的都是这套逻辑。4.2 带通IIR先把高频分量“摘”出来接下来的信号链就是IIR的主场。三相电流采样后先做Clark变换得到αβ轴电流iα、iβ这两个信号里既有低频基波电流也有高频注入电流还混着开关噪声。要提取高频分量用中心频率等于注入频率f_h的带通IIR把iα、iβ分别过一遍输出的就是相对干净的高频响应。这个滤波器放在Clark变换之后、解调之前顺序很关键。我见过有人先解调再滤波基波分量被解调到低频附近后低通很难干净地滤除位置估算里就会混入明显的转速相关纹波。先把带通做完基波和开关噪声被提前压制解调之后的低通负担小得多。4.3 解调与低通把位置误差信号从高频“剥”下来提取到高频电流后做法是乘以同步的sin(ωht)和cos(ωht)做正交解调再用低通IIR滤掉2ωh分量。剩下的直流分量正比于位置误差θerr送进PLL或龙伯格观测器就得到转子的位置和转速。这里的低通参数要小心调。解调后信号里残留2f_h的纹波低通截止频率太高会让纹波泄漏进位置估算形成周期性抖动太低又把位置环路的带宽卡死动态响应变慢。我的经验是把解调后低通设在注入频率的1/10附近比如注入1kHz低通取100Hz再据此调整PLL带宽到几十Hz量级整体响应和噪声之间能取得不错平衡。4.4 群延迟是个隐形杀手IIR滤波器在提取有用信号的同时会给信号注入固定的群延迟。带通在中心频率附近的群延迟约等于1/(π*BW)其中BW是带宽。对1kHz、Q10的带通来说带宽100Hz延迟约3.18ms100Hz的低通延迟也在3ms量级。这两个延迟叠加进位置估算通道会造成位置角度的滞后。低速时这个滞后影响不大但转速一上去问题就来了。假设电机2000rpm、4对极电角速度约837rad/s3.18ms的滞后对应约2.7rad的电角度——这个滞后足以让FOC把电流定向到错误的位置产生扭矩下降甚至失控。实际工程里三个解决办法一是压缩PLL带宽让位置环响应慢到能忽略滞后二是做相位前馈补偿在估计位置上加上一个随转速变化的滞后修正量三是启动完成后切到反电动势观测器把高频注入、带通、解调低通这一整套滤波延迟踢出闭环。第三种是我最常用的切换点通常在电机转速达到额定5%到10%之后。5. 把IIR烧进DSP从仿真系数到可靠运行5.1 三种实现结构为什么我推荐转置直接II型拿到系数只是开始怎么在DSP里实现结构和精度密切相关。直接I型按差分方程原样实现y[n] b0x[n] b1x[n-1] ... - a1y[n-1] - a2y[n-2]思路直观但要同时记录x和y两组历史值。直接II型通过合并延迟链状态变量只有两个w[n-1]和w[n-2]存储节省但中间的w变量可能幅度很大定点实现时溢出风险高。转置直接II型Transposed Direct Form II是先算输出再更新状态每个状态变量的动态范围更好控制对定点运算也更友好。很多电机控制库里的biquad都用这个结构。代码核心只有几行typedef struct { float b0, b1, b2; float a1, a2; // 注意这里的a1/a2是差分方程中的系数符号 float s1, s2; } biquad_t; float biquad_process(biquad_t *f, float x) { float y f-b0 * x f-s1; f-s1 f-b1 * x - f-a1 * y f-s2; f-s2 f-b2 * x - f-a2 * y; return y; }这里有个经典的符号陷阱MATLAB里的系统函数分母是1 a1z^-1 a2z^-2差分方程写出来是“减a1y[n-1]减a2y[n-2]”。所以代码的s1和s2更新里写的是“-a1y”和“-a2y”。如果你把MATLAB算出来的a1直接原样填进去却在更新里写加号滤波器行为和仿真正好相反轻则频率响应不对重则直接振荡。我在代码评审时见过好几个人在这上面翻了车。5.2 定点实现Q格式、溢出与TMS320C6416上的实操TMS320C6416是定点DSPMATLAB仿真是浮点的直接搬系数会出问题。滤波器系数b0、b1、a1、a2取值的模一般小于1可以定标到Q15格式。但状态变量s1、s2的瞬时值可能明显超过±1尤其在阶跃输入时。我踩过的坑是把状态变量也放到Q15结果滤波器输出在输入突变时削顶饱和电流波形上出现明显的平顶电机转矩也跟着抖。稳妥做法是系数用Q15状态变量用Q31的int32保存乘法用C6416的QMPY指令最终输出再缩回Q15。中间累加时还要定期做溢出保护。如果嫌麻烦现在很多DSP也支持浮点但吃透定点逻辑之后你才能在资源紧张时游刃有余地选择。5.3 启动瞬态、模式切换和系数整定滤波器状态变量初值全为0如果输入第一步就是大电流阶跃输出会从0猛跳产生冲击。无感FOC启动时尤其明显位置估算还没收敛滤波器的零初态会加剧启动瞬间的电流拍击。稳妥做法是启动前先给滤波器喂一段实际采样电流做预热或者在初始化时让状态变量承接第一个采样值。还有一个容易被忽略的地方FOC在运行中切换控制模式比如从电流环切到速度环时如果滤波器状态没有平滑过渡输出跳变会直接冲击PI积分器。我在工程里给所有biquad都加了一个“状态保持”接口模式切换前冻结状态变量等新闭环稳定运行后再解锁。这个小功能在调试时救过我很多次。5.4 上板验证的经验清单下面这些检查项是我每次把新滤波器模块烧进DSP之前都会过一遍的在MATLAB用fvtool查看零极点图、幅频响应和群延迟确认极点在单位圆内且留有余量用示波器对比滤波前后的波形确认截止频率行为和仿真一致检查PWM同步采样后的噪声是否仍然过大如果过大先解决采样时序而不是一味加大滤波参数切换时观察输出是否有瞬态跳变做一下温度变化下的稳定性测试定点DSP在高温下如果出现饱和波形会有异常削顶。这些经验不花哨但每一条背后都是实实在在的调试时间换来的。有一次我在客户现场遇到低温环境下电机启动抖动排查到最后就是一个一阶低通的极点余量留得太小温度变化让系数产生了偏移。从那以后零点极点余量的检查就成了我的强制项。IIR这个玩意理论上一节课能讲完工程上值得反复打磨。我后来养成的习惯是每个滤波器在仿真阶段就打印出差分方程系数、零极点位置和群延迟三项数据存成一张表上板之后只改参数表不动滤波器结构代码。这样出了问题先在表里查有没有违反“截止频率远低于采样率”“极点有余量”“群延迟可接受”这三条通常能定位大半问题。希望这篇能帮你少踩几个坑。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

打家劫舍动态规划详解:从状态定义到滚动数组优化 2026/10/1 16:38:06

打家劫舍动态规划详解:从状态定义到滚动数组优化

最近刷 LeetCode Hot100 刷到第 68 题,正好是 198. 打家劫舍。这题在动态规划里算是最经典的“入门题中的入门题”,但真正能一次写对的人并不多。我见过不少面试者上来就写递归,写一半卡壳;也有人用贪心思路,反例一跑就…

阅读更多 →
DSP国产替代全解析:C2000生态壁垒与F28335迁移实战 2026/10/1 16:37:59

DSP国产替代全解析:C2000生态壁垒与F28335迁移实战

过去这轮芯片缺货里,最难受的不只是ST的客户,TI C2000系列的用户其实更憋屈。TMS320F28335这颗服役十几年的老将,至今仍是电机控制、数字电源、车载OBC项目里的常青树,结果交期一拖,很多人被迫第一次认真研究DSP国产替…

阅读更多 →
HAProxy超时配置与负载均衡算法实战:从线上故障到最佳实践 2026/10/1 16:37:52

HAProxy超时配置与负载均衡算法实战:从线上故障到最佳实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
I2C总线死锁实战:从模式状态机、时钟延展与九脉冲恢复全解析 2026/10/1 16:37:52

I2C总线死锁实战:从模式状态机、时钟延展与九脉冲恢复全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ESP32接入大模型不等于AI硬件:端侧部署的八大工程挑战 2026/10/1 16:37:52

ESP32接入大模型不等于AI硬件:端侧部署的八大工程挑战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
赛博朋克2077 460报错根治指南:从SSL拦截到网络堆栈的完整排查 2026/10/1 16:37:46

赛博朋克2077 460报错根治指南:从SSL拦截到网络堆栈的完整排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉