
1. 为什么用LTspice做EMC滤波器仿真EMC滤波器设计最让人头疼的地方在于理论计算出来的截止频率和实际测试结果经常对不上。我在早期做电源传导发射整改时按公式算了一个二阶LC低通截止频率设在150kHz结果拿到暗室一测200kHz到500kHz这一段该超还是超白忙活了两周。后来才想明白问题出在寄生元件上——电感的匝间电容、电容的等效串联电感ESL、PCB走线电感这些东西在几百kHz到几MHz的频段上会把滤波器的高频衰减性能彻底毁掉。LTspice在这件事上的价值就很突出了。它本身是ADI原Linear Technology出的一款免费SPICE仿真器收敛性好、仿真速度快最关键的是它允许你把寄生参数直接画进原理图里。你可以用一个理想电感串联一个小电容来模拟匝间电容用一个理想电容串联一个小电感来模拟ESL然后跑AC扫描看波特图几秒钟就能看到高频段那个“翘尾巴”的谐振峰。这种分析在Mathcad或者Excel里做起来非常别扭但在LTspice里就是拖几个元件的事。这篇文章适合两类人看一类是刚接触EMC滤波器设计、想找个工具快速验证方案的硬件工程师另一类是用过LTspice但只跑过简单电路、没试过把寄生参数纳入仿真的朋友。我会从滤波器拓扑选择讲起到寄生元件建模、AC扫描设置、波特图判读再到仿真发散怎么排查把整个流程拆开揉碎说一遍。所有参数和步骤都是我实际项目中用过的你可以直接抄作业。2. EMC滤波器拓扑选择与LTspice建模思路2.1 共模与差模滤波器的基本结构差异EMC滤波器要对付的是两种噪声差模噪声和共模噪声。差模噪声在火线和零线之间流动共模噪声则同时出现在火线和零线上通过地线返回。这两种噪声的滤波结构完全不同仿真时不能混在一起做。差模滤波器的基本单元是LC低通火线和零线之间并一个X电容每条线上串一个电感。共模滤波器则是火线和零线各串一个共模电感两个绕组绕在同一磁芯上火线零线分别对地并Y电容。实际产品里通常是两级甚至三级级联先共模后差模或者先差模后共模顺序取决于噪声源的阻抗特性。在LTspice里建模时我习惯把共模和差模分开仿真。差模仿真时把共模电感当成两个独立的电感因为差模电流在共模电感里产生的磁通相互抵消呈现的阻抗很低只保留差模电感。共模仿真时把X电容当成短路X电容对共模噪声阻抗很低只保留共模电感和Y电容。这样分开跑波特图看起来干净问题定位也容易。注意分开仿真只是分析手段最终验证还是要做整体仿真或者实测。分开仿真的目的是让你知道每一级对哪个频段的噪声负责。2.2 为什么选择AC扫描而不是瞬态仿真LTspice里做滤波器仿真有两种方式AC扫描和瞬态仿真。AC扫描直接给你波特图横轴频率、纵轴增益和相位几秒钟出结果。瞬态仿真则是给一个正弦波或者方波看输出波形适合观察非线性效应和时域响应。EMC滤波器设计主要关心的是插入损耗随频率的变化也就是从10kHz到30MHz这个范围内滤波器对噪声衰减了多少dB。这个信息AC扫描直接就给出来了没必要跑瞬态。瞬态仿真在EMC里更多是用来验证滤波器的额定电流下的饱和特性或者看浪涌电流对电感的影响那是另一个话题。AC扫描的设置很简单在LTspice里选.ac dec 1000 10k 30M意思是从10kHz到30MHz每十倍频程取1000个点。1000个点看起来多但LTspice跑起来也就一两秒而且高频段的谐振峰需要足够密的采样点才能看清楚。我试过用100个点结果一个尖锐的谐振峰直接被跳过去了误以为滤波器没问题实际测试时那个峰正好落在超标频段上。2.3 寄生元件在LTspice里的建模方法寄生元件是EMC滤波器仿真的灵魂。没有寄生参数的仿真结果基本等于自欺欺人。下面这张表是我常用的寄生元件建模方式寄生元件建模方法典型值范围影响频段电感匝间电容理想电感并联小电容5pF~50pF1MHz~30MHz电容ESL理想电容串联小电感2nH~20nH500kHz~10MHzPCB走线电感理想电感串联1nH/mm1MHz以上磁芯损耗电感并联电阻1kΩ~100kΩ整个频段Y电容对地阻抗电容串联电阻0.1Ω~1Ω高频段在LTspice里画这些寄生元件直接用普通元件就行。比如一个10mH的共模电感匝间电容估计15pF就在电感旁边并一个15pF的电容。一个0.1μF的X电容ESL估计5nH就在电容下面串一个5nH的电感。这些值不是拍脑袋来的匝间电容可以用LCR表测ESL可以从电容的阻抗-频率曲线上反推走线电感用PCB工具算。提示寄生参数的准确值不需要很精确数量级对了就行。仿真目的是看趋势和找谐振点不是做精确预测。我通常先用估计值跑一遍看到谐振峰位置后再根据实测微调。3. LTspice仿真EMC滤波器的完整实操流程3.1 原理图搭建与元件参数设置打开LTspice新建一个原理图。我以一个典型的二级EMC滤波器为例第一级是共模滤波共模电感L12×10mHY电容C1C22.2nF第二级是差模滤波差模电感L2100μHX电容C30.47μF。输入源用AC电压源输出端接50Ω负载电阻。具体操作步骤按F2调出元件库选voltage放一个电压源右键设置AC amplitude为1V其他保持默认。选inductor放两个电感分别命名为L1和L2L1的值设为10mL2设为100u。选capacitor放三个电容C1和C2设为2.2nC3设为0.47u。选resistor放一个50Ω负载。按F3连线按F4放地符号。按F7移动元件按F8拖动。寄生元件的添加在L1旁边并一个15pF电容命名为Cp1在L2旁边并一个10pF电容Cp2在C3下面串一个5nH电感命名为ESL1。这些寄生元件的值先按估计填后面再调。注意LTspice里元件命名不能重复Cp1、Cp2、ESL1这些名字要唯一。另外电感的值单位是亨利10mH要写成10m不是10mHLTspice不认mH这个单位。3.2 AC扫描指令与波特图设置原理图画好后点菜单Simulate→Edit Simulation Cmd选AC Analysis标签页。设置如下Type of sweep: DecadeNumber of points per decade: 1000Start frequency: 10kStop frequency: 30M点OK后原理图上会出现.ac dec 1000 10k 30M的指令。然后点Simulate→RunLTspice会弹出一个空白波形窗口。在窗口里点右键选Add Traces输入V(out)就能看到输出端的幅频响应。再点一次Add Traces输入V(out)/V(in)得到插入损耗曲线。波特图的纵轴默认是dB横轴是频率。如果你看到的是一条平直的线检查一下电压源的AC amplitude是不是设成了1V如果设成0或者没设AC扫描就没有激励信号。提示LTspice的AC扫描默认纵轴是dB如果你想要线性刻度在波形窗口里右键→Manual Limits把纵轴改成Linear。不过EMC里习惯用dB没必要改。3.3 插入损耗曲线的判读与谐振点识别跑完AC扫描后你会看到一条插入损耗曲线。理想的二阶LC滤波器插入损耗应该以40dB/decade的斜率下降。但加上寄生元件后高频段会出现一个或多个谐振峰曲线先下降后上升形成一个“V”字形或者“W”字形。我实际跑出来的一个典型曲线是这样的100kHz以下插入损耗很小100kHz到1MHz之间以40dB/decade下降1MHz附近出现第一个谐振峰由L1的匝间电容和Y电容谐振引起5MHz附近出现第二个谐振峰由L2的匝间电容和X电容谐振引起10MHz以上插入损耗反而变差。这个谐振峰的位置可以用公式估算f_res 1/(2π√(L·C_par))。比如L110mHCp115pFf_res 1/(2π√(10m×15p)) ≈ 13kHz。等等这个算出来不对10mH和15pF的谐振频率应该是1/(2π√(0.01×15e-12)) ≈ 411kHz。我重新算一下0.01×15e-12 1.5e-13开根号是3.87e-72π×3.87e-7 2.43e-6倒数就是411kHz。对第一个谐振峰在400kHz附近。注意谐振峰的位置决定了滤波器在哪个频段失效。如果谐振峰落在EMC标准限值线以下那没问题如果落在限值线以上就需要调整寄生参数或者换元件。3.4 参数扫描与优化迭代LTspice的.step指令可以让你批量扫描元件参数一次跑出多条曲线。比如你想看不同匝间电容对谐振峰的影响可以把Cp1设成参数然后加.step param Cp 5p 10p 15p 20p 25p跑一次就能看到五条曲线。具体操作把Cp1的值改成{Cp}然后在原理图上加一条SPICE指令.step param Cp 5p 10p 15p 20p 25p。跑AC扫描后波形窗口会显示五条不同颜色的曲线图例里会标注每条曲线对应的Cp值。我通常用这个方法做两件事一是找谐振峰对寄生参数的敏感度二是找最优的元件值组合。比如我发现15pF匝间电容导致400kHz谐振峰太高就试着把电感换成匝间电容更小的型号比如10pF或者调整Y电容的值把谐振峰移出超标频段。提示.step指令跑多条曲线时仿真时间会成倍增加。如果曲线太多导致仿真慢可以减少扫描点数比如从1000降到200。4. 仿真发散与常见问题排查4.1 仿真发散的典型原因与解决方法LTspice跑AC扫描一般不会发散但如果你同时跑了瞬态仿真或者电路里有非线性元件就可能遇到“Time step too small”或者“Singular matrix”的错误。仿真发散的原因通常有这几个节点悬空某个节点没有直流通路LTspice无法计算直流工作点。解决方法是在该节点对地加一个大电阻比如1Meg。电感并联电压源电感电流不能突变如果直接并在电压源上直流工作点无解。解决方法是串一个小电阻比如1mΩ。电容串联电容两个电容串联时中间节点悬空加一个大电阻对地。收敛参数太严在.options里加cshunt1e-12或者gmin1e-10放宽收敛条件。我遇到最多的情况是电感直接并在电压源上。有一次我画共模滤波器把共模电感的两端直接接在电压源输出上跑瞬态仿真时直接报错。后来在电感上串了一个1mΩ的电阻问题解决。这个电阻在实际电路里就是电感的直流电阻DCR本来就应该有。注意AC扫描不需要直流工作点所以即使电路有悬空节点也能跑。但瞬态仿真必须先算直流工作点悬空节点会导致发散。4.2 波特图异常波形的排查思路有时候跑出来的波特图跟预期完全不一样比如曲线是一条直线、或者高频段翘得特别厉害。下面这张表是我总结的排查思路异常现象可能原因排查方法曲线平直无衰减电压源AC amplitude为0检查电压源设置高频段翘起严重寄生电容过大减小Cp值重跑低频段就衰减负载电阻太小检查负载是否50Ω曲线有尖峰谐振点用公式估算谐振频率相位跳变180度零点或极点检查电容ESL曲线不光滑扫描点数太少增加dec点数我印象最深的一次是跑共模滤波器仿真曲线在1MHz以上突然翘到20dB比输入还大。查了半天发现是Y电容的ESL设成了50nH太大了。实际Y电容的ESL一般在5nH以下改成5nH后曲线就正常了。提示LTspice的波形窗口里可以按Ctrl左键拖动来测量任意两点的坐标用这个功能可以精确读出谐振峰的频率和幅值。4.3 仿真结果与实测差异的修正技巧仿真和实测有差异是正常的关键是差异有多大、在哪个频段。我的一般经验是低频段100kHz以下仿真和实测差1~2dB中频段100kHz~1MHz差2~3dB高频段1MHz以上差3~6dB。如果差异超过10dB说明寄生参数估计得太离谱或者电路里还有你没考虑到的耦合路径。修正的方法有两种一是用实测的插入损耗曲线反推寄生参数二是用LCR表直接测元件的寄生参数。我通常先用LCR表测测不到的就用仿真拟合。比如电感的匝间电容LCR表在100kHz以上测出来的电容值就包含了匝间电容可以直接用。还有一个容易被忽略的因素是测试夹具的影响。实测时滤波器是焊在PCB上的PCB走线、连接器、测试电缆都会引入额外的寄生参数。仿真时如果只画滤波器本身结果会偏乐观。我的做法是在仿真里加一段传输线模型来模拟测试电缆或者直接在输出端串一个小电感来模拟走线。注意仿真永远只是辅助工具最终还是要靠实测。仿真的价值在于帮你快速筛选方案、定位问题频段而不是替代实测。5. 从仿真到实测的过渡经验5.1 元件选型对仿真结果的影响仿真时用的都是理想元件实际选型时要注意几个关键参数。电感方面共模电感的磁芯材料决定了它的频率特性。铁氧体磁芯在低频段电感量大但高频段损耗大等效于并联了一个电阻会降低谐振峰的Q值。纳米晶磁芯则相反高频段阻抗更稳定。仿真时可以在电感上并一个电阻来模拟磁芯损耗电阻值取1kΩ到100kΩ之间。电容方面X电容和Y电容的ESL差异很大。X电容通常是大容量、小体积ESL在5nH到20nH之间。Y电容容量小ESL在2nH到10nH之间。仿真时如果统一用5nH高频段的结果会不准。我的做法是查电容的datasheet上面一般会给出阻抗-频率曲线从曲线上反推ESL。提示LTspice的元件库里有ADI自己的电容模型但EMC滤波器用的X电容和Y电容通常不是ADI的需要自己建模。建一个“理想电容ESLESR”的子电路保存成.sub文件以后直接调用。5.2 PCB布局寄生参数的估算方法PCB布局对EMC滤波器的影响非常大。同样的原理图不同的布局实测结果可能差10dB以上。仿真时要把布局寄生参数考虑进去主要关注三个地方输入输出走线走线电感约1nH/mm走线电容约0.1pF/mm。如果输入输出走线靠得很近还会有耦合电容。接地平面Y电容的接地走线要短而粗否则接地电感会降低Y电容的高频效果。仿真时在Y电容接地端串一个2nH的电感来模拟。滤波器输入输出隔离滤波器的输入和输出不能靠太近否则噪声会通过空间耦合绕过滤波器。仿真时可以在输入输出之间加一个1pF的电容来模拟这种耦合。我做过一个对比同一个滤波器布局A的输入输出走线距离5mm布局B的距离15mm。仿真时在布局A的模型里加了一个2pF的耦合电容结果高频段插入损耗差了8dB。实测结果也证实了这一点。5.3 仿真收敛性优化与仿真速度提升LTspice跑EMC滤波器仿真一般很快但如果电路复杂或者扫描点数多也可能要等几分钟。提升速度的方法有几个减少.ac扫描点数从1000降到200对曲线形状影响不大。用.step指令时减少扫描的变量数量。把不关注的频段排除比如只扫150kHz到30MHz而不是10Hz到1GHz。用.save指令只保存关注的节点电压减少数据量。收敛性方面如果遇到“Time step too small”可以在.options里加methodgear或者maxord2。这两个参数会降低积分阶数提高收敛性但会牺牲一些精度。对于EMC滤波器这种线性电路精度损失可以忽略。注意LTspice的默认积分方法是trapezoidal对于有陡峭边沿的瞬态仿真容易振荡。改成gear方法后振荡会减少但仿真速度会慢一些。AC扫描不受影响。6. 几个我踩过的坑和实操心得第一个坑是忘了设电压源的AC amplitude。LTspice的电压源默认AC amplitude是0跑AC扫描时输出全是零波形窗口一片空白。我刚开始用的时候以为电路画错了查了半天才发现是电压源没设。现在我的习惯是放完电压源第一件事就是右键设AC amplitude为1V。第二个坑是电感单位写错。LTspice里电感单位是亨利10mH要写成10m不能写10mH。我见过有人写10mHLTspice把它当成10毫亨不对LTspice不认mH会报错。正确的写法是10m或者10e-3。电容也是0.1μF要写成100n或者0.1u不能写0.1μF。第三个坑是寄生参数设得太大。有一次我把共模电感的匝间电容设成了100pF结果谐振峰跑到100kHz整个滤波器在150kHz就失效了。实际共模电感的匝间电容一般在10pF到30pF之间100pF太离谱了。后来我养成习惯设寄生参数前先查datasheet或者用LCR表测一下。第四个坑是忽略负载阻抗。EMC滤波器的插入损耗跟负载阻抗有关50Ω负载和100Ω负载的曲线不一样。实际测试时LISN的阻抗是50Ω所以仿真时也要用50Ω。如果仿真时用了1kΩ负载曲线会好看很多但实测时对不上。第五个坑是仿真通过了就以为万事大吉。仿真只是验证了电路原理实际PCB布局、元件选型、磁芯饱和、温度特性都会影响最终效果。我现在的流程是仿真筛选方案→画PCB→打样→实测→根据实测结果修正仿真模型→再优化。这个循环走两到三轮基本就能把滤波器调到位。提示LTspice的.meas指令可以自动测量插入损耗在特定频率的值比如.meas ac att_150k find V(out) at 150k跑完仿真后在SPICE Error Log里看结果。这个功能在做批量仿真时特别有用。最后分享一个我常用的技巧在LTspice里建一个EMC滤波器的模板文件把常用的共模电感、差模电感、X电容、Y电容都做成子电路寄生参数也预先设好。下次做新项目时直接调用改改参数就能跑省去重复画图的时间。这个模板我用了三年从几百瓦的电源到几千瓦的逆变器改改参数都能用。