北京集团网站建设公司专业分销网站建设
2026/6/1 14:14:22 网站建设 项目流程
北京集团网站建设公司,专业分销网站建设,企业宣传片报价明细,wordpress 在线人数. 右半平面零点 (RHPZ) 来源解析 Boost 电路的传递函数为#xff1a; H ( s ) V g D ′ 2 D ′ 2 R − s L s 2 L C R s L R D ′ 2 该传递函数的零点位于 s D ′ 2 R L #xff0c;由于零点符号为正#xff0c;因此属于右半平面零点。 为了…. 右半平面零点 (RHPZ) 来源解析Boost 电路的传递函数为H(s)VgD′2D′2R−sLs2LCRsLRD′2该传递函数的零点位于sD′2RL由于零点符号为正因此属于右半平面零点。为了深入理解右半平面零点的物理起源我们需要回顾其推导过程。在连续导通模式 (CCM) 下Boost 电路传递函数的推导基于电感和电容在稳态下的状态方程。在一个开关周期内根据电感伏秒平衡和电容安秒平衡原理可列出以下方程⟨vL⟩Ld⟨iL⟩dtd⟨vg⟩−(1−d)⟨vo⟩⟨iC⟩Cd⟨vo⟩dt(1−d)⟨iL⟩−⟨vo⟩R其中d是开关管占空比⟨vg⟩是输入电压平均值⟨vo⟩是输出电压平均值⟨iL⟩是电感电流平均值⟨⋅⟩表示一个开关周期内的平均值即⟨x(t)⟩1Ts∫tTst−Tsx(τ)dτ将各平均量分解为直流分量和交流小信号分量⟨iC⟩IC^iC^iC⟨iL⟩IL^iL⟨vg⟩Vg^vg⟨vo⟩Vo^vodD^d将分离后的变量代入状态方程Ld⟨iL⟩dtLd(IL^iL)dtLd^iLdtVg^vg−(1−D−^d)(Vo^vo)Cd⟨vo⟩dtCd(Vo^vo)dtCd^vodt(1−D−^d)(IL^iL)−Vo^voR对上述方程进行拉普拉斯变换sL^iLVg^vg−(1−D−^d)(Vo^vo)sC^vo(1−D−^d)(IL^iL)−Vo^voR将电感方程中的^iL代入电容方程同时忽略直流分量和二阶交流分量只保留一阶小信号项s2LRC^vosL^vo(1−D)2R^vo−sRLIL^d−VgR^d(1−D)R^vg2(1−D)VoR^d令^vg0并利用关系式Vg(1−D)Vo和ILVo/[R(1−D)]最终化简得到传递函数。值得注意的是方程中的−sRLIL^d项是右半平面零点的直接来源这一项是在将电感方程和电容方程联立求解过程中产生的。式电容方程中包含的电感电流与占空比相乘的项(1−D−^d)(IL^iL)是升压型变换器所特有的耦合特性。因此所有升压型开关变换器如 Boost、Flyback、Cuk 等拓扑都会出现右半平面零点现象。2. 右半平面零点 (RHPZ) 的仿真验证在 Python 中我们可以使用 Matplotlib 绘制传递函数的波特图并标识出零点位置。假设电感和电容参数固定通过改变负载电阻 R观察波特图的变化趋势及零点移动规律。import numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom scipy import signaldef bode_plot(tf_list, zero_list, f_min, f_max, ax1None, ax2None, colorsNone, linestylesNone, labelsNone, title):生成伯德图 - 支持多个传递函数并标出零点位置参数:tf_list: 传输函数列表或单个传输函数zero_list: 零点列表每个元素对应一个传递函数的零点数组f_min: 最小频率 (Hz)f_max: 最大频率 (Hz)ax1: 幅度图轴对象 (可选)ax2: 相位图轴对象 (可选)colors: 颜色列表 (可选)linestyles: 线条样式列表 (可选)labels: 标签列表 (可选)title: 图形标题 (可选)# 如果输入是单个传递函数转换为列表if not isinstance(tf_list, (list, tuple)):tf_list [tf_list]# 如果zero_list不是列表转换为列表if not isinstance(zero_list, (list, tuple)):zero_list [zero_list]# 设置默认值if colors is None:colors plt.cm.tab10(np.linspace(0, 1, len(tf_list)))if linestyles is None:linestyles [-] * len(tf_list)if labels is None:labels [fTF {i1} for i in range(len(tf_list))]# 确保列表长度一致if len(colors) len(tf_list):colors colors * (len(tf_list) // len(colors) 1)if len(linestyles) len(tf_list):linestyles linestyles * (len(tf_list) // len(linestyles) 1)if len(labels) len(tf_list):labels labels [fTF {i1} for i in range(len(labels), len(tf_list))]# 确保zero_list长度与tf_list一致if len(zero_list) len(tf_list):# 如果零点列表较短用空列表填充zero_list list(zero_list) [[] for _ in range(len(zero_list), len(tf_list))]# 如果没有提供轴对象则创建新的图形if ax1 is None or ax2 is None:fig, (ax1, ax2) plt.subplots(2, 1, figsize(10, 8))show_plot Trueelse:show_plot False# 为每个传递函数生成Bode图for i, tf in enumerate(tf_list):frequencies np.logspace(np.log10(f_min), np.log10(f_max), 1000)omega 2 * np.pi * frequenciesw, mag, phase signal.bode(tf, omega)# 绘图参数color colors[i] if i len(colors) else Nonelinestyle linestyles[i] if i len(linestyles) else -label fR{labels[i]} if i len(labels) else fTF {i1}# 幅度图line_mag ax1.semilogx(w, mag, colorcolor, linestylelinestyle, labellabel, linewidth2)ax1.set_ylabel(幅度 (dB))ax1.grid(True, whichboth, ls-, alpha0.3)# 相位图line_phase ax2.semilogx(w, phase, colorcolor, linestylelinestyle, labellabel, linewidth2)ax2.set_xlabel(角频率 (Rad/s))ax2.set_ylabel(相位 (Degree))ax2.grid(True, whichboth, ls-, alpha0.3)# 标记零点位置if i len(zero_list) and zero_list[i] is not None:zeros zero_list[i]# 确保zeros是数组形式if not isinstance(zeros, (list, tuple, np.ndarray)):zeros [zeros]for zero in zeros:# 只在频率范围内标记零点if f_min zero/(2*np.pi) f_max:# 获取当前线条的颜色line_color line_mag[0].get_color()# 在零点频率处计算传递函数值w_zero zero # 零点的角频率s_zero 1j * w_zero# 近似计算零点处的响应值简化处理try:# 使用频率响应计算零点处的近似值_, mag_zero, phase_zero signal.bode(tf, [w_zero])if phase_zero[0] -360:phase_zero[0] 360elif phase_zero[0] 0:phase_zero[0] - 360# 在图上标记零点ax1.plot(w_zero, mag_zero[0], o, colorline_color, markersize6,markeredgecolorblack, markeredgewidth1)ax2.plot(w_zero, phase_zero[0], o, colorline_color, markersize6,markeredgecolorblack, markeredgewidth1)# 添加垂直虚线指示零点位置ax1.axvline(w_zero, colorline_color, linestyle:, alpha0.7)ax2.axvline(w_zero, colorline_color, linestyle:, alpha0.7)except:# 如果计算失败至少画一条垂直线表示零点位置ax1.axvline(w_zero, colorline_color, linestyle:, alpha0.7)ax2.axvline(w_zero, colorline_color, linestyle:, alpha0.7)# 设置标题和图例if show_plot:if title:plt.suptitle(title)ax1.legend()ax2.legend()plt.tight_layout()plt.show()return ax1, ax2# 使用典型升压转换器值的示例if __name__ __main__:# 典型升压转换器参数L 300e-6 # 300 μHC 100e-6 # 100 μFr_L 0.01 # 10 mΩ 电感电阻r_C 0.05 # 50 mΩ 电容ESRV_in 20 # 20 V 输入V_out 40 # 40 V 输出f_min 10f_max 1e6# 不同负载电阻值R_values [0.5, 10, 200, 5000] # 不同的负载电阻值# 计算占空比D 1-V_in/V_out# 计算不同负载电阻的零点及传递函数zeros []tf_list []for R in R_values:num [-L*V_in/((1-D)**2), R*V_in]den [L*R*C, L, R*(1-D)**2]tf signal.TransferFunction(num, den)tf_list.append(tf)zero (1-D)**2*R/Lzeros.append(zero)# 定义颜色和线型colors [blue, red, green, orange]linestyles [-, --, -., :]# 创建图形和轴fig, (ax1, ax2) plt.subplots(2, 1, figsize(12, 10))result bode_plot(tf_list, zeros, f_min, f_max,ax1, ax2, colors, linestyles, R_values, Boost 电路不同负载电阻下的 Bode 图)# 添加图例ax1.set_ylabel(幅值 (dB), fontsize12)ax1.set_title(Boost 电路不同负载电阻下的 Bode 图, fontsize14)ax1.legend()ax1.grid(True, whichboth, ls-, alpha0.3)ax2.set_xlabel(角频率 (Rad/s), fontsize12)ax2.set_ylabel(相位 (度), fontsize12)ax2.legend()ax2.grid(True, whichboth, ls-, alpha0.3)plt.tight_layout()plt.show()运行脚本将生成以下结果rhpz-via-r从仿真结果可以看出当负载电阻减小时右半平面零点向低频方向移动。由于右半平面零点会产生90∘的相位滞后当其处于较低频率时会给补偿器设计带来很大困难。3. 右半平面零点 (RHPZ) 的补偿策略通常的解决方法是降低补偿器增益使穿越频率位于零点频率之前。但这会导致系统带宽变窄影响动态响应速度。通过适当调整补偿器的零极点位置可以在一定程度上缓解这个问题。例如采用包含 1 个零点和 2 个极点的补偿器其传递函数为G(s)110⋅s50s⋅(s10000)该补偿器的设计考虑分母中的单独s项提供积分作用确保直流增益足够高以减小稳态误差积分器本身带来90∘相位滞后加上 RHPZ 的90∘滞后需要在低频处添加左半平面零点来提供相位超前第二个极点设置在适当频率用于限制高频增益防止噪声放大import numpy as npimport matplotlib.pyplot as pltfrom scipy import signaldef bode_plot(tf_list, f_min, f_max, ax1None, ax2None, colorsNone, linestylesNone, labelsNone, title):生成伯德图 - 支持多个传递函数参数:tf_list: 传输函数列表或单个传输函数f_min: 最小频率 (Hz)f_max: 最大频率 (Hz)ax1: 幅度图轴对象 (可选)ax2: 相位图轴对象 (可选)colors: 颜色列表 (可选)linestyles: 线条样式列表 (可选)labels: 标签列表 (可选)title: 图形标题 (可选)# 如果输入是单个传递函数转换为列表if not isinstance(tf_list, (list, tuple)):tf_list [tf_list]# 设置默认值if colors is None:colors plt.cm.tab10(np.linspace(0, 1, len(tf_list)))if linestyles is None:linestyles [-] * len(tf_list)if labels is None:labels [fTF {i1} for i in range(len(tf_list))]# 确保列表长度一致if len(colors) len(tf_list):colors colors * (len(tf_list) // len(colors) 1)if len(linestyles) len(tf_list):linestyles linestyles * (len(tf_list) // len(linestyles) 1)if len(labels) len(tf_list):labels labels [fTF {i1} for i in range(len(labels), len(tf_list))]# 如果没有提供轴对象则创建新的图形if ax1 is None or ax2 is None:fig, (ax1, ax2) plt.subplots(2, 1, figsize(10, 8))show_plot Trueelse:show_plot False# 为每个传递函数生成Bode图for i, tf in enumerate(tf_list):frequencies np.logspace(np.log10(f_min), np.log10(f_max), 1000)omega 2 * np.pi * frequenciesw, mag, phase signal.bode(tf, omega)# 绘图参数color colors[i] if i len(colors) else Nonelinestyle linestyles[i] if i len(linestyles) else -label labels[i] if i len(labels) else fTF {i1}# 幅度图ax1.semilogx(w, mag, colorcolor, linestylelinestyle, labellabel)ax1.set_ylabel(幅度 (dB))ax1.grid(True, whichboth, ls-, alpha0.3)# 相位图ax2.semilogx(w, phase, colorcolor, linestylelinestyle, labellabel)ax2.set_xlabel(角频率 (Rad/s))ax2.set_ylabel(相位 (Degree))ax2.grid(True, whichboth, ls-, alpha0.3)# 设置标题和图例if show_plot:if title:plt.suptitle(title)ax1.legend()ax2.legend()plt.tight_layout()plt.show()return ax1, ax2def series_transfer_functions(tf1, tf2):将两个传递函数串联参数:tf1: 第一个传递函数 (TransferFunction对象)tf2: 第二个传递函数 (TransferFunction对象)返回:串联后的传递函数# 串联传递函数H(s) H1(s) * H2(s)# 分子num conv(num1, num2)# 分母den conv(den1, den2)num_result np.convolve(tf1.num, tf2.num)den_result np.convolve(tf1.den, tf2.den)return signal.TransferFunction(num_result, den_result)def safe_vector_add_right(vec1, vec2):Right-aligned vector addition using basic loopslen1 len(vec1)len2 len(vec2)if len1 len2:# vec1 is longerresult []# Copy the beginning of vec1 that doesnt overlapfor i in range(len1 - len2):result.append(vec1[i])# Add the overlapping partsfor i in range(len2):result.append(vec1[len1 - len2 i] vec2[i])else:# vec2 is longerresult []# Copy the beginning of vec2 that doesnt overlapfor i in range(len2 - len1):result.append(vec2[i])# Add the overlapping partsfor i in range(len1):result.append(vec1[i] vec2[len2 - len1 i])return resultdef close_loop_transfer_function(tf):计算闭环传输函数参数:tf: 传递函数 (TransferFunction对象)返回:闭环传输函数return signal.TransferFunction(tf.num, safe_vector_add_right(tf.den, tf.num))if __name__ __main__:# 输入参数L 300e-6 # 300 μHC 100e-6 # 100 μFR 0.5V_in 20 # 20 V 输入V_out 40 # 40 V 输出f_min 1f_max 1e6# 创建多个传递函数D 1 - V_in/V_out# Boost传递函数num1 [-L*V_in/((1-D)**2), R*V_in]den1 [L*R*C, L, R*(1-D)**2]boost_tf signal.TransferFunction(num1, den1)# 补偿器的传递函数gain 110zeros [-50]poles [0, -10000]num2 np.array(np.poly(zeros))*gainden2 np.poly(poles)comp_tf signal.TransferFunction(num2, den2)# 补偿后的Boost传递函数boost_comp_tf series_transfer_functions(boost_tf, comp_tf)# 闭环传输函数close_tf close_loop_transfer_function(boost_comp_tf)# 传递函数列表tf_list [boost_tf, comp_tf, boost_comp_tf, close_tf]labels [补偿前的Boost, 补偿器, 补偿后的Boost, 闭环传递函数]colors [blue, red, green, black]linestyles [-, --, -., :]# 绘制所有传递函数bode_plot(tf_list, f_min, f_max, colorscolors, linestyleslinestyles,labelslabels, titleBoost 电路补偿前后的Bode图对比)仿真结果如图所示boost-with-compensation从图中可以看出补偿后的环路带宽约为 1000 rad/s穿越频率对应的相位约为−150∘相位裕量约30∘环路基本稳定。然而这种补偿方案存在局限性。当负载电阻增大至R50Ω时重新仿真得到如下结果boost-with-compensation-50R此时补偿后的穿越频率对应相位降至−200∘以下环路变得不稳定。原因在于当 R 增大时Boost 电路的两个共轭极点向 LC 谐振频率靠拢在两个极点各−90∘相位滞后的叠加作用下环路相位在该频率处急剧下降180∘导致系统失稳。4. 结论与讨论RHPZ 的本质右半平面零点是升压型变换器的固有特性源于电感电流与占空比之间的非线性耦合关系。负载依赖性RHPZ 的位置随负载电阻变化轻载时向低频移动给环路稳定性设计带来更大挑战。补偿局限性固定参数的补偿器难以在宽负载范围内保证稳定性为规避 RHPZ 的影响通常需要限制带宽但这会牺牲动态性能

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

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

立即咨询