离散3P3Z控制器仿真

为VCM的BUCK变换器做控制器的补偿时,需要用TYPE3补偿器,要用双零点补偿功率级的控制到输出函数中存在LC滤波器的双极点。那么问题就来了,在s域用运放很容易的实现TYPE3的效果,如果要把控制器改为数字控制,那么3P3Z又该如何实现呢?

本文以一个VCM的BUCK变换器作为例子,根据BUCK变换器的电感和电容等参数,迅速的得到3P3Z补偿器所需的零极点频率的位置。根据bode图观察频域的效果,接着离散到Z域,然后编写差分方程的3P3Z程序,在PSIM里面进行仿真。如果觉得好用,就可以很容易的应用在LLC或其它电压控制模式的拓扑中。

先在matlab里面建立3P3Z的s域传递函数。

%时间:2018年1月22日%BUCK VCM 3P3Z Control%By:Maileyang

clear all;

echo offclc

%输入参数:Vin  = 12;                     %12VVo = 5;Io = 20;                      %25ALf = 10e-6;                 %BUCK储能电感Co = 470e-6;             %Cout 电容Resr = 2e-3;             %esr电阻fsw = 100e3;             %fsw = 100KhzRload = (Vo/Io);

%计算电压模式控制到输出的传递函数

gxnum = Vin*[Resr*Co 1];                                                 

gxden = [Lf*Co*(1 + Resr/Rload) (Resr*Co + Lf/Rload) 1];   

Hs = tf(gxnum, gxden);                     

zpk(Hs);                                    

Hs = (Hs);

%控制器的参数部分%输入参数

flc = 1/(2*pi*sqrt(Lf*Co));              %VM BUCK LC滤波器转折频率fesr = 1/(2*pi*Co*Resr);              %输出电容的esr引起的零点在30KHZfp0 = 2000;                                %零点处极点频率,决定系统低频增益kfp = 0.15;                                 %两高频极点频率之间的距离kfz = 1.05;                                  %两低频零点频率之间的距离

wz1 = flc * 2 *pi;                          %用控制器零点补偿LC滤波器的双极点wz2 = flc * 2 *pi *kfz;                  %用控制器零点补偿LC滤波器的双极点wp0 = fp0 * 2 *pi;                       %零点处极点频率,决定系统低频增益wp1 = fesr * 2 *pi;                      %用来抵消输出电容esr零点的高频极点wp2 = fesr * 2 *pi *kfp;             %低频极点,决定相位提升

%下面是传递函数% Gs(s) = ((-wp0 * wp1 * wp2)* (s + wz1) * (s + wz2) ) / (s * wz1 * wz2 *(s + wp1)* (s + wp2))

%写入matlab格式的传递函数

fbnum =  -wp0 * wp1 * wp2 * conv( [1 wz1], [1 wz2] );        

fbden = conv( [wz1 * wz2 0], conv( [1 wp1], [1 wp2] ));         

tf_s = tf(fbnum, fbden);                     

zpk(tf_s);                                         

TF_s = (tf_s)                                

%连续转到离散系统

Ts = 10e-6;                                          %采样周期10us

TF_d = c2d(tf_s, Ts, 'tustin')                %双线性Z变换

[num, den] = tfdata(TF_d,'v')              % 提取差分方程系数

[z,p,k] = tf2zp(num,den);

matlab 输出补偿器的s域和z域的传递函数:

TF_s =    -2.133e15 s^2 - 6.379e19 s - 4.766e23  ----------------------------------------  2.234e08 s^3 + 2.733e14 s^2 + 3.793e19 s Continuous-time transfer function.

TF_d =   -4.854 z^3 + 3.504 z^2 + 4.76 z - 3.598  ---------------------------------------   z^3 - 0.4289 z^2 - 0.6479 z + 0.07684 Sample time: 1e-05 secondsDiscrete-time transfer function.

num =

   -4.8543    3.5038    4.7604   -3.5976

den =

    1.0000   -0.4289   -0.6479    0.0768

Matlab 绘出bode:

根据z域传递函数编写3P3Z的程序:

/** 3p3z_test*By:maileyang*Date:2018/03/22*/

#include <Stdlib.h>#include <String.h>#include  <math.h>

int g_nInputNodes=0;int g_nOutputNodes=0;int g_nStepCount=0;

/**3P3Z define*/

double V_out_sen = 0;

double ctrl_3p3z = 0;double ctrl_3p3z_1 = 0;double ctrl_3p3z_2 = 0;double ctrl_3p3z_3 = 0;

double V_ref = 0;

double error_0 = 0;double error_1 = 0;double error_2 = 0;double error_3 = 0; double a1 =  -0.4289;double a2 =  -0.6479;double a3 =  0.0768;

double b0 =  -4.8543;double b1 = 3.5038;double b2 = 4.7604;double b3 =  -3.5976;

double out_max = 9.5;double out_min = 0.05;

{

 V_out_sen = in[0];  V_ref = in[1];

 error_0 = V_ref - V_out_sen;

 ctrl_3p3z = ( b0*error_0 + b1*error_1 + b2*error_2 + b3*error_3 - a1*ctrl_3p3z_1 - a2*ctrl_3p3z_2 - a3*ctrl_3p3z_3 );  if(ctrl_3p3z <= out_min) {  ctrl_3p3z =  out_min; }  if(ctrl_3p3z >= out_max) {  ctrl_3p3z = out_max; } out[0] = ctrl_3p3z;  ctrl_3p3z_1 = ctrl_3p3z; ctrl_3p3z_2 = ctrl_3p3z_1; ctrl_3p3z_3 = ctrl_3p3z_2;  error_1 = error_0; error_2 = error_1; error_3 = error_2; }

最后在PSIM里面仿真验证3P3Z程序和参数的性能,看看是否达能到设计目的。如果不行,可以在matlab中调整零极点位置,然后离散成Z域传递函数,提取差分方程所需的系数,再次进行仿真即可。

PSIM仿真原理图:

时域仿真:

  可见这组3P3Z的差分方程的参数还有相当大的优化空间,这就留给亲爱的读者朋友们自行玩耍吧。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 2
收藏 4
关注 603
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