前言:昨天更新了移相全桥的功率级仿真部分,有兴趣可以点过去看看。《移相全桥仿真建模与控制 第一节》
电压模式控制的移相全桥变换器,在闭环控制的角度上可以看成是BUCK类的衍生。毕竟不管移相全桥,硬开关全桥,双管正激,都是通过控制原边开关的占空比,再通过隔离变压器降压,变成输入为Vin/N的方波加到次级的BUCK电路上。所以下文将从隔离BUCK的角度来做闭环控制器的参数设计。
下图是电压模式控制的BUCK变换器的原理图,详细的展示了功率级,反馈采样网络,反馈控制器,PWM发生器,这些必备的组件。
下图是把实际电路简化为环路控制的视角:
环路可以分为:功率级Gvd(s),PWM发生器Fm,反馈和采样Gea(s),由三者相乘构成了整体的环路增益,我们分析稳定性就是用这个T(s)。简而言之环路设计:就是在选定的开环穿越频率Fc处,计算功率级和PWM这一级的传递函数Gpl(s)在该频率点处的的增益和相位移,然后再计算反馈控制器的参数对功率级的参数进行补偿。举个简单例子就是,当功率级在1KHz增益衰减了-10dB,反馈控制器就是在这个点提升10db就好了,此时环路整体增益在1KHz这点就是0db。所以设计补偿器最关键的需要了解功率级从控制到输出的参数函数。下图是CCM BUCK的控制到输出传递函数:
从CCM BUCK的控制到输出的传递函数中可以看到一个与输出电压有关系的变量Vin,这个参数对反馈设计的最恶劣分析有用。由VIN的作用下,功率级的增益在低输入时低,在高压时增益高。如果闭环控制的参数是固定的,那么最好考虑在VIN最高输入电压时的增益,因为电压模式的BUCK的麻烦之处是功率级的LC滤波器的谐振频率处的增益尖峰,所以当VIN在最高处,所提供的基础增益更高,那么LC滤波器的增益尖峰就更加恶劣了。所以,下面使用VIN为最大值处的DC增益做反馈设计。
PWM增益用于描述占空比为1时所对应的PWM斜坡高度,可以当作PWM发生器的精确度来理解。数字系统使用与模拟一样的办法,比如模拟控制IC中斜坡高度电压为5V,那么三角波的增益为1/5=0.2。而在数字控制器中,使用up counter模式时,此处的增益就是1/tbprd。
有了上文的功率级传递函数,PWM的增益,在结合拓扑的实际参数就可以开始环路设计了,下面是功率级的参数信息:
Vin :300 ~ 400V
Vo : 12V
Io = 160A
Np/Ns = 22/1/1
Lf = 1uH
Lr = 5uH
Cout = 1000uF
Resr = 5m ohm
原理图可见:
稳态工作波形:
有了功率功率级参数和控制到输出的传递函数,就可以在matlab里面开始环路设计了。第一步先求出控制到输出的传递函数,再然后使用matlab siso tool工具直接设计闭环控制器的参数,即可简单快速的完成设计。附录中是详细代码,下文将一步一步的展示具体过程:
第一步是计算控制到输出的传递函数,下图是控制到输出电压的传递函数Bode,在LC谐振频率处存在很明显的增益尖峰,因此可以把穿越频率放在700~1000Hz处。对了你可能会问,为什么低频增益这么低,是因为被Gpwm拉低的,后面在补偿器里面可以补偿起来。备注:控制到输出的传递函数离散的方法看参加这篇文章:《理解数字控制系统的环路设计 - 入门级》。
传递函数:
Gvd = 0.0007013 z^2 + 0.001605 z - 9.159e-05 z^(-2) * -------------------------------------- z^2 - 1.59 z + 0.7727 Sample time: 1.5e-05 secondsDiscrete-time transfer function.
bode图:
第二步调用SISO工具开始环路设计。
使用PID调试工具得到所需的参数,此组反馈参数下环路穿越频率在727Hz,PM 85deg,增益余量在-9.4dB,频率在4.2KHz,此时的时域和频域都可以接受,所以选定此组参数,可见下图。
补偿器的传递函数为:
此时matlab输出的补偿器输传递函数在w域,可以使用C2D工具离散到Z域,就可以在Z域计算系统的开环增益和分析稳定性。计算得到补偿器的Z域传递函数为:
Gc_z_v =
8.427 z^2 - 10.16 z + 2.118
---------------------------
z^2 - 1.924 z + 0.9241
Sample time: 1.5e-05 seconds
Discrete-time transfer function.
第三步检查开环增益的稳定性:根据控制到输出和补偿器的传递函数就能得到环路增益Bode,可见下图。此时系统是稳定的,到此环路设计完成,如果参数不满意,可以根据上诉过程继续优化。
备注:环路仿真部分,后面再单独发来一篇。感谢观看,谢谢。
致谢:感谢 时光如水 指正昨天文章中超前桥错误的问题,谢谢。
附录 matlab 代码:
% Phase shift full bridge dcdc
% Vin 300 - 400
% Vo 12V/160A
% By: Yangshuai
% 2020/03/06
clear all;
echo off
clc
% Vin = 300 ~ 400V VO = 12V Io = 160A
% Lf = 1uH Co = 1000uF esr = 5m ohm
% Np / Ns = 22 / 1 / 1
% Fsw = 66.6KHz
% Converter info
Vo_min = 300;
vo_max = 400;
vo = 12;
Io = 160;
RL = vo/Io;
G_vout = RL;
np = 22/1;
pwm_count = 1500; % PWM counter
gf_pwm = 1/pwm_count; % Gpwm
Ts = 15e-6; % controler Ts
Td = 1.5 * Ts; % controler Tdelay
% Power info
L = 1e-6; %buck Lf
C = 1000e-6; %buck Cout
Rc = 5e-3; %buck Cout esr
fo = 1/(2*pi*sqrt(L*C));
% Duty control to Vout TF:
num_Gps = gf_pwm * (vo_max/np) * [Rc*C 1];
denom_Gps = [L * C * (1 + Rc/RL) (L/RL + Rc*C) 1];
% Build Vloop Tf
Gps_dly = tf(num_Gps, denom_Gps, 'inputdelay' , Td); %s-domain plant with computation delay Td%
Gvd = c2d(Gps_dly, Ts, 'zoh') %Discrete plant with ZOH, Kd and Td%
% Duty control to Iout TF:
Gif = Gvd * (1/RL);
zpk(Gif);
%Plot Gpl bode
Gpl = 0;
GTLP = 1;
call_siso = 1;
if Gpl
x = bodeplot(Gvd, Gif);
setoptions(x,'FreqUnits','Hz','PhaseVisible','on')
grid on;
if call_siso
% Call control tool
controlSystemDesigner(Gvd)
end
end
if GTLP
% Voltage loop comp FC = 514HZ
num_c = 3.4186e5 * conv([0.00023 1], [1.3e-5 1]);
den_c = [0.00019 1 0];
Gc_w = tf(num_c, den_c)
Gc_z_v = c2d(Gc_w, Ts, 'tustin')
% Iloop COMP
Gc_z_i = Gc_z_v * (vo/Io)
% open loop bode
Tvloop = Gvd * Gc_z_v;
Tiloop = Gif * Gc_z_i;
z = bodeplot(Tvloop, Gvd, Gc_z_v);
setoptions(z,'FreqUnits','Hz','PhaseVisible','on');
grid on;
end