资讯动态

波特图完全指南:从手绘方法到MATLAB仿真与电源稳定性分析

发布时间:2026/9/18 9:47:10 来源:尧图企业网站定制
不少搞控制、搞电源的工程师第一次接触波特图的时候脑子里都有一堆问号这东西到底怎么画出来的画出来又能说明什么问题我刚入行那会儿也拿着课本纠结过很久——课本上那些渐近线、斜率、拐点看起来很简单但真要让自己从一个传递函数推出一幅波特图总是磕磕绊绊。后来项目做多了尤其是做电源环路补偿和电机控制的时候才发现波特图是环路上最实用的工具没有之一。这篇文章我想把波特图的画法和理解一次讲透手把手带大家从零开始既讲清楚背后的数学逻辑也给出能直接落地的画图步骤和软件操作最后再聊聊数字电源里传递函数怎么离散化这类实战问题。不管你是还在读书的学生还是刚接触控制系统的工程师这篇文章都值得花二十分钟读完。1. 从传递函数说起为什么波特图能“画出来”1.1 传递函数的基本形式和零极点分解传递函数是控制理论里描述系统输入输出关系的数学工具。在连续时间域一般写成G(s) Y(s) / U(s)其中 Y(s) 是输出量的拉普拉斯变换U(s) 是输入量的拉普拉斯变换s 是复频率。波特图画起来方便关键在于先把传递函数做零极点因式分解。任何一个线性时不变系统的传递函数都可以分解成若干典型环节的乘积比如G(s) K * (1 s/ωz1) * (1 s/ωz2) / [ s^n * (1 s/ωp1) * (1 s/ωp2) ]这里的 K 是常数增益ωz 是零点对应的角频率ωp 是极点对应的角频率。之所以必须做这一步是因为波特图的核心思想就是把系统的频率响应拆成一个个“积木”每个积木对应一段简单的直线最后叠加在一起得到整幅图。举个例子电源设计里常见的 Buck 变换器控制到输出的传递函数通常就包含一个双极点由 LC 滤波器产生和一个由输出电容 ESR 引入的零点。你如果不拆开直接用原始多项式去算频率响应手算是很痛苦的但拆成零极点形式每个环节单独看就清楚多了。1.2 对数坐标把乘法变加法把曲线变直线波特图由两条曲线组成幅频特性曲线和相频特性曲线。幅频特性的纵轴用分贝dB表示20log10|G(jω)|横轴用对数频率坐标相频特性的纵轴是相位角度横轴同样是对数频率。用对数坐标不是随便选的它带来两个巨大好处。第一个好处对数坐标系里多个环节相乘的幅值变成了相加。因为 log(a·b) log(a) log(b)。这样你就可以把每个典型环节的幅频曲线单独画出来然后逐点相加得到总曲线。手绘的时候根本不用处理乘法只需要在拐点处改变斜率。第二个好处每个典型环节在对数坐标系里都是一条或者两条直线组成的渐近线最多在拐点附近做一点修正。本来是复杂的频率响应计算画出来却只需要直尺和铅笔就能完成这正是波特图能长期成为工程师桌面工具的根源。2. 手绘波特图一支笔一张纸就能判断稳定性2.1 三类最基本的“积木”先记三个最基础的环节它们是所有复杂传递函数的基本积木。第一个是比例环节 G(s) K。幅频特性是一条水平直线高度 20log10|K| dB相频特性是 0 度。这里没有斜率变化只有整体抬高或压低。第二个是积分环节 G(s) 1/s。幅频特性是斜率为 -20dB/dec 的直线穿过 ω1 时幅值为 0dB相频特性恒为 -90 度。积分环节每出现一次斜率就减 20dB/dec相位减 90 度。二阶积分就是 -40dB/dec、-180 度。第三个是一阶惯性环节 G(s) 1/(1 s/ωp)。这个环节在 ω 远小于 ωp 时增益近似 1是 0dB 水平线在 ω 远大于 ωp 时增益近似 ωp/ω变成 -20dB/dec 的斜线。拐点就在 ωp此时实际幅值是 -3dB。相位从 0 度慢慢过渡到 -90 度在 ωp 处恰好是 -45 度。一阶微分环节 G(s) 1 s/ωz 是惯性环节的镜像拐点在 ωz幅频从 0dB 水平线上扬成 20dB/dec相位从 0 度过渡到 90 度。这三个积木记住后面就能拼出工程师日常遇到的绝大多数系统。2.2 一阶系统绘图三步法拿一个具体的一阶惯性环节举例。比如G(s) 10 / (1 s/100)第一步先确定拐点频率。这个系统拐点在 ωp 100 rad/s。第二步确定低频渐近线。在 ω 100 时G(jω) ≈ 10对应的幅值是 20log10(10) 20dB。所以在 ω1、ω10 这些低频点就是一条 20dB 的水平线。第三步过了拐点斜率变成 -20dB/dec在 ω1000 处幅值降到 0dB。用直尺从 (100, 20dB) 这个点以 -20dB/dec 的斜率往下画到 ω1000 正好到 0dB就完成了幅频曲线。实际曲线和渐近线的差异只在拐点附近幅值最大偏差 3dB在拐点处相位在拐点处正好 -45 度而在拐点频率的十倍频处相位才接近 -90 度。手绘时只要在拐点附近把曲线往下平滑一点、穿过 -45 度就足够工程使用了。2.3 二阶环节的画法阻尼比是关键二阶振荡环节的传递函数通常写成G(s) 1 / [1 2ζ(s/ωn) (s/ωn)^2]其中 ωn 是自然振荡频率ζ 是阻尼比。当 ζ 0.707 时二阶环节近似两个一阶惯性环节串联画法简单。当 ζ 0.707 时在 ωn 附近会出现谐振峰峰值大小为Mr 1 / (2ζ√(1 - ζ^2))用 dB 表示就是 20log10(Mr)。ζ0.5 时谐振峰大约 1.5dBζ0.2 时谐振峰高达约 8dBζ0.1 时超过 14dB。这个峰很关键因为它可能让系统在穿越频率附近的增益抬高导致实际相位裕度比用渐近线估计的小。相位曲线方面二阶环节从 0 度过渡到 -180 度在谐振频率处相位恰好是 -90 度。阻尼比越小相位在谐振频率附近变化越剧烈。2.4 完整传递函数手绘实战来个综合例题。假设系统的传递函数为G(s) 1000(s 10) / [s(s 1)(s 100)]先化成零极点标准形式G(s) 100 * (1 s/10) / [s(1 s)(1 s/100)]这里增益常数取了 100因为分子 1000(s10) 拆成 100010(1s/10)分母 s(s1)(s100) 也拆成 s*(1s)100(1s/100)除下来就是 1000*10/(100) 100。成分分析积分环节一个极点分别在 ω1 和 ω100零点在 ω10。幅频曲线按这些拐点依次画低频段只由积分环节和增益决定G(jω) ≈ 100/(jω)在 ω1 时幅值 100即 40dB斜率 -20dB/dec。在 ω1 处极点生效斜率从 -20dB/dec 变为 -40dB/dec。在 ω10 处零点生效斜率从 -40dB/dec 变为 -20dB/dec。在 ω100 处另一个极点生效斜率从 -20dB/dec 变为 -40dB/dec。相频曲线的趋势是低频接近 -90 度ω1 附近第一个极点让相位往 -90 度方向走到 ω10 后零点又把相位往 90 度方向拉回最后在 ω100 后第二个极点又让相位回到 -180 度方向。这条曲线画出来穿越 0dB 线的频率大约在 13 rad/s 附近此处的相位约 -128 度相位裕度约 52 度。这个相位裕度属于比较健康的范围系统闭环后会有比较小的超调。这个例子说明一个重要规律你不需要用计算器精确求每个频率点只要把拐点和斜率搞对大方向就出来了。工程上你关心的穿越频率、相位裕度都与这些拐点的位置密切相关。3. 用 MATLAB 和 Simulink 画波特图的正确姿势3.1 MATLAB 命令行一行代码出图手绘只是基本功实际设计当然要用工具。MATLAB 画波特图最少只需要一行代码。先建立传递函数对象再调用 bode 函数。s tf(s); G 1000*(s 10) / (s*(s 1)*(s 100)); bode(G); grid on;如果用分子分母多项式的形式也可以这样写num [1000 10000]; den [1 101 100 0]; bode(num, den);这里 den 变量里的 [1 101 100 0] 对应 s^3 101s^2 100s因为原传递函数的分母展开是 s(s1)(s100) s^3 101s^2 100s。想看稳定性指标用 margin 函数更好它会直接在图里标注相位裕度、增益裕度和穿越频率。margin(G);另外如果你想在指定频率范围里看曲线可以用 bode(G, {0.1, 10000}) 这样的方式限定频率范围。频率点越密曲线越平滑但计算量稍有增加绘图时通常用 logspace 生成频率对数向量会更灵活。3.2 Simulink 中让传递函数“显示出来”的两种路径很多朋友在 Simulink 里放了传递函数模块却不知道怎么看传递函数的值、怎么画波特图网上搜到的说法也五花八门。这里我分两种情况说清楚。第一种情况你想让 Transfer Fcn 模块的图标直接显示出分子分母表达式。双击模块在弹出的 Function Block Parameters 窗口里把 Numerator coefficients 填成 [1000 10000]Denominator coefficients 填成 [1 101 100 0]。确认后模块图标上就会显示出对应的传递函数表达式。如果图标没有显示完整可能是视图放缩问题点一下模块框选放大或者重新连接一下信号线再更新模型图标就会重新绘制。第二种情况你想看整个模型从某个输入点到某个输出点的波特图把系统的线性化模型“显示”成表达式再画图。这是更常见的设计需求。步骤是先在模型菜单栏找到 Apps点开 Control Systems Toolbox 下的 Control Design再点 Linear Analysis。在弹出的 Linear Analysis Tool 里定义输入点Input Perturbation和输出点Output Measurement。设置好之后点击 Bode PlotSimulink 会自动在工作点附近线性化模型并画出波特图。如果你想把这个线性化后的传递函数拿到工作区里方便后续当作一个对象来处理可以用 linearize 命令。先通过模型里的 Linear Analysis Points 标识输入输出位置然后在命令窗口运行sys_lin linearize(mymodel_name); tf(sys_lin)这样你就能在命令窗口直接看到系统线性化后的传递函数表达式了。如果你建模时用的是连续模块得到的就是连续传递函数如果用离散模块得到的就是离散传递函数。3.3 仿真和手绘对不上先检查这三处第一处常数增益是不是算错了。手绘里常见的错误是把 20log10(K) 算成 log10(K)忘记乘 20。比如 K100 是 40dB不是 20dB差整整 20dB 会让整条幅频曲线上下平移。第二处单位是不是统一了。波特图横轴是角频率 rad/s而不是 Hz。如果你用频率 f 来核对曲线需要记住 ω 2πf。很多初学者拿 MATLAB 里默认的 rad/s 坐标去和资料里的 Hz 坐标对比就会觉得曲线“错位”。可以用 bode(G, {0.1, 1e6}) 限定时也可以用 bodeoptions 把坐标改为 Hz 显示。第三处Simulink 线性化的工作点问题。如果你的模型是非线性的线性化结果取决于工作点。同一个模型在不同占空比、不同负载电流下线性化出来的传递函数可能差别很大。画波特图之前先检查当前模型是不是在线性化点附近是稳定的否则得到的结果没有实际意义。4. 读懂波特图四个数字吃透系统性能4.1 穿越频率、相位裕度、增益裕度和带宽波特图真正值钱的地方在于它能用几个数字告诉你系统性能到底怎么样。对我来说看一幅波特图一定先看四个指标。穿越频率是指幅频曲线第一次穿过 0dB 线的频率也叫 0dB 交越频率。这个频率直接决定了系统的闭环带宽大致上闭环带宽在穿越频率的 1.5 到 2 倍附近。穿越频率越高系统对指令的响应越快但对噪声的抑制也会变差所以不是越高越好。相位裕度是指在穿越频率处相频曲线到 -180 度线的距离。公式PM 180° ∠G(jωc)其中 ωc 是穿越频率。PM 是衡量系统稳定性的最重要指标。PM 在 30 度以下系统会有明显超调甚至震荡PM 在 45 到 60 度之间闭环响应比较理想PM 为负系统就不稳定了。增益裕度是指相频曲线达到 -180 度时幅频曲线离 0dB 还有多远。一般要求增益裕度大于 10dB才足够抵抗参数漂移带来的影响。第四个指标是带宽广义上就是闭环增益降到 -3dB 的频率。虽然开环波特图不能直接读出闭环带宽但穿越频率和闭环带宽强相关工程上可以用穿越频率初步估计系统带宽。4.2 从 0dB 附近的斜率速判稳定性这个技巧非常实用特别适合你在没有计算工具时快速判断一个系统靠不靠谱。看幅频曲线穿越 0dB 线时那段线的斜率就能猜出稳定性的大致水平。穿越时斜率是 -20dB/dec说明穿越点主要受一个一阶惯性或积分环节主导相位大概率在 -90 度到 -135 度之间PM 通常在 45 度以上系统稳定这是个良好设计。穿越时斜率是 -40dB/dec说明有两个主导极点相位在 -135 度到 -180 度之间PM 可能只有 30 度左右系统有超调风险。这正是很多补偿网络上喜欢放 PID 零点、把穿越频率附近的斜率从 -40dB/dec 抬回 -20dB/dec 的原因。穿越时斜率是 -60dB/dec 甚至更陡基本上相位已经接近或超过 -180 度系统要么不稳定要么需要大幅度修正补偿几乎不可能直接稳定工作。这个速判法不能替代精确计算但能让你一眼发现设计里的高风险环节。我在给电源环路做快速初判时基本都是先看这一点再决定要不要细调补偿参数。4.3 逆向看波特图一幅图反推系统结构看多了波特图以后你会发现它其实是一张“指纹”能反推出系统里有哪些积分环节、哪些零点极点、增益大概多少。比如低频段如果斜率是 -20dB/dec系统至少有一个积分环节对应的闭环系统对阶跃输入的静态误差是零如果低频斜率是 -40dB/dec那就是双积分系统跟随斜坡输入时也能做到无静差。零点会让斜率上折 20dB/dec同时相位上抬极点让斜率下折相位下压。你在波特图上看到任何一个频段内斜率发生转折就对应一个零极点。零点越多相位越“正”极点越多相位越“负”。PID 补偿器为什么好用就是因为它引入两个零点把被控对象的一对极点“拉回来”让穿越频率附近重新获得足够的相位裕度。反向看波特图的能力做系统辨识的时候尤其有用。实测一条频率响应曲线猜出它的零极点结构再用最小二乘拟合成传递函数这是我在调试数字电源时经常走的路径。先有图像直觉再做数学拟合比直接抓一堆数据点硬解参数要快得多。5. 数字电源传递函数离散化从连续到离散的关键一步5.1 为什么要做离散化现代电源控制器越来越多地用 DSP 或 MCU 实现环路采样信号是离散的控制量输出也是离散的。你在连续域设计的补偿器传递函数不能直接写进单片机里执行。你得把它变成给定采样周期下的差分方程。离散化的核心目标是让离散系统的频率响应在控制带宽范围内尽量接近连续系统。这样一来你在 MATLAB 连续域波特图上看到的相位裕度、增益裕度在真正的数字控制器里才大体成立。如果离散化处理得粗糙实际环路稳定性和你用连续模型设计的结果可能差很多。这也是为什么很多做数字电源的工程师仿真时用的是连续模型真正写代码前一定会用 c2d 做一次离散化再验证一次离散波特图。这一步跳不得。5.2 主流的离散化方法与选择逻辑离散化方法有几种各有各的脾气。第一种是零阶保持器法也就是 ZOH 法。MATLAB 里直接调用 c2d(Gc, T, zoh)。它模拟的是 DAC 在采样周期里保持输出值的真实行为数字控制器里确实存在这样的保持效应所以 ZOH 更接近真实情况。但 ZOH 在高频段会和连续系统差得比较多有额外的相位滞后。第二种是一阶前向差分用 s (z-1)/T 替换。这个方法的缺点是可能把稳定的连续系统离散化后变成不稳定的离散系统除非采样频率非常高一般不建议用在控制补偿器上。第三种是后向差分用 s (z-1)/(Tz) 替换。它稳定性好但频率轴会发生严重的压缩变形高频段响应畸变明显。第四种是双线性变换也叫 Tustin 变换用 s (2/T) * (z-1)/(z1) 替换。这是工程上最常用的因为它在整个频段上保持了一一映射稳定系统离散后仍然稳定而且低频段频率响应保持得好。双线性变换唯一的缺点是高频频段会有频率压缩就是所谓的频率畸变。处理办法通常是在设计连续域补偿器时使用预畸变频率或者干脆把零极点设计得避开高频段。对我们做环路补偿来说控制带宽通常远低于采样频率畸变影响不大直接 Tustin 就行。5.3 PI 补偿器离散化完整推导与差分方程拿最常用的 PI 补偿器举个例子它也是数字电源里最基本、最实用的补偿结构。连续域 PI 控制器的传递函数是Gc(s) Kp Ki / s其中 Kp 是比例系数Ki 是积分系数。应用双线性变换令 s (2/T) * (z - 1)/(z 1)代入后整理Gc(z) Kp Ki * T * (z 1) / [2(z - 1)]把两部分合并成一个分数Gc(z) [Kp * 2(z - 1) Ki * T * (z 1)] / [2(z - 1)]进一步整理成 z^(-1) 形式Gc(z) [(Kp KiT/2) - (Kp - KiT/2) * z^(-1)] / [1 - z^(-1)]令输出是 U(z)输入是误差 E(z)则U(z) * (1 - z^(-1)) (Kp KiT/2) * E(z) - (Kp - KiT/2) * z^(-1) * E(z)转换到时域差分方程u[k] u[k-1] (Kp KiT/2) * e[k] (-Kp KiT/2) * e[k-1]这是最容易写成 C 代码的一步。实际写程序的时候先算误差再更新输出。上面的系数 a0 Kp KiT/2a1 -Kp KiT/2 都是常数采样周期固定后可以提前算好运行时只需要一次乘加运算和一次累加DSP 里开一个中断就能跑完。5.4 离散化后的验证与避坑离散化之后不要直接写进硬件先在 MATLAB 里验证一遍离散波特图。代码很简单T 1e-6; % 采样周期假设 1MHz 采样 Gc pid(Kp, Ki, 0); % 连续域 PI Gc_d c2d(Gc, T, tustin); % 双线性变换离散化 bode(Gc, Gc_d, {1, 100000}); % 对比连续和离散波特图观察带宽附近的增益和相位有没有拉开差距。如果采样频率大概是控制带宽的 10 到 20 倍以上两者曲线应该很接近。采样频率如果压得太低比如采样频率只有控制带宽的 5 倍以内离散化带来的相位滞后就会明显连续域里设计的相位裕度在离散系统里要打折扣。还有一个容易被忽略的点数字控制里有计算延迟和 PWM 更新延迟它们等效于在环路里串入了一个额外的延迟环节这个延迟在数学上会引入额外的相位滞后。严格的数字电源设计要把这部分建模进去常见做法是给连续被控对象串一个 e^(-sTd) 的延迟再设计补偿器。实测下来的经验是这个延迟等效相位滞后大概在采样周期的 1 到 1.5 倍之间如果你设计的相位裕度只有 30 度出头加上延迟后很可能就只剩 20 度了系统响应会有明显超调。6. 实践经验与常见误区6.1 画图时最容易犯的几个错第一忘记归一化单位。传递函数里的 s 是复频率单位是 rad/s不是 Hz。画波特图时横轴是角频率如果数据手册或者芯片规格书里标注的频率是 Hz自己心里要先换算。第二渐近线拐点位置标错。一阶惯性环节的拐点在极点频率本身也就是 ωp 处不是 0.1ωp 也不是 10ωp。零点同理。拐点标偏一个十倍频斜率转折就完全错位。第三二阶环节直接按两个一阶环节画。只有在阻尼比大于 0.707 时这样处理误差才可接受。阻尼比小的时候必须画出谐振峰否则你在谐振频率附近的增益估计会偏小很多相位裕度也会高估是非常危险的误判。第四把 open-loop 和 closed-loop 波特图混为一谈。我们通常说的相位裕度看的是开环传递函数 G(s)H(s) 的波特图不是闭环的。闭环波特图主要用于看带宽和响应不能直接读相位裕度。6.2 几个我反复用到的实用技巧第一个技巧手绘完渐近线以后记得在拐点处做 3dB 修正。一阶环节在拐点处实际幅值比渐近线低 3dB相位在拐点两边 0.1 到 10 倍频处分别偏离超过 5 度。这个细节不修正穿越频率和相位裕度的估算误差会比较大。第二个技巧用 margin(G) 代替 bode(G) 做设计校核。margin 会自动标出穿越频率、相位裕度、增益裕度直接读数字比自己在曲线上用光标瞄要准确得多。设计参数有变化时margin 给出的数字能直观地告诉你这次改动的效果。第三个技巧在 Simulink 里做频域分析时别把饱和、限幅这些非线性模块放在线性化回路里。Linear Analysis 工具默认对模型做线性化饱和模块会带来很大的误差结果往往不可信。要么把饱和模块去掉再分析要么在目标工作点附近做好线性化让饱和模块工作在线性区。第四个技巧离散化后的差分方程系数建议在代码里写成定点数或者经过缩放处理的整数。数字电源常用的 DSP 很多不擅长浮点运算直接写浮点系数容易造成舍入误差积累而且执行周期变长。把系数预先乘一个 2 的整数次幂做完整数运算后再右移回来执行速度快很多环路的实时性也会更有保证。第五个技巧拿到一幅波特图先看相位裕度再看穿越频率最后看低频增益。这三个值的优先级是递减的。相位裕度不够其他指标再好都不能用穿越频率太高抗噪性能差低频增益不足稳态精度就上不去。按这个顺序检查能避开不少弯路。我自己实际做电源补偿这么多年最深的一个体会是波特图不是一个“仿真给的结果”而是你脑子里必须能随时画出来的东西。遇到环路不稳先手绘估计一下哪里出了问题——是穿越频率处斜率太陡还是零极点位置和负载范围不匹配——再上软件细算效率比直接盲调参数高得多。每次改完参数习惯性地看一眼波特图上的相位裕度变化久而久之你对系统动态的直觉就会非常准。希望这篇文章能帮你把这条思路打通。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价