• 1
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

4 “Simplified C block”在数字Buck变换器中的应用(PSIM教程)

前言

变换器的控制通常可以分为数字和模拟两类,其中数字控制是用数字控制器,通过编程的方法实现变换器的控制;模拟控制是通过模拟电源管理芯片实现变换器的控制,两种方法各有自身优点。在建模的过程中,可以通过运放搭PI调节器环路,也可以通过编程的方法实现。若控制环路简单时用运放实现较为方便,若控制复杂时用编程的思想更容易实现。而PSIM中编程则使用“Simplified C block”实现,下面以Buck变换器为例讲述“Simplified C block”的使用方法。

目录

1、“Simplified C block”简易C语言代码块

2、“Simplified C block”在数字Buck变换器中的应用

 

1 “Simplified C block”简易C语言代码块

在PSIM中“Simplified C block”简易C代码块怎么找到?

方法:Elements→Other→Function Blocks→Simplified C block。

Name:“Simplified C Block”简化C代码块,可以直接输入C代码,无需编译。

简化C代码块允许用户直接输入C代码,而无需编译代码。C解释器引擎将在运行时解释和执行C代码。C代码块支持自定义和修改代码块的功能。

简化C代码块使用方便,也可用于自动代码生成。

功能注释如下:

Number of Input/Output Ports:定义输入端口或输出端口的数量;

Color:定义C代码块图像的颜色;

Edit Image:自定义C代码块的轮廓颜色;

Enable Fixed Point:选中此框,C代码块的输入输出均为定点,点击“Fixed Point Settings”按钮可定义定点数据类型。

Variables:该函数允许参数从主电路传递到C代码块。例如,要将常量k1、k2…、k5传递到C代码中,在对话框窗口中定义以下内容:

Variable Description:k1

Variable name:k1

Variable Default Value:5

Insert GetPsimValue:检索同一原理图中C代码块之外的元素的参数值。此按钮将打开一个对话框,其中列出了一侧的所有元素,如果在另一侧选择了每个元素的参数。自动代码生成不支持此函数。

Insert SetRunTimeValue:在仿真运行时计算元素的参数值。此按钮将打开一个对话框,其中列出了一侧的所有元素,如果在另一侧选择了每个元素的参数。自动代码生成不支持此函数。

Check Code:检查C代码的语法。

除了用户定义的变量外,以下变量也可以在代码中使用:

t:时间t,从PSIM获取;

delt:步长,从PSIM获取;

x1,x2…xn:输入x1,x2…xn,从PSIM获取;

y1,y2…yn:输出y1,y2…yn,从PSIM获取;

所有输入和输出都是双数据类型,除非选中了“启用定点”框并且明确定义了输入/输出数据类型。

Note:输入输出顺序从上到下为1,2,…,n,左侧为输入,右侧为输出,带点的输入引脚为第一个输入,未使用的输入节点必须接地。

变量函数:

该部分定义的变量名可以在代码中使用。变量值可以是数字或公式。这些公式可以包含在参数文件中定义的变量或从命令行传递给原理图的变量。公式在仿真开始前进行评估,不能包含t(时间)或输入/输出值。例如:

a=15.2

a=Freq/sqrt(2) Freq在“File”中定义。

这些变量与SimCoder兼容。请注意SimCoder生成的代码将显示计算值,而不是公式。

z域电路中的C代码块:

在z域电路中使用C块时,PSIM将检查在C代码块的输入端是否立即连接任何ZOH块。如果有,它将采用从第一个输入开始遇到的第一个ZOH块的采样率,并对整个块使用此采样率。例如,如果有2个输入,输入1连接到一个10kHz的ZOH,输入2连接到一个20kHz的ZOH,它将取10kHz而忽略20kHz。

目前,C代码块不支持多个采样率的输入。也就是说,C块中的代码将只以一个速率运行。

如果在C代码块的输入端没有立即连接ZOH,则在每个步长调用C代码块。

插入GetPsimValue函数:

使用该函数,C代码块可以访问参数文件和其他电路参数。要检索同一原理图中参数文件中的变量值,请使用以下代码片段:

#include "psim.h"; // Include the head file for the GetPsimValue function
int nStatus = -1;
double value = GetPsimValue(reserved_ThreadIndex, reserved_AppPtr, "", "alpha", &nStatus);
if(nStatus != 0)
{//optional error handling code
pintf("Error: alpha = %f, nStatus = %i \n", value, nStatus);
}

