☰
IIR数字滤波器在FOC电机控制中的设计与实战应用
2026/10/1 15:03:45 网站建设 项目流程

做电机控制的工程师,几乎没人能绕开IIR数字滤波器。电流波形里有PWM斩波带来的开关噪声,转速信号里有编码器量化误差,做无感FOC时甚至要靠滤波器从一堆干扰里把微弱的转子位置信息"捞"出来——这些都是IIR滤波器在背后干活。但很多刚接触FOC的人对它的理解停留在"调用一个filter函数"的层面,不知道极点放在Z平面哪个位置决定了它是低通还是带通,不知道滤波器延迟会吃掉电流环多少相位裕度,更不知道高频注入法里带通滤波器的中心频率该选多少。这篇文章就把这条链路从头串一遍,从Z平面原理到低通/带通设计,再到FOC电流环和无感高频注入的实际配合,讲清楚IIR在这一套系统里到底是怎么工作的。

1. 电机控制里的IIR滤波器:为什么它无处不在

1.1 电流采样信号里的"脏东西"从哪来

先说一个最常见的场景。PMSM驱动器里PWM开关频率通常是10kHz,IGBT或MOSFET在导通和关断瞬间,母线电压会直接耦合到电流采样回路上。你用电流传感器或者采样电阻测相电流时,信号里面叠加着大量高频毛刺,这些毛刺的幅度有时候能达到真实电流幅值的10%以上。如果这些毛刺直接进电流环的PI调节器,轻则电流波形变差、产生额外噪声和发热,重则触发过流保护,甚至让电流环震荡。

除了开关噪声,还有一类干扰来自电流传感器本身——霍尔传感器的零点漂移和温漂、采样电阻的寄生电感、ADC量化误差,这些东西叠加在一起,让ADC读回来的数字量并不能直接作为控制用的精确电流值。所以电流环入口处放一个低通滤波器,几乎是工业驱动器和伺服驱动器的标配做法。

但这里有个关键矛盾:电流环需要的是"快",带宽越高,动态响应越快;而低通滤波器会带来延迟,延迟会吃掉相位裕度。所以这个滤波器不能随便用一个阶数很高、截止频率很低的"重滤波",得根据整个电流环的带宽目标去折中。我见过不少工程师直接套用网上现成的滤波系数,结果系统启动就啸叫,其实问题往往不在PI参数,而在滤波器延迟太大把相位裕度吃光了。

1.2 FIR和IIR怎么选:延迟、阶数和算力

数字滤波器两大阵营,FIR(有限冲激响应)和IIR(无限冲激响应),在电机控制这个场景下,IIR几乎是绝对主流。原因很直接:同样的滤波效果,IIR的阶数要低得多。

拿一个截止频率2kHz、采样率10kHz的低通来说,如果要做FIR,想达到-40dB@5kHz的衰减,可能需要20到30阶,每拍要做这么多次乘加运算;而IIR用一个二阶节就能获得接近的衰减特性,每拍只做5次乘加。在STM32F103这种主频72MHz的芯片上跑FOC,电流环周期通常只有50到100微秒,FIR那几十次乘加虽然也能跑,但会明显挤压其他运算的时间预算。IIR在算力上的优势,在电机控制这种强实时性、高控制频率的场景下,几乎是决定性的。

不过IIR也有自己的问题:相位响应是非线性的,而且如果系数设计不当,极点容易跑出单位圆导致发散。所以IIR滤波器在实际工程里需要做稳定性检查和定点化处理,这两个事情我会在后面重点展开。

1.3 一个贯穿全文的实战场景

为了让后面的内容不悬空,我先定一个具体的电机参数作为贯穿全文的例子。假设我们在做一个PMSM无感FOC驱动器,额定电流5A,PWM频率10kHz,电流环执行频率10kHz(和PWM同步),电流环设计带宽1kHz,电机极对数为4,额定转速3000rpm,在零速和低速段用高频注入法做转子位置估计,中高速切换到反电动势滑模观测器。

后面的滤波器设计、截止频率计算、延迟预算,我都基于这个参数来讲。这样你拿到文章之后,可以直接把思路往自己的项目上套。

2. 从Z平面读懂IIR:零极点决定一切

2.1 从差分方程到传递函数:离散世界的"动态系统"

