PSIM软件BUCK转换数字控制官方例程

x33g5p2x  于2022-03-01 转载在 其他  
字(4.9k)|赞(0)|评价(0)|浏览(789)

在使用PSIM软件仿真开关电源时,大多数都是模拟电路,纯数字电路的仿真很少。无意间发现了在PSIM 2021版本中有官方的数字控制BUCK电路仿真。电路使用简单C模块编写的代码来控制电路。

  由于下载的2021版是演示版,不能直接仿真,为了能够彻底的学习,于是将电路图和程序移植到了9.1版本中。现在将电路和代码分享出来。

2021版官方例程

  由于软件是演示版,有限制,所以不能仿真。

  于是将电路图和代码移植到 PSIM 9.1 版本上

  硬件电路如下:

  首先使用电路传感器读取电流值。

  将采样到的模拟电流值缩小0.2倍然后加上1.5送入到ADC模块中。

  ADC模块有三路输入信号,两路输出信号。ADC模块是用简化C模块编写代码实现。t它的主要作用是将模拟信号转换为数字信号输出。

/
 ADC Basic function /

/
// Power Smart Control S.L. //
/      https://powersmartcontrol.com/      ///
/                    May 2020                              ///
///

//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;

ADC模块输出电流的数字量之后,然后在送入PI模块中通过PI公式计算输出占空比的值。

  PI模块有8路输入,2路输出。PI计算时需要的一些常量通过常量模块输入。

/
// PI compensator implementation 


/
// Power Smart Control S.L. //
/      https://powersmartcontrol.com/      ///
/                    May 2020                              ///
///


//Variables of the top function
	int IL_ref, IL_sense;
	float Kp, Ti, Fsamp;
	float upper_limit_compensator, lower_limit_compensator; 
	static int output;

//Variable Definition
	float A1, A0;
	float e_k, proportional_k, integral_k;
	static float e_k_1, integral_k_1, y_k;

//Variables only for psim simulation
	static bool Flag;
	bool ap_start;
	
//Input assignation
	Kp = x3;
	Ti = x4;
	Fsamp = x5;
	upper_limit_compensator = x6; 
	lower_limit_compensator = x7;
	ap_start = x8;

//Calculate the compensator coefficients of the difference equation
	A0 = Kp;										// 137.38m
	A1 = Kp/(Ti*2*Fsamp);				// 137.38m / ( 43.95u * 2 * 200k) = 7.814562m

//Detect rising edge of the ap_start signal and starts the calculation of the difference equation
if (ap_start == 1 && Flag == 0){
	Flag =1;
	IL_ref = x1;
	IL_sense = x2; 

//Calculate the value of the error in the instant [k]
	e_k = IL_ref - IL_sense;		//计算参考值和采样值误差

//Difference equation of the compensator			//  PI 计算
	proportional_k = A0*e_k;				// 误差*Kp
	integral_k = A1*e_k + A1*e_k_1 + integral_k_1;	// Ki * e_k + Ki * e_k-1 + integral_k_1;
	y_k = proportional_k + integral_k;

//Stores sample [K] in variables [K-1] in order to be used in the next sampling instant
	e_k_1 = e_k;
	integral_k_1 = integral_k;

//Limiter at the output of the compensator
	if (y_k >= upper_limit_compensator) {
		y_k = upper_limit_compensator;
	}

	if (y_k <= lower_limit_compensator) {
		y_k = lower_limit_compensator;
	}
	
	output  =y_k;	
}

//Detect falling edge of the ap_start signal
if (ap_start == 0) {
		Flag =0;
} 

//Output signal
	y1 = output;
	y2 = integral_k;

最后将PI模块输出的占空比控制量送入到DPWM模块中,DPWM模块根据占空比的值输出两路互补的PWM波。

// DPWM with Triangular carrier ///
//

/
// Power Smart Control S.L. //
/      https://powersmartcontrol.com/      ///
/                    May 2020                              ///
///


//Variables declarations
float Fclk_psim, time_step, deadtime;
int Nr, Fsw, digital_deadtime, duty_1, duty_2;
bool samp_inst;
static int counter_trig=0, duty_cycle;
static bool Up=1, Down=0, HB, LB;

//Input assignation
Fsw = x1;
time_step = x2;
deadtime = x4;

//Calculation of the amplitude of the triangular
/* the maximum value of the counter is given by:
				Nr = 0.5*Fclk/Fsw
    Since the psim block is executed every time step 
	therefore the frequency of the master clock is:
				Fclk = 1/time_step */

Fclk_psim = 1/time_step;  // 1 / 5ns  200Mhz
Nr = 0.5*Fclk_psim/Fsw; // 0.5 * 200M / 100K = 100M / 100K = 1000

//Updating the duty cycle at the lower vertex of the triangular        //三角波最小值 向上计数
if (counter_trig ==0) {
	Up =1;
	Down =0;
	duty_cycle = x3;	
} 

//Updating the duty cycle at the upper vertex of the triangular   //三角波最大值 向下计数
if (counter_trig == Nr) {   // 判断计数器是否等于1000
	Up = 0;	
	Down =1;
	duty_cycle = x3;
} 

//It generates the sampling instant signal   // 输出采样信号 在计数器为 0--4 或者 996-1000时采样
if ((counter_trig >=0 && counter_trig <= 4 && Up ==1) || (counter_trig <= Nr && counter_trig >= Nr-4 && Down ==1 )){
samp_inst = 1;
} else  {
samp_inst = 0;
}

//Triangular Carrier   //生成三角波
if (Up ==1) {
	counter_trig = counter_trig +1;
} 

if (Down ==1) {
	counter_trig = counter_trig -1;
} 

//Calculations to generate the deadtime
digital_deadtime = deadtime/(2*time_step);  // 200n / ( 2 * 5ns) = 20ns
duty_1 = duty_cycle - digital_deadtime; 
duty_2 = duty_cycle + digital_deadtime; 

//PWM generation
if (counter_trig >= duty_1){
	HB =0;
} else {
	HB =1;
}

if (duty_2 <= counter_trig){
	LB =1;
} else {
	LB =0;
}

//Output assignation
y1 = HB;
y2 = LB;
y3 = samp_inst;
y4 = counter_trig;
y5 = duty_cycle;

为了便于验证ADC模块转换的正确性,官方线路中还提供了一个硬件将模拟信号转换为数字信号的电路。

  同时为了便于监控信号,将变量的标签和电压表连接起来,这样就可以直接在波形中观察变量的值。

  电路中用到了一些参考值是通过电压源直接输入到模块中的。

  移植到PSIM 9.1 版本中的完整电路如下。

  仿真结果如下

  如果想看其他变量的结果,可以直接在波形中添加。

  这里观察输出电流的模拟值,经过ADC模块转换后的数字值,PI模块计算后的占空比值

  官方的代码写的很详细,里面也有很多注释。通过官方的这个例程去理解学习数字电源的仿真,相信大家会有很多收获的。

仿真文件下载链接:https://download.csdn.net/download/qq_20222919/82906330

相关文章