尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Simulink中搭建Sallen-Key有源低通滤波器:从传递函数到电路仿真全流程

Simulink中搭建Sallen-Key有源低通滤波器:从传递函数到电路仿真全流程 做仿真这么多年Simulink里搭滤波器的需求从来就没断过。前两天一个做数据采集的朋友又来找我说他的信号采集链路里总有工频干扰和带外噪声想在Simulink仿真模型里插一个二阶有源低通滤波器先验证算法结果拖了几个模块发现怎么接都不对。我干脆把他叫过来从传递函数到运放电路级建模把整个搭建过程完整走了一遍。这篇文章就是那次折腾的记录里面有完整的设计计算、Simulink模块配置、仿真结果对比和我踩过的几个坑。无论你是刚接触滤波器的学生还是要在项目里快速验证滤波方案的在职工程师照着这条路径走都能少绕几圈。1. 为什么要造有源滤波器从无源到有源的转折点1.1 无源滤波器的三个痛点很多人第一反应是滤波嘛电阻电容串一串不就行了确实一阶RC低通只需要一个电阻和一个电容截止频率算起来也简单。但真正放到系统里无源滤波器往往会给你找一堆麻烦。第一个痛点是衰减。RC分压网络在通带内天然就有损耗虽然理论上一阶RC在远低于截止频率的位置增益接近1但当你需要多阶滤波时一级RC的输出阻抗会和下一级RC的输入阻抗互相影响导致实际截止频率偏移。二级无源RC级联后第一级的输出阻抗和第二级的输入阻抗混在一起截止频率往往比单独计算时低不少。二阶无源RC的传递函数也不再是教科书上那个标准的二阶级联形式而是带交叉项的形式多少会让人不舒服。第二个痛点是负载效应。如果你在信号源和后级负载之间直接插一个RC滤波器信号源内阻和负载阻抗都会被拉进传递函数。你精心算好的截止频率接上不同阻抗的后级电路后完全变了一个值。这对传感器输出这种内阻不固定的场景几乎是致命的。第三个痛点也是最麻烦的你需要高阶滤波时无源方案往往要求大电感。比如说100Hz低通滤波用LC二阶结构电容取1uF的话电感可能要算到几亨利那种电感体积大、损耗高、还容易耦合外界磁场放在系统板上完全不现实。相比之下运放加电阻电容的方式在低频段可以轻松实现高阶滤波体积和成本都远优于电感方案。1.2 有源滤波器解决了什么又带来了什么新问题有源滤波器的核心思路是用运算放大器提供增益和缓冲能力把滤波网络和前后级电路做一个很好的隔离。运放输入端阻抗极高基本不从前级抽取电流输出端阻抗极低后级负载不会影响滤波特性。这样一来滤波器的频率响应只取决于反馈网络里的R和C不再受前后级阻抗牵制。同时你还能通过运放的反馈结构调整增益让信号在滤波的同时完成幅度放大省掉后面一个额外的放大级。但代价也随之而来——有源滤波器引入了运放的供电问题、饱和问题、带宽限制问题、噪声问题。这些在实际电路里都真实存在也恰好是仿真时最有意思的部分。我们在Simulink里搭建时可以先在理想传递函数层面把滤波器的工作机制理解清楚再逐步走向元器件级电路仿真这样既能抓住核心原理又不会被运放各种非理想效应冲昏头脑。2. 先算后搭用传递函数把Sallen-Key的关键参数定下来2.1 二阶有源滤波器的通用传递函数形态在动手拖任何模块之前我习惯先把传递函数写清楚。二阶低通滤波器最通用的形式是这样的H(s) (K * ω0²) / (s² (ω0 / Q) * s ω0²)其中K是通带直流增益ω0是特征角频率即2πf0Q是品质因子。Q直接决定滤波器在截止频率附近的幅频特性Q等于0.707对应巴特沃斯响应通带最平坦Q大于0.707时会在截止频率附近出现谐振峰Q越大峰越高Q小于0.707则是过阻尼状态过渡带更平缓但截止特性变差。市面上有很多种有源滤波器拓扑常见的有Sallen-Key和多重反馈型。Sallen-Key结构简单、增益正可以用跟随器或同相放大器实现多重反馈型则适合高Q值和反相输出场景。我在这个项目里选了Sallen-Key拓扑因为它的元件灵敏度低、调起来方便是工程上最常用的二阶有源滤波器结构之一。Sallen-Key的传递函数展开后是H(s) K / (R1R2C1C2s² (R1C1 R2C1 R1C2(1-K)) * s 1)这里有个初学者容易忽略的点想让电路给出一组漂亮的计算结果并不只是随便代几个数值进去。很多人不知道如果采用单位增益结构K1且C1C2那么无论你怎么调R1和R2Q最大值就是0.5根本做不出巴特沃斯的0.707更做不出贝塞尔或切比雪夫所需的更高Q。所以设计时要么让K大于1要么让两个电容取不同值。我这次选择了K大于1的方案这也是Sallen-Key滤波器最常见的工程写法。2.2 以1kHz巴特沃斯低通为例的完整计算过程好现在我们把具体指标定下来截止频率f0取1kHzQ0.707直流增益K设定为1.586。为什么取1.586因为等值电容等值电阻结构下K等于3减1/Q即3减1.414等于1.586正好对应单位增益Sallen-Key滤波器在巴特沃斯响应下的反馈增益比例。这是教科书里反复出现的经典值实际应用中你也可以取别的增益组合但1.586让后面运算非常干净。步骤一先定电容。取C1C2100nF这是音频和通用低频滤波里的常见取值容值不大不小陶瓷电容或薄膜电容都很容易买到。步骤二算电阻。Sallen-Key等值元件结构下R 1 / (2π * f0 * C) 1 / (2π * 1000 * 100e-9) ≈ 1591.5Ω实际取标称值1.6kΩ就行如果想更精确可以用1.58kΩ或1.62kΩ串联微调。仿真时直接用1591.5Ω也可以反正是理想元件不出偏差。步骤三算反馈电阻。运放同相放大器的增益公式是K 1 Rf / Rg于是Rf (K - 1) * Rg 0.586 * Rg。取Rg10kΩ则Rf5.86kΩ标称值取5.6kΩ或5.9kΩ都行。到这里Sallen-Key滤波器的全部元件值已经出来了R1R21.6kΩC1C2100nFRg10kΩRf5.6kΩ仿真我可以直接用5.86kΩ。你可以用一行MATLAB脚本把这一整套设计参数和理想传递函数直接算出来方便后面和Simulink结果对比。我记得当时是这么写的f0 1000; Q 1/sqrt(2); K 1.586; C 100e-9; R 1/(2*pi*f0*C); Rg 10e3; Rf (K-1)*Rg; omega0 2*pi*f0; % 二阶低通滤波器的传递函数 num [K * omega0^2]; den [1, omega0/Q, omega0^2]; H tf(num, den); % 绘制理论波特图 bode(H, {100, 10000}); grid on;这段脚本输出的波特图就是你期望的1kHz低通响应通带增益约4dB因为K1.586换算成dB是20*lg1.586约等于4dB在1kHz附近衰减3dB。后续搭建Simulink模型时这个理论曲线可以作为黄金参考。3. 在Simulink里搭第一版用传递函数模块验证理论模型3.1 理想传递函数模型的搭建方式计算做完接下来先别急着找运放。我的习惯是先在Simulink里用传递函数模块搭一个理想滤波器把控制系统层面的行为验证一遍确认幅频相频特性符合预期后再去搭建元器件级电路。理由很简单如果理想闭环都调不对电路级只能更乱。新建一个空白Simulink模型在库浏览器里找到Simulink/Continuous/Transfer Fcn模块拖进画布。双击模块把Numerator系数设置成我们算好的分子向量[K*omega0^2]这里具体数值是[1.586 * 39478417.6]约等于[62625.9]Denominator系数设置成[1, omega0/Q, omega0^2]即[1, 8885.76, 39478417.6]。等一下很多人在这一步容易犯迷糊Simulink的Transfer Fcn模块系数是按照s的降幂顺序排列的分子和分母的维度也必须匹配。如果分子阶次低于分母就像我们现在的情况分子是0阶分母是2阶Simulink会自动在分子前面补零但你自己写参数的时候最好不要省略直接写完整向量这样逻辑更清晰。给滤波器加激励信号和观测模块。从Simulink/Sources里拖一个Sine Wave频率设置为100Hz幅值设为1因为100Hz远低于1kHz截止频率理论上输出幅度应该几乎等于增益K即约1.586。再从Simulink/Sinks里拖一个Scope连接方式就是正弦波信号进滤波器、滤波器输出进Scope。另外再拖一个Scope或者用Mux同时观察输入输出对比效果更直观。我建议把输入信号也进Scope这样能一眼看出幅值变化和相位滞后。运行仿真仿真时间设0.05秒正弦波100Hz下是5个完整周期足够观察稳态行为了。此时你会在Scope上看到输出幅度约1.58V左右相位基本滞后但不算明显这就是理想滤波器的预期表现。3.2 用线性分析工具直接看波特图Scope看时域信号只是第一步验证滤波器频率响应最直接的方式还是波特图。Simulink里有一个非常好用的线性分析功能不需要额外写代码。在模型画布上方菜单栏里找到分析选项卡点击线性化下的波特图选项。系统会提示你指定线性化的输入输出点通常默认就是模型的根输入和根输出直接点执行Simulink会生成这个模型的频率响应波特图。你会看到波特图的走势和我们MATLAB脚本里画出的理论图几乎完全重合-3dB点就落在1kHz位置相频特性在截止频率附近约等于-90度在十倍频程之后趋向-180度。这说明模型搭建没有出错传递函数参数和理论值对上了。这里顺便分享一个小技巧如果你的模型里混入了非线性模块比如饱和、死区等直接线性化会失效或给出警告。这时可以改用一个更暴力的方法——给输入加一个Chirp扫频信号从100Hz线性扫到10kHz然后用Spectrum Analyzer或直接对输入输出做FFT也能画出近似频响曲线。这个方法在处理非理想模型时非常有用。4. 逼真版搭建用Simscape Electrical把运放、电阻、电容一个个连起来4.1 Simscape运放模块的参数设置理想传递函数模型验证了滤波器的灵魂但还差肉体。现在进入Simulink仿真最折腾也最有价值的部分在Simscape Electrical环境里用真实的运放、电阻、电容元器件把Sallen-Key电路搭出来。这一步能把运放饱和、供电电压、输出摆幅这些真实硬件因素都纳入仿真提前暴露实际电路可能遇到的问题。打开Simulink库浏览器如果需要Simscape Electrical支持包确保已经安装了Simscape Electrical工具箱。在库浏览器路径Simscape/Electrical/Semiconductors Converters下找到Operational Amplifier模块拖入画布。这个模块模型了实际运放的几个关键非理想参数开环增益、输入阻抗、输出阻抗、输出饱和电压、压摆率。双击模块把开环增益设为1e5输入电阻设为1MOhm输出电阻设为10Ohm输出饱和电压设为正负13V对应±15V供电下的典型输出摆幅压摆率设置成0.5V/us这是一个经典的通用运放参数。如果你想模拟像OP07或LM358这类具体型号这些参数需要按对应的数据手册去填但先按通用值跑起来逻辑完全一样。还需要在模型里添加一个Solver Configuration模块Simscape/Utilities目录下任何Simscape电路模型都必须包含这个模块用来指定物理网络的求解配置。同时要用Simulink-PS Converter和PS-Simulink Converter把Simulink的数值信号和Simscape的物理信号互相转换。4.2 从0到1的Sallen-Key电路连接步骤我把连接步骤按顺序列出来照着拖就行从Simscape/Electrical/Passive Components下拖两个Resistor模块和一个Capacitor模块复制一份共4个电阻2个电容R1、R2、Rg、Rf以及C1、C2。每个模块双击可以设置阻值容值R1和R2设为1591.5ΩRg设为10000ΩRf设为5860ΩC1和C2设为100nF。从Simscape/Electrical/Sources下添加两个DC Voltage Source一个设置成15V一个设置成-15V分别接到运放的供电引脚V和V-。注意直流电压源的极性符号通常正电压源的正端接运放的V负电压源的负端接运放的V-另一端接地。从Simscape/Foundation Library里添加一个Electrical Reference模块也就是接地模块。运放电路里必须有这个参考地否则电压没有基准点仿真会报错。按Sallen-Key的经典结构连线输入信号经过R1串联到运放同相输入端R2连接在R1的末端和地之间不对这里是Sallen-Key的另一个常用结构。让我先说清楚我选的Sallen-Key结构是信号进入R1R1的输出端节点同时接C1到地、接R2到运放同相输入端C2从运放同相输入端连接到运放输出端反馈网络Rf和Rg串联后一端接运放输出、一端接地取中间节点接运放反相输入端。这个连接方式是Sallen-Key低通的标准接法千万要把R2和C2的位置认清楚接反了就变成高通或者完全乱套。运放输出端接一个PS-Simulink Converter把物理信号转成Simulink信号再接Scope显示。输入信号源用Simulink里的Sine Wave模块经过Simulink-PS Converter转换成物理信号后接入R1。连接完成的电路拓扑就是一个标准的二阶Sallen-Key低通滤波器。看到这里可能有人会问为什么R1和R2阻值要相等C1和C2容值为什么要相等这是Sallen-Key等值元件设计的简化方案在这个条件下传递函数的分母系数变得非常规整增益K和Q的关系式就是前面说的K3-1/Q。仿真时你会发现当Rf和Rg的比例造成增益高于3时电路就会开始自激振荡这是一个非常重要的工程界限。实际上K3时的Q是无穷大意味着系统处于临界振荡状态。我用1.586离3还很远稳定裕度充足。4.3 扫频信号加进去从时域扫出频响曲线电路搭好了接下来要验证它的频响特性。给电路加扫频信号有两种办法第一种是手动改正弦波频率跑一次记录一个点跑十几个频率点也能凑出一条曲线但效率低还容易漏掉关键频段。第二种是直接使用Simulink的Chirp信号模块它的频率会随时间线性增加只要设置好起始频率和终止频率以及扫频时间一次仿真就能记录完整扫频响应。Chirp模块位于Simulink/Sources库中双击设置起始频率100Hz目标频率10kHz扫频时间为5秒。注意采样时间和解算器设置建议使用变步长求解器比如ode45或ode15s最大步长不要超过周期最小的高频部分的十分之一。如果扫频结束后你想用FFT方法提取频响需要在信号进入输出Scope之前用To Workspace模块把输入输出数据都记录到MATLAB工作空间采样率要足够高满足奈奎斯特条件。通常我直接设置固定步长1e-6虽然仿真时间稍微长一点但数据后处理时特别省心。跑完仿真后把工作空间的输入输出信号用MATLAB的tfestimate函数估算频响或者简单一点用保真度最高的分段FFT方法输出幅度除以输入幅度得到增益再换算成分贝相位差就是相位角。把这条实测曲线和之前理论传递函数画在一起你会发现两者在中低频段几乎完全重合而在接近或超过运放增益带宽积时出现明显偏离这是运放非理想因素开始起作用的标志。5. 结果对比理想传递函数、Simscape电路仿真和手算数据能对得上吗5.1 关键指标的三方对照仿真跑完我习惯做一张三方对比表手算期望值、理想传递函数模型测出的值、Simscape电路模型测出的值。三个来源数据如果能比较好地吻合说明搭建过程基本可靠如果偏差过大则需要花时间排查是哪一处环节和预期不符。下面是这个项目得到的典型对比结果指标手算理论值理想传递函数模型Simscape电路模型直流增益K1.5861.5861.584左右截止频率f01kHz1kHz约995Hz-1010HzQ值0.7070.7070.70左右通带纹波0dB0dB约±0.02dB噪声理想传递函数模型自然和理论值完全一致因为它的系数本来就来源于同一个传递函数公式。Simscape电路模型则会出现几个百分点的偏差主要原因是运放的非理想参数开环增益不是无限大输入电阻不是无限大输出电阻也不是零这些因素综合起来给反馈网络附加了微小扰动。不过这个偏差水平落在工程可接受范围内实际搭出电路后元件容差造成的偏差可能比这还大。普通电阻1%精度、电容5%精度算下来截止频率偏差3%到5%都是正常的。5.2 为什么Simscape模型的通带增益低于理论值仔细看Simscape电路的直流增益会发现它并不是严格的1.586而是稍微低一点点。这个现象值得展开说一下。理想模型里运放的增益被当成无穷大所以反馈网络的增益公式是K1Rf/Rg这个表达式完全不包含运放开环增益项。但真实运放的开环增益只有10^5量级虽然已经很大但反馈表达式严格写下会是K (1 Rf/Rg) / (1 (1 Rf/Rg) / A_open_loop)当A_open_loop等于1e5时第二项约等于1.586/1e5也就是约1.6e-5的偏差。虽然很小但确实存在。如果你把运放开环增益故意设成一个比较小的值比如1000就能明显看到直流增益从1.586往下掉这也是仿真里学习反馈理论的绝佳例子你可以在Simscape模型里直接把开环增益改成1000重新跑一次对比结果会很直观。5.3 相频特性和时域响应的偏差相位响应方面理想模型在中频段呈现规则的滞后从0度慢慢降到-180度Simscape电路模型低频段的相位特性几乎一样但越接近运放带宽极限相位滞后越严重这就是运放内部极点引入的额外相移。所以如果你要在闭环控制回路里用这个滤波器必须给环路稳定性余量留得足够大否则滤波器在目标频段看起来性能良好实际叠加运放极点后可能导致整个回路相位裕度不足。时域响应通过输入一个阶跃信号来观察理想模型输出平滑上升没有过冲对应巴特沃斯响应过阻尼或者临界阻尼的特征。Simscape电路模型的阶跃响应初期会有一个很小的延迟和平缓的爬升这是因为运放的压摆率限制了输出变化速度。这个特性在理想模型中完全看不到但实际电路里如果输入信号很大或频率很高压摆率就会成为限制因素输出不再跟随理论曲线而是变成三角波。仿真里你把压摆率改成0.1V/us再跑一次阶跃马上就能看到输出波形变圆变缓这是理解运放大信号特性的好素材。6. 折腾出来的经验那些文档里没写清楚的细节6.1 运放忘记接电源Scope上永远是零这是Simscape电路仿真里最经典的低级错误我自己刚开始也犯过。从库里拖运放模块时V和V-两个供电引脚是裸露的如果不给它们接上正负电压源仿真虽然在跑但运放没有工作点输出端要么是零要么是随机初始值。更迷惑的是如果模型里已经有其它正常工作的模块整体输出看起来似乎有点波形只是幅度不对这更容易让人误判。解决方案很简单无论构建什么有源电路第一步就先把供电网络和地接好再接信号通路。规范的做法是正电源通过一个10uF和100nF去耦电容并联到地负电源同样接去耦电容。仿真里加不加去耦电容对静态工作点影响不大但它能更真实地模拟实际电路板上的供电环境后续如果你把滤波器和DCDC模块联合仿真去耦电容会直接影响电源纹波指标。6.2 解算器的选择和步长设置决定仿真成败Simscape电路模型和纯传递函数模型对求解器的敏感度完全不同。纯传递函数模型用默认的变步长ode45基本没任何问题但Simscape物理模型里包含了大量微分代数方程和非线性环节步长太大会导致病态振荡步长太小又会让仿真跑得极其缓慢。我实践下来的经验是第一top优先级考虑使用ode15s或ode23t这类刚性求解器Simscape的物理网络经常呈现刚性特征第二可先用ode45试跑一个极短的仿真时间窗口如果波形出现高频毛刺或数值不稳定立刻换成刚性求解器第三如果最终的目的是把滤波器模型放进更大的系统里做联合仿真比如和车辆动力学模型或通信基带模型联跑输出端的接口最好通过To Workspace或数据总线统一管理不要从物理域直接连一大堆信号线到控制算法里否则会显著拖慢仿真速度。6.3 高通滤波器怎么变一个很实用的对称技巧有源滤波器搭建工作完成后你大概率还会被要求改一个高通版本或者做一个带通。如果重新设计又得算一遍很费时间。实际上Sallen-Key拓扑有一个特别漂亮的对称性质把原来的电阻换成电容、电容换成电阻低通滤波器就会变身成高通滤波器截止频率不变。在我这个例子里把R1、R2与C1、C2互换位置后结构仍然是Sallen-Key只是高低频特性完全反过来了。注意反馈网络Rf和Rg不需要动增益K和高通响应的Q值关系依然成立。带通相对麻烦一点Sallen-Key不是构建带通的最佳选择我更推荐用多重反馈型或直接串接一个低通和一个高通。串接方案的优势是设计参数解耦低通部分和高通部分可以独立调仿真调参时思路极其清晰。这部分如果你感兴趣可以沿着同样的流程自己做一遍方法完全一样只是把传递函数换成带通形式再重新计算一遍。6.4 滤波器仿真结果的落地陷阱最后说一点容易被忽视的地方。Simulink仿真跑通不代表实际电路就能跑通。仿真里用的元件都是理想标称值实际电阻有温度系数电容有频率特性和介质损耗运放的失调电压和偏置电流会影响直流工作点这些非理想因素加起来可能导致实际电路和仿真结果有不可忽视的偏差。我的做法是在仿真验证完设计指标后至少再做一个蒙特卡洛仿真。把电阻容差设成±1%电容容差设成±5%运放失调电压设为典型值跑200次随机参数组合看滤波器的截止频率和增益分布范围。如果分布范围还在系统要求范围内就说明设计裕量足够可以放心打样如果分布范围超限就需要调整设计比如把关键电阻换成0.1%精密电阻或改用温漂更小的C0G电容。这个步骤虽然会多花一些时间但能帮你省下整整一轮PCB改版打样时间。6.5 和更大系统的集成思路一旦滤波器模型验证结束你要怎么把它用起来如果只是做信号处理验证直接保留传递函数模块就够了跑得快调参方便。如果要进一步验证完整硬件系统的行为Simscape电路模型是必要的但它仿真速度慢适合做低速长时间行为验证。如果为了控制器代码生成那滤波器多半会以双线性变换后的离散传递函数形式存在于控制算法代码里这个时候可以直接用MATLAB的c2d函数把连续域传递函数转换成离散域传递函数拿到离散系统系数后再在Simulink里用Discrete Filter模块搭建或者生成C代码直接部署到嵌入式平台。这也是有源滤波器仿真这个主题在工作中的完整闭环先用理论计算确定架构再用Simulink理想模块快速验证控制算法层面的需求接着用Simscape模型逼近真实硬件特性最后把验证过的滤波器处理逻辑落成代码或硬件产品。每一步的仿真工具选择都有明确目的不是为仿真而仿真。7. 这次搭建之旅后的一点体会把整个搭建过程回看一遍最有价值的环节其实不在搭本身而在于三个不同层次的模型能够互相印证。手算公式让我理解了每个元件值为什么取那个数传递函数模块让我快速验证了系统层面的反馈特性Simscape电路模型让我直观看到了供电电压、运放饱和、压摆率对输出波形的影响。这三个层次的信息叠加在一起你才有底气把仿真结果当作真实系统的近似。如果在电脑前自己动手试一遍我强烈建议你把我前面提到的那几个实验全部做一遍把运放开环增益改成1000看直流增益掉多少把压摆率改成0.1V/us看阶跃响应怎么变圆把增益Rf/Rg改成接近3看系统怎么开始振荡。这些实验单看文字没有感觉亲手跑过以后对Sallen-Key滤波器的理解会彻底从记住了公式变成理解了行为。折腾仿真从来不怕出问题怕的是出了问题不知道往哪儿看希望这篇文章能给你一张足够清晰的排查地图。
返回列表