简介
本篇文章大体上介绍了数字电源的基本原理,选择经典BUCK拓扑作为硬件电路,配合psim仿真软件中的C block这一利器(C block可以实现C语言运行,模拟数字电源换路计算过程),实现数字BUCK的闭环控制,并给出了部分波形图。
设计参数
首先简单地给出BUCK的设计参数:
输入:220V整流滤波后的直流电压310V
输出:100V/5A
电感:100uH
电容:470uF
由于是PSIM仿真,所以细节参数并十分重要,比如二极管耐压,过流能力,电感和电容寄生参数等等。
PSIM操作
这里真的建议做数字电源的软件工程师和一部分硬件工程师去熟悉一下PSIM这款电力电子技术仿真软件,可以在网上下载9版本的,是绿色软件,无需破解,反正是用于学习目的就行了。
PSIM的掌握非常快速,下载好后可以去看看它自带的例程,让你先熟悉一下软件的操作,如下图所示,这是本文的仿真电路模型。

整体电路就是简单的BUCK电路加上电压采样器件(可以填写真实电压采样系数),然后送入C block,C block中就是将要填写的换路控制代码。如下图所示为C block

C block可以看作是一个单片机,拥有输入,输出,其引脚数量在input和output中填写,如上图中所示。在编写c语言时,其输入输出分别就是in[n]和out[n],n从0开始。
最后不要忘记添加始终控制,如下图所示为时钟的参数设置,Time step单位为秒,这个参数直接与c block 相关,C block 中的代码执行周期就是这个Time step,所以你可以设置为你的换路计算周期,也可以设置得更细,建议搭建设置小一些,这样波形细节更保真。但也不能太细小,否则仿真时常会让人难以接受。第二个Total time就是运行时长了,这个也不能设置太长,否则仿真回报存储缓冲什么的不够。时钟在Simulate菜单里,点击后选择simulation control,没错这个叫simulation control,然后就会添加一个时钟图形元件。

还要提醒一个比较重要点,PWM驱动开关管无法直接使用逻辑信号,需要一个三角形的原件,如下图所示,最下面蓝色圈圈里就是这玩意。

环路控制
环路控制就是采用简单的PI控制器,这个对于电源来说也非常常见,基本上很多数字实现的电源都可以用PI,至于为什么不用D,也就是PID,那是因为PI更简单,参数只有两个,而且也能满足大部分控制需求。一下为C block中的代码。
g_nStepCount++;
// In case of error, uncomment next two lines. Set *pnError to 1 and copy Error message to szErrorMsg
//*pnError=1;
//strcpy(szErrorMsg, "Place Error description here.");
#define PWM_COUNTER 400 //60M/75k
#define ADC_RESOLUTION 4095
#define ADC_VOLT_REF 3.3
#define R_COEFF 0.0114
#define FAST_K1 0.6978
#define FAST_K2 0.0262
static double T_50kHz = 0;
//****************电压环PID参数********************//
static double temp_ref = R_COEFF * 100 / ADC_VOLT_REF * ADC_RESOLUTION * 8;
static double ShutDownV = R_COEFF * 110 / ADC_VOLT_REF * ADC_RESOLUTION * 8;
static double FastRespondV = R_COEFF * 90 / ADC_VOLT_REF * ADC_RESOLUTION * 8;
static double u_ref = 0;
double VoltTemp;
static double VoltFdbk = 0;
static double u_K1 = 0.07775;
static double u_K2 = 0.07514;
static double u_PID;
static double u_PID1;
static double u_Error0 = 0;
static double u_Error1 = 0;
static int Cnt_loop = 0;
//*******************电压环************************//
T_50kHz ++;
if( T_50kHz == 200 ) //
{
T_50kHz = 0;
u_ref += 10;//软起
if( u_ref > temp_ref )
{
u_ref = temp_ref ;
}
VoltTemp = in[0];
VoltTemp = VoltTemp * ADC_RESOLUTION / ADC_VOLT_REF ;
VoltTemp = VoltTemp * 8;
VoltFdbk = VoltFdbk * 0.2 + VoltTemp * 0.8 ;
u_Error1 = u_Error0;
u_Error0 = u_ref - VoltFdbk;
u_PID1 = u_PID ;
u_PID = u_PID1 + u_Error0 * u_K1 - u_Error1 * u_K2 ;
if(u_PID < 0)
u_PID = 0;
if( u_PID > PWM_COUNTER )
u_PID = PWM_COUNTER * 0.9; //限幅
//********************PWM驱动计算*********************//
out[0] = u_PID/PWM_COUNTER ;
out[1] = u_ref;
out[2] = VoltFdbk;
out[3] = u_PID;//VoltFilter/ 4095 *3.3 /R_COEFF ;// LED%2;//翻转LED
out[4] = u_PID1;
out[5] = u_K1;
}
//*****************************************************//
仿真波形图
波形图就贴几个简单的看看吧,



这篇文章非常适合数字电源初学者去学习环路控制,和各种电源拓扑的分析,总之它带来了相当的便捷,你无需真的硬件电路板和MCU,就可以获得非常真实的波形,但是PSIM的缺点也是显而易见的,它的波形细节还是不够,控制模型偏向理想化,实际仿真很好的环路参数无法完全直接应用于实际,这一部分原因是因为模型的准确度,还有就是C 代码里没有很好的模拟出真实的采样时刻,也就是ADC的触发采样点,以及PWM的更新时刻,通常会有影子寄存器导致更新延迟一拍,如果感兴趣的话,可以自己搭建这一过程来模拟,其实也不难,我之前也做过,不过本片是面向初学者,这些细节问题大家可以在品论区讨论一下啊,后面有时间我再更新如何实现这一过程,谢谢。
编辑于 2022-07-02 · 著作权归作者所有