IIR滤波器的起点是一个差分方程。拿最常用的二阶IIR来说:

y[n] = b0·x[n] + b1·x[n-1] + b2·x[n-2] - a1·y[n-1] - a2·y[n-2]

这里x是输入序列,y是输出序列,b0、b1、b2是前馈系数,a1、a2是反馈系数。因为输出不仅依赖当前和过去的输入,还依赖过去的输出,所以这个系统的冲激响应理论上是无限长的——这就是"IIR"这个名字的来历。

把差分方程做Z变换,可以得到离散传递函数:

H(z) = (b0 + b1·z^-1 + b2·z^-2) / (1 + a1·z^-1 + a2·z^-2)

对Z变换不熟的读者,可以把z理解为"一拍延迟算子":z^-1就是把信号往后延迟一个采样周期。控制系统里常说的"一拍延迟",在Z域就是乘上一个z^-1。这种对应关系很直观,也方便我们理解数字控制里的延迟来源。

2.2 零极点位置与频率响应的映射关系

H(z)的分子为零的z值叫零点,分母为零的z值叫极点。这组零极点落在Z平面的不同位置,直接决定了滤波器的频率特性。

Z平面本身是个复平面,单位圆|z|=1对应着连续世界里的频率轴。具体来说,频率f映射到Z平面的角度θ = 2πf/fs,fs是采样频率。所以:

  • 直流分量f=0,对应z=1这个点
  • 奈奎斯特频率f=fs/2,对应z=-1这个点
  • z=0对应的是"无穷大的延迟项",与频响的幅值无关,只影响相位

极点放在哪里特别关键。一个极点放在z=1附近(比如z=0.9),意味着系统对直流附近的低频信号增益很大,对远离这个位置的高频信号增益小——这就是低通。极点放在z=-1附近,对应的就是高通特性。带通呢?通常是一对共轭极点放在单位圆内某个角度θ0=2πf0/fs附近,f0就是中心频率。

稳定性判断有一条硬规则:所有极点的模必须小于1,也就是极点要落在单位圆内部。只要有一个极点落在单位圆外面,滤波器输出就会发散。设计IIR的时候,我习惯先把零极点图画出来看一眼,确认系数没有让极点跑出单位圆,再烧进单片机。

2.3 双线性变换法:从模拟滤波器到数字滤波器

工程上常用的IIR设计方法不是直接凑系数,而是先设计模拟滤波器,比如巴特沃斯、切比雪夫、贝塞尔,然后通过双线性变换法映射到Z域。

双线性变换的公式是:

s = (2/T)·(z-1)/(z+1)

T是采样周期。这个变换把模拟s平面的左半平面映射到Z平面单位圆内部,所以只要模拟滤波器是稳定的,变换出来的数字滤波器必然稳定。这是双线性变换最大的优点。

但双线性变换有一个非线性的频率压缩效应:模拟频率Ω和数字频率ω之间的关系是:

Ω = (2/T)·tan(ω/2)

这意味着数字域的频率刻度被压缩了,模拟域的无穷大频率被映射到数字域的奈奎斯特频率。所以设计的时候要做"频率预畸变":先把你想要的数字截止频率fd通过上面公式换算成模拟截止频率,再去做模拟原型设计。我见过有人图省事直接套用模拟滤波器的参数,结果实际截止频率比设计值偏了20%以上,就是这个原因。

2.4 一阶低通的实用系数计算

虽然二阶滤波器更常用,但从一阶入手理解系数反推会容易很多。工程上最常用的一阶IIR低通形式是:

y[n] = α·x[n] + (1-α)·y[n-1]

这个滤波器的极点位置在z=1-α。α越大,极点离单位圆越远,滤波越"轻",截止频率越高;α越小,极点越靠近z=1,滤波越"重",截止频率越低。

给定采样率fs和想要的截止频率fc,可以用这个近似公式:

α ≈ 2π·fc/fs / (1 + 2π·fc/fs)

更精确一点,用双线性变换推导出的是:

α = 1 - exp(-2π·fc/fs)

以我们的场景为例,fs=10kHz,如果电流采样低通想做到fc≈2kHz,那么:

α = 1 - exp(-2π×2000/10000) = 1 - exp(-1.2566) ≈ 0.715

这个α值意味着当前拍新采样的权重占71.5%,上一拍滤波结果占28.5%,滤波很轻。如果想把噪声滤得更干净,把fc降到500Hz:

α = 1 - exp(-2π×500/10000) = 1 - exp(-0.3142) ≈ 0.269

这时候新采样值的权重降到26.9%,平滑效果明显更强,但延迟也更大。不同fc对应的α对照如下:

截止频率fcα值滤波强度附加相位延迟@1kHz
5kHz0.956极轻约4°
2kHz0.715轻约11°
1kHz0.466中等约22°
500Hz0.269重约40°

注意那个相位延迟列,这东西在电流环里是致命的。后面第4章我会专门算它怎么影响FOC性能。

3. 低通、带通滤波器的设计与FOC岗位分配

3.1 电流采样低通:截止频率到底怎么定

回到我们的PMSM无感FOC场景。电流环设计带宽是1kHz,采样频率10kHz。对电流采样信号做低通滤波的时候,我的经验法则是:截止频率放在电流环带宽的2到3倍,也就是2~3kHz,不能比这更低,也不能太高。

为什么下限是2倍带宽?因为滤波器在截止频率处已经有明显衰减和相位滞后,如果截止频率离带宽太近,滤波器在1kHz处引入的相位滞后会直接侵蚀PI控制器的相位裕度。为什么上限不要太高?因为PWM开关噪声集中在10kHz附近,而且开关瞬间的高频毛刺能量很大,截止频率定太高就压不住这些毛刺。

具体到参数上,我通常这么操作:fs=10kHz,fc取2.5kHz,用双线性变换设计一个二阶巴特沃斯低通。二阶贝塞尔函数。注意,如果你想保留更好的阶跃响应、减少超调,可以用贝塞尔滤波器,它的相位延迟在通带内更平坦,代价是阻带衰减慢一些。

3.2 带通滤波器在高频注入法里的岗位

带通滤波器在FOC系统里最典型的岗位是高频注入法的信号提取。PMSM在低速甚至零速时,反电动势为零,没法用滑模观测器估算转子位置。这时候可以在估计的d轴上注入一个高频电压信号,利用电机转子的凸极性(Ld≠Lq)产生高频电流响应,这个响应电流里包含转子位置信息。

问题在于:注入的高频信号(通常500Hz到2kHz)是叠加在基波电流上的,基波电流可能是几十安培的大信号,而高频响应电流可能只有几百毫安。要把这个弱信号从大基波里分离出来,需要带通滤波器。带通滤波器的中心频率对准注入频率,带宽通常取中心频率的10%~20%,比如注入1kHz,带宽100~200Hz。

还有一种做法是先用高通滤掉基波,再做解调后用低通提取误差信号。两种方案各有适用场景,但无论是高通、带通还是低通,本质都是IIR在干活。这里有一个很容易犯的错误:带通的中心频率和注入频率有偏差,哪怕只有5%,滤波后的信号幅值就会掉一半以上,而且相位偏差会让位置估计出现固定误差。所以注入频率一旦选定,滤波器的中心频率必须严格一致。

3.3 TI C2000和TMS320C6416平台的定点实现差异

很多电机控制代码跑在定点DSP上,比如TMS320C6416这种经典平台,或者C2000系列。IIR滤波器系数是小数,定点实现时需要用Q格式表示,比如Q15格式表示范围[-1,1),小数精度1/32768。

IIR定点实现有几个坑:第一个是中间变量溢出,二阶节的中间结果可能比最终输出大好几个量级,需要用Q31甚至Q32的中间累加器;第二个是系数量化误差,特别是极点在单位圆附近时,系数的低位量化误差可能让稳定极点变成不稳定极点;第三个是限幅问题,饱和处理和环绕处理会导致完全不同的瞬态行为。

实测下来,我的经验是:能不定点就不定点,用浮点DSP或者带FPU的MCU(比如STM32F4以上)就少很多麻烦。但如果必须定点,至少要做到:系数用Q15或Q22存储,中间累加用32位,输出做饱和裁剪而不是取模环绕。我后面第6章会给出TMS320C6416平台的参考实现代码,里面就包含了这些处理。

4. FOC全链路里IIR滤波器都在哪些环节上岗

4.1 从ADC采样到Park变换的完整电流信号链

一个典型的FOC电流环信号链是这样的:

电流传感器(采样电阻/霍尔/磁通门)→ 模拟调理电路(运放+RC)→ ADC → IIR低通 → Clarke变换(abc→αβ)→ Park变换(αβ→dq)→ PI调节器 → 逆Park变换 → SVPWM → 逆变器

这里注意一个容易混淆的点:IIR低通滤波器应该放在Clarke和Park之前还是之后?

我个人的习惯是放在ADC采样之后、Clarke变换之前。原因有两个:第一,Clarke变换是线性变换,滤波后再变换和变换后再滤波在数学上等价,但滤波放在前面可以减少后面坐标变换时不必要的运算负担;第二,三相电流的采样噪声在相域里处理后,可以避免坐标系变换把噪声耦合到d、q轴之间。不过也有同行习惯在d、q轴滤波,尤其处理采样延迟时,dq轴的滤波系数更容易和PI参数放在一起整定。

有一点需要警惕:不要在dq轴同时加两个低通还叠加在相域的低通上,三路滤波串起来,相位延迟会累积到难以接受的程度。滤波不是越多越好,每一级滤波都是在用动态性能换噪声抑制。

4.2 一阶低通在电流环相位裕度中的隐形杀手

我前面提到滤波器延迟会吃相位裕度,这里用数字算一下。

假设电流环用典型PI调节器,设计相位裕度50°。系统固有延迟包括:一拍PWM更新延迟(对应ZOH效应)、ADC采样延迟、PI运算时间。在10kHz采样下,一拍延迟在1kHz处对应的相位滞后是:

Δφ_delay = 2π × 1000/10000 × 180/π = 36°

这已经很大了。如果你再串联一个fc=2.5kHz的二阶低通,它在1kHz处大约再贡献16°的相位滞后(二阶系统在0.4倍截止频率处的相移);

如果再在前面加一个一阶低通fc=1kHz,它在1kHz处的相移是45°。三重叠加之后,系统相位裕度可能只剩负的,电流环必然震荡。

所以我在设计电流环时有一条硬约束:从采样到PI输出,所有数字滤波和延迟的总相位滞后必须控制在20°以内。做法是:要么检查滤波器的相频特性,要么在PI的相位补偿里预置一个超前环节,补偿已知的滤波器延迟。很多商用驱动器不用额外滤波器只靠同步采样就能跑得稳,就是这个道理——不是人家没噪声,而是噪声抑制的活交给模拟RC和PCB布局去做了。

4.3 无感FOC中的滑模观测器和低通滤波配合

无感FOC的高中速段,常用滑模观测器(SMO)估算转子位置和速度。滑模观测器本质上是一个非线性状态观测器,它的输出中包含大量滑模抖振成分,需要低通滤波器才能提取出平滑的反电动势信号。

这里IIR的作用有两层:第一层,对反电动势估计值做低通,滤掉高频抖振,截止频率一般取转速频率的5~10倍,比如最高转速下的电频率400Hz,低通截止可以放到2~4kHz;第二层,对估算转速做平滑滤波,这个滤波器的截止频率要低得多,通常10~50Hz,因为它只需要保留转速的直流和低速波动成分。

需要注意,估算转速低通滤波会引入相位延迟,在速度环里同样会吃掉相位裕度。所以速度环的带宽通常只做到电流环带宽的1/10到1/5,很大一部分原因就是这些滤波延迟在限制你。

5. 高频注入法实战:用带通把转子位置捞出来

5.1 凸极效应与注入信号选择

PMSM转子之所以能在零速下被"看见",靠的是凸极效应——d轴电感和q轴电感不相等。内置式PMSM(IPMSM)的Ld小于Lq,表贴式PMSM(SPMSM)虽然电感差异小,但多少也有一些。高频注入法就是往定子绕组里注入一个高频电压/电流信号,通过检测高频电流响应对转子位置的依赖关系,反推出转子角度。

注入信号的选择有两大类:旋转高频电压注入(在αβ静止坐标系注入旋转电压矢量)和脉振高频电压注入(在估计d轴注入正弦或方波电压)。两种方案各有拥护者,但工程上脉振注入实现更简单,在低速段性能更好,我用得更多一些。

注入频率怎么选?要满足几个条件:

  • 远高于电流环带宽(1kHz),避免和基波控制互相干扰
  • 远低于PWM开关频率(10kHz)的奈奎斯特限制,一般取1/10到1/5开关频率
  • 避开机械谐振频率

所以常用范围是500Hz到2kHz。拿我们的例子,选择1kHz注入频率,对应前面说的带通中心频率就是1kHz,带宽约200Hz。

5.2 高频电流提取、同步解调与位置误差信号

脉振注入的完整信号链是这样的:

在估计的d轴(角度θ̂)上叠加高频电压 u_inj·sin(ω_inj·t) → 采样三相电流 → 坐标变换到估计dq轴 → 用带通滤波器提取高频电流分量 i_dh、i_qh → 将i_qh与同频参考信号sin(ω_inj·t)相乘做同步解调 → 低通滤波得到直流误差信号 ε → 送PLL或者直接用PI收敛,得到转子位置估计θ̂。

这里的核心原理是:因为真实dq轴和估计dq轴之间存在角度误差Δθ,高频电流响应的q轴分量与sin(2Δθ)成正比,当Δθ小的时候近似线性,即:

ε ≈ K·sin(2Δθ) ≈ 2K·Δθ

这个信号正好可以作为位置跟踪观测器的误差输入。整个信号链里带通和低通的角色分工明确:带通提取高频成分,低通滤掉解调后的高频残余,只留直流误差。我实际调系统时发现,解调后的低通截止频率对收敛速度影响很大——截止频率设太低了位置环响应慢,设太高了位置估计噪声大。通常以注入频率的1/5到1/10作为解调低通的折中,比如注入1kHz,解调低通取100~200Hz。

5.3 转子初始位置检测的特殊处理

高频注入法不止在低速运行中使用,上电初始位置的检测也靠它。FOC在零速启动时,如果转子位置估计误差大于90°,电流和力矩的方向可能完全反了,直接启动会反转甚至过流。

用脉振高频注入检测初始位置的做法是:在估计d轴注入高频信号,通过解调得到误差信号,用观测器收敛到真实位置。但这里有一个棘手的null point问题:因为误差信号和sin(2Δθ)成正比,当真实角度和估计角度相差0°或180°时,误差信号都为零。也就是说,观测器可能收敛到真实位置,也可能收敛到相反方向——磁极极性无法区分。

区分N极和S极的常用手段是叠加一个d轴电流脉冲,观测电感饱和特性:d轴电流正向时,如果该方向对应真实N极,磁路饱和加剧,d轴电感下降,高频电流幅值变大;反过来的话幅值变小。这个微小的幅值差异就是判断极性的依据。整个流程做完,才真正完成了"初始定位"。这个过程中IIR滤波器的幅频特性必须稳定,因为幅值比较需要一致性的增益。

6. 调试路上踩过的坑与排查记录

6.1 高频注入法调试中的常见问题速查表

做这套系统调试,我把遇到过的典型问题整理成了下面这张速查表:

现象可能原因排查建议
位置估计缓慢漂移带通中心频率与注入频率有偏差;阻尼系数不足用示波器对比注入信号与滤波输出频率;检查观测器带宽
启动瞬间反转初始极性判断失败检查d轴脉冲注入方向与幅值;加大脉冲电流验证饱和差异
低速震荡、电流尖峰带通滤波器相位延迟过大减小带通阶数;改用贝塞尔滤波器;加入相位超前补偿
位置估计抖振明显解调后低通截止太高降低低通截止频率;提升PLL带宽滤除高频残留
滤波输出发散极点跑出单位圆检查定点Q格式量化;输出限幅(clamp)

值得单独强调的是第一项,带通中心频率偏差。我遇到过最隐蔽的bug是高精度晶振没问题,但注入信号是在中断服务程序里用浮点正弦函数生成的,正弦查表步长量化误差累积导致实际注入频率和设定值偏差了3Hz,带通滤波器输出幅值就明显下降。排查到最后用示波器的FFT功能对比了实际波形才定位到问题。

另一个高频注入法的坑是带通滤波器的瞬态响应。IIR滤波器上电初始状态y[-1]=0时,输出会有几毫秒的建立时间,在这段时间里位置观测器的误差信号是失真的。解决方法是上电后先让滤波器跑一段"预热"时间,或者把观测器积分器的初始值设置为当前滤波输出,而不是从零开始。

6.2 TMS320C6416平台IIR滤波器C语言实现参考

TMS320C6416是TI的经典定点DSP,很多老的项目还在用它做电机控制。下面给一个二阶IIR节的定点实现,采用Q15格式系数,32位中间累加,输出饱和裁剪。

/* 二阶IIR节,Q15格式 */ typedef struct { short b0, b1, b2; /* Q15格式前馈系数 */ short a1, a2; /* Q15格式反馈系数,注意符号 */ short x1, x2; /* 历史输入,Q15 */ short y1, y2; /* 历史输出,Q15 */ int accum; /* 32位中间累加器 */ } IIR_BQ2_Q15; short iir_bq2_q15(IIR_BQ2_Q15 *f, short x) { /* 直接I型结构,更新差分方程 */ f->accum = (int)f->b0 * x; f->accum += (int)f->b1 * f->x1; f->accum += (int)f->b2 * f->x2; f->accum -= (int)f->a1 * f->y1; f->accum -= (int)f->a2 * f->y2; /* 饱和裁剪到Q15范围 */ int out32 = f->accum >> 15; short y; if (out32 > 32767) y = 32767; else if (out32 < -32768) y = -32768; else y = (short)out32; /* 状态更新 */ f->x2 = f->x1; f->x1 = x; f->y2 = f->y1; f->y1 = y; return y; }

这个写法有几个实战要点:

第一,系数a1、a2在差分方程里是负号,实现时要对应正确。若传递函数分母是1 + a1·z^-1 + a2·z^-2,那么代码里accum要减去a1·y1和a2·y2。

第二,中间累加用int(32位),避免两个Q15相乘后累加溢出。Q15相乘结果是Q30,右移15位回到Q15之前,允许累加若干项而不溢出。

第三,输出一定要做饱和裁剪。如果不裁剪,等极端工况到来时溢出会让波形瞬间飞掉,极不好排查。

6.3 用调试工具观察滤波器效果的技巧

在CCS(Code Composer Studio)里调滤波器,我建议把关键信号导出成数组,用Graph工具画出来看。我平时至少观察这几个信号:原始采样电流、滤波后电流、带通滤波后的高频电流、解调后误差信号、估计位置和实际位置(如果有编码器的话)。

一个非常好用的排查技巧:给一个纯正弦输入做离线仿真,把DSP里实际跑的滤波器的系数导入Matlab或Python,画出幅频和相频响应,和理论值对比。我遇到过系数转换的时候把符号搞反的,理论低通变成了"低通+震荡",用这个方法一眼就看出来了。

再看滤波前后的FFT频谱,这个靠示波器也行。原始电流的频谱在10kHz处有一个明显的开关频率尖峰,滤波后这个尖峰应该明显下降。高频注入场景里,频谱上应该能看到注入频率处有一个窄峰,带通滤波后这个峰的旁边应该干净很多。如果旁瓣还很大,说明带通的Q值不够,需要收窄带宽或者升阶数。

关于滤波器升阶数,我的态度是:优先调Q值和拓扑,不要一上来就加阶数。IIR每个额外阶数都增加延迟和计算量,而且高阶滤波器系数对量化误差更敏感。在定点DSP上,二阶节的级联比分母高次直接实现要稳定得多,数值性能好很多。如果二阶不够,就级联两个二阶节,而不是做一个四阶传递函数一次实现。

做电机控制这么多年,我的体会是:IIR滤波器技术本身并不复杂,复杂的是把它放到一个高带宽闭环系统里,和电机、逆变器、传感器、中断调度纠缠在一起。每一个滤波器的位置和参数,都必须回到"系统稳定性和动态响应"这个基准上去权衡。滤波器不是单独的性能指标,它每时每刻都在用延迟换噪声抑制,你需要清楚这笔交易划不划算。

最后分享一个实用的小技巧:新项目上电调试时,先把所有滤波器系数设成"透明"状态(比如低通截止频率设到采样频率的一半),确认系统在最干净的信号下能跑稳。然后一级一级加重滤波,每次动完滤波器都重新测一遍电流环的阶跃响应,看超调和震荡恶化到多少。这样能直观感受到每一级滤波器的贡献和代价,比对着理论公式空想要靠谱得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询