数字电源环路补偿(3)
数字电源环路补偿(3)
前两篇
叭叭叭讲了一大堆原理,所以这节实际操作一下
首先各类补偿器的传递函数已经知道了,怎么使用模拟电路搭建也说明了,这里主要是使用DSP数字控制,方便验证修改。
假设我们的FPID传递函数如下:
使用tusin(双线性变换法):
其中Ts为系统控制周期,我这里取10kHz,也是就100us。
那么可以得到z域传递函数:
这个写成代码形式就是如下:
为了分析系统控制周期对系统的影响,这里我画几组不同Ts的伯德图如下:
对应的阶跃响应如下:
可以看到,最低要求就是控制频率得是你系统截止频率2倍频以上,推荐20倍频,这样可靠性才能得到保证。否则太低的话,你控制效果虽然不会像上面这样阶梯状,但准确度和响应表现都会大打折扣。
用一组仿真和理论对比图简单明了说明关系:
可以看到截止频率为10khz时,20khz表现已经不怎么能接受了(其实还好),但仿真都这个样子了,实际只会更糟糕。所以取高就好,但Ts边界效应又很明显,100k和1M和连续的表现其实都差不了多少,所以取一个合适的值即可。
好了,上实验平台,LLC变换器:
实验平台参数为400V/48V/480W,控制器使用STM32H7,之前博客介绍过。
这里直接给代码吧:
积分器:
typedef struct {
float x1;
float y1;
} DTI_Sys;
static float DTI(float x0,DTI_Sys* DTI_p)
{
float temp;
temp=(x0+DTI_p->x1)/2;
temp=temp*Sys_Ts+DTI_p->y1;
DTI_p->x1=x0;
DTI_p->y1=temp;
return temp;
}
低通器:
typedef struct {
float x1;
float y1;
float wp;
} LPF_Sys;
static float LPF(float x0,LPF_Sys* LPF_p)
{
float temp;
temp=(x0+LPF_p->x1)*LPF_p->wp;
temp-=(LPF_p->wp-2*Sys_Fs)*LPF_p->y1;
temp/=(LPF_p->wp+2*Sys_Fs);
LPF_p->x1=x0;
LPF_p->y1=temp;
return temp;
}
FPID:
static float FPID3(float x0)
{
static float x1;
static float x2;
static float y1;
static float y2;
float temp;
temp=(FPID3_P+FPID3_D*FPID3_N+Sys_Ts/2*(FPID3_N*FPID3_P+FPID3_I)+FPID3_I*FPID3_N*Sys_Ts*Sys_Ts/4)*x0 \
+2*(FPID3_I*FPID3_N*Sys_Ts*Sys_Ts/4-FPID3_D*FPID3_N-FPID3_P)*x1 \
+(FPID3_P+FPID3_D*FPID3_N-Sys_Ts/2*(FPID3_N*FPID3_P+FPID3_I)+FPID3_I*FPID3_N*Sys_Ts*Sys_Ts/4)*x2;
temp=temp+2*y1-(1-FPID3_N*Sys_Ts/2)*y2;
temp=temp/(1+FPID3_N*Sys_Ts/2);
temp= temp>FPID3_Max ? FPID3_Max:temp;
temp= temp<FPID3_Min ? FPID3_Min:temp;
y1=temp;
y2=y1;
x1=x0;
x2=x1;
return y1;
}
一型补偿器:
float Type_1_compensator_Control(float X)
{
float Yn;
V_loop.Xdata_1=V_loop.Xdata_0;
V_loop.Xdata_0=X;
Yn=V_Type_1_compensator_a1*V_loop.Xdata_0+V_Type_1_compensator_a2*V_loop.Xdata_1-V_Type_1_compensator_b2*V_loop.Ydata_1;
Yn=Yn/V_Type_1_compensator_b1;
if(Yn>PWM_Fs_Max) Yn=PWM_Fs_Max;
else if(Yn<PWM_Fs_Min) Yn=PWM_Fs_Min;
V_loop.Ydata_1=Yn;
return Yn;
}
二型补偿器:
float Type_2_compensator_Control(float X)
{
float Yn;
V_loop.Xdata_2=V_loop.Xdata_1;
V_loop.Xdata_1=V_loop.Xdata_0;
V_loop.Xdata_0=X;
Yn=V_Type_2_compensator_a1*V_loop.Xdata_0+V_Type_2_compensator_a2*V_loop.Xdata_1+V_Type_2_compensator_a3*V_loop.Xdata_2-V_Type_2_compensator_b2*V_loop.Ydata_1-V_Type_2_compensator_b3*V_loop.Ydata_2;
Yn=Yn/V_Type_2_compensator_b1;
if(Yn>PWM_Fs_Max) Yn=PWM_Fs_Max;
else if(Yn<PWM_Fs_Min) Yn=PWM_Fs_Min;
V_loop.Ydata_2=V_loop.Ydata_1;
V_loop.Ydata_1=Yn;
return Yn;
}
关键代码就这些,其实很简单,就是传递函数的编写。
直接展示实验结果:
1、电压控制在负载跳变情况下的影响分析
控制框图以及负载跳变扰动如上,那么有如下表达式:
Zol为系统开环输出阻抗,定义为下图:
因此有下式:
可以看到,对于电压型变换器,负载跳变时Co以及ESR影响较大,其响应时间与fc有关。
上面公式画图直观表现如下:
2、不同工况稳定性分析
不同工况Hfv不同,其零极点分布也不同,例如右图LLC电路其RHPZ随着功率上升频率降低,大大限制了补偿器设计,因此设计补偿器应该按照最坏工况下设计。
上图为Hfv零极点分布图,可以看到系统随着输出功率上升各个零极点都在变换。
这里利用奈奎斯特图进行稳定性分析:
450W和50W情况下,同样一个控制器,显然一个不稳定一个稳定。画出其理论响应图:
通过实验也可看到,一套控制程序左半部分还稳定,负载跳变完成后就振荡了(进行了输出限幅)。
3、暂态效果分析
直接上表格吧,直观点
补偿器类型 | 截止频率 | 离散周期 | 超调量 | 响应时间 | 幅值裕度 | 相位裕度 |
Type-1 | 100Hz | 100us | 3.064% | 7.6ms | 6.85dB | 18.2° |
Type-1 | 500Hz | 100us | N/A | N/A | -7.01dB | -18.6° |
Type-1 | 100Hz | 50us | 2.778% | 7.6ms | 7.01dB | 18.6° |
Type-2 | 100Hz | 100us | 0% | 15.4ms | 21.6dB | 53° |
Type-2 | 500Hz | 100us | 12.037% | 10.08ms | 3.54dB | 7.38° |
Type-2 | 100Hz | 50us | 0% | 15.4ms | 21.8dB | 53.2° |
通过以下理论波形图和实物实验都能双向验证。
结束,希望我的博客对你学习电源控制有帮助。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)