如果成功返回变量“alpha”的值,则将“nStatus”设置为零。错误处理是可选的。

此功能目前与SimCoder不兼容。

Remarks:每个C代码块作为一个独立的单元。一个C代码块中的全局变量对其他C代码块是不可见的。将值从一个C代码块传递到另一个C代码块或电路的任何其他部分的唯一方法是通过C代码块的输入/输出端口。当一个C代码块的输出直接连接到另一个C代码块的输入时,PSIM仿真引擎首先运行第一个C代码块,然后是第二个C代码块。

注意,不像DLL块,它是不可能调试和逐步通过C代码块代码。调试C代码块的常用方法是在代码中放置临时的“printf”语句,以便在不同的执行点读取变量值。下面的语句放置在SimulationStep中时,将在每个步长显示变量omega的值。

printf("Time=%f,omega=%f \n",t,omega);

2 “Simplified C block”在数字Buck变换器中的应用

以PSIM中“Examples”的数字Buck变换器为例,谈谈“Simplified C Block”代码块的使用方法,变换器模型如图1所示。

(a)功率模型

(b)C代码块

图1 数字Buck变换器模型

仿真参数:输入电压48V,输出电压18V,工作频率fs=100kHz

步长:1e-8s,时间:0.01s

ADC块代码

//Variables declaration
float data_in, Gadc;
static int sampled_data, counter;
static bool Flag =1, Fsamp_instant, ap_start_compensator;
int Bits; 
//Input assignation
Fsamp_instant = x1;
Bits = x2; 
data_in = x3;
//////////////////////////////ADC Gain///////////////////////////////
/* ADC gain is given by:
 Gadc = ((2^Bits)-1)/(Vmax-Vmin)
Where 
Vmax = maximun input voltage of the ADC.
Vmin =  minimum input voltage of the ADC.
Bits =	number of bits of the ADC*/
Gadc = (pow(2,Bits) -1)/3.3; 
/////////Sample and hold, saturation and truncation///////
/*As sample_data is an integer therefore 
a truncation of the decimal part occurs.*/
if (Fsamp_instant == 1 && Flag ==1){
	if (data_in > 3.3){ 
		sampled_data = (3.3*Gadc); //Saturation to Vmax
	}
	if (data_in < 0){ 
		sampled_data = (0*Gadc); //Saturation to Vmin
	}
	if (data_in <= 3.3 && data_in>=0){ //Store the data until the next sampling
		sampled_data = (data_in*Gadc); 
	}
Flag = 0;
}
if (Fsamp_instant == 0){
Flag = 1;
ap_start_compensator = 0;
counter = 0;
}
/*A small delay of 2 time steps is considered in order to 
guarantee that the data that the compensator will use to 
calculate the error is the sample [k]*/
if (Flag == 0){
	counter = counter +1;
}
if (counter > 2){
	ap_start_compensator = 1;
}
//Output assignation
y1 = sampled_data;
y2 = ap_start_compensator;

仿真结果

关键节点仿真波形如图​2所示。

图2 仿真结果

从仿真结果看,“Examples”例程中基于电流闭环的数学Buck变换器实现了闭环控制,通过ADC块PI控制块DPWM块实现了控制,具体的控制思路和实现方法可以在例程中学习,这里主要讲述“Simplified C Block”块的功能和使用。

PSIM教程

[1]“File”参数文件在LLC变换器中的应用(PSIM教程)

[2]“Lookup Table”一维查表在LLC变换器中的应用(PSIM教程)

[3] “Voltage/Current”信号检测在LLC变换器中的应用(PSIM教程)

声明:上述内容为个人学习总结。由于水平有限,若有错误在所难免,请包涵。本帖内容仅限于学习交流,未经允许不得转载。

全部回复(1)
正序查看
倒序查看
2023-09-03 15:55

PSIM是电力电子专业的常用仿真软件之一,具有仿真速度快、收敛性好和精度高等优点,笔者使用软件也有很长一段时间,对软件了解也很有限,为了更好地使用该软件,在这里将自己学习使用中的一些方法和心得进行梳理,希望对想学习的朋友有所帮助。在互联网时代获取知识的成本变得更低,但搜索知识的时间成本并不定,为了更好地传播专业知识,笔者将以专题形式呈现。

0
回复