STM32G474数字PFC参数和环路计算
本文主要介绍PFC的环路计算。
参数计算
待添加。
工作原理
待添加。
PI补偿器计算
待添加。
PFC环路计算
电流环路计算
从上图可以得到,
的传递函数如下:
未补偿的回路的传递函数如下:
占空比到电感电流的传递函数,
电感电流采样的增益(采样电阻乘以运放的放大倍数):
ADC转换的增益(12位的ADC左移3位变成15位的):
PWM模块的增益:
MCU 使用的是高分辨率的PWM,PWM 的时钟为170MHz× 16 = 2720MHz,Buck 的开关频率为60kHz,所以PWM 的周期寄存器(DPWM Counts)为45333.。
硬件的采样电路如下:
根据上面的硬件参数,使用Python画出传递函数的伯德图如下:
开发板的程序中的PI补偿器的参数如下:
/*
fc = 2000 Hz
fz = 1678.1992623545598 Hz
fp0 = 1630.6002043566411 Hz
wz = 10544.43694774579
wp0 = 10245.363245897679
Ts = 1.6666666666666667e-05
Ti = 9.483673760444668e-05
Kp = 0.9716368258134402
Ki = 0.17075605409829467
*/
//电流环 PI 参数
#define I_KP (float)(0.9716368258134402)
#define I_KI (float)(0.17075605409829467)
其中PI 补偿器的极点和零点分别为:
未补偿的回路、PI补偿器和补偿后的伯德图如下:
其中补偿后的穿越频率为2kHz。
获得上面电流环伯德图的Python代码如下:
详情
from telnetlib import PRAGMA_HEARTBEAT
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
import math
import scipy
print("Scipy version is ",scipy.__version__)
print("Control version is ",ctrl.__version__)
s = ctrl.tf('s')
Vin = 24.0 # 输入电压
Vout = 40.0 # 输出电压
Pout = 40.0 # 输出功率
Co = 2*1000.0e-6 # 输出电容 2000uF
L = 220e-6 #uH # 电感
f_PWM = 60e3 # 开关频率 60kHz
Iout = Pout/Vout # 计算输出电流
Rload = Vout/Iout # 计算输出负载电阻
D = 1-Vin/Vout # 占空比
fclock = 170e6*16 # MCU的PWM模块的时钟 170MHz*16
PWM_Period_Reg = fclock/f_PWM # 计算周期寄存器
DPWM = 1/ PWM_Period_Reg # PWM模块的增益 DPWM
Gain_PWM_dB = 20*math.log10(DPWM )
R_Sense = 0.015 # 电流才电阻
KopAmp = (3.3/0.2) # 电流采样的运算放大器的倍数
KiSense = R_Sense*KopAmp # 电流采样的增益
KvSense = ((2.0e3)/(51.0+30e3+2.0e3)) # 电压采样的增益
Kadc = 32767.0/3.3 # ADC 增益, 12位ADC左移3位,变成15位ADC 2^15= 32768
def Current_Plant():
"""
fc = 2000 Hz
fz = 1678.1992623545598 Hz
fp0 = 1630.6002043566411 Hz
wz = 10544.43694774579
wp0 = 10245.363245897679
Ts = 1.6666666666666667e-05
Ti = 9.483673760444668e-05
Kp = 0.9716368258134402
Ki = 0.17075605409829467
"""
# 填充PI补偿器参数
f_p0 = 1630.6002043566411
w_p0 = 2*np.pi*f_p0
f_z1 = 1678.1992623545598
w_z1 = 2*np.pi*f_z1
# PI 补偿器传递函数
GiComp = w_p0*((1+s/w_z1)/(s))
# 占空比到电感电流 的传递函数
Hi = (Vout/(s*L)) #近似传递函数
# The total transport delay is approximated by a first-order Pade polynomial:
Td = (1/f_PWM)/2
Gtd = (1- (s*Td)/2)/(1+ (s*Td)/2) #延时传递函数,(没有使用)
# 未补偿环路传递函数为:
GiUncomp = (Hi)*(KiSense*Kadc*DPWM )
GiLoop = GiUncomp*GiComp
f = np.logspace(2, 5, 1000)
w = 2 * np.pi * f
# 画传递函数的伯德图
mag,phase,omega=ctrl.bode_plot(GiUncomp,w,dB=True,Hz=True,deg=True,plot=True,label=r'$Gi_{Uncomp}$')
mag,phase,omega=ctrl.bode_plot(GiComp,w,dB=True,Hz=True,deg=True,plot=True,label=r'$Gi_{Comp}$')
mag,phase,omega=ctrl.bode_plot(GiLoop,w,dB=True,Hz=True,deg=True,plot=True,label=r'$Gi_{Loop}$')
fig = plt.gcf()
axes = fig.get_axes()
axes[0].set_title('Current Frequency Response')
plt.legend()
plt.show()
Current_Plant()
电压环路计算
从上图可以得到,
的传递函数如下:
未补偿的回路的传递函数如下:
电感电流到输出电压的传递函数如下:
输出电压的采样增益为:
ADC转换的增益(12位的ADC左移3位变成15位的):
输入电压前馈的增益:
电感电流采样的增益(采样电阻乘以运放的放大倍数):
参考电流到电感电流()的传递函数
根据上面的硬件参数,使用Python画出传递函数的伯德图如下:
开发板的程序中的PI补偿器的参数如下:
/*
fz = 5.873697418240959 Hz
fp0 = 1.0 Hz
wz = 36.905529317110265
wp0 = 6.283185307179586
Ts = 0.0001
Ti = 0.02709621074412762
Kp = 0.1702505132277443
Ki = 0.0006283185307179586
*/
//电压环 PI 参数
#define V_KP (float)(0.1702505132277443)
#define V_KI (float)(0.0006283185307179586)
其中PI 补偿器的极点和零点分别为:
未补偿的回路、PI补偿器和补偿后的伯德图如下:
其中补偿后的穿越频率约为9.5Hz。
获得上面伯德图的Python代码如下:
详情
from telnetlib import PRAGMA_HEARTBEAT
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
import math
import scipy
print("Scipy version is ",scipy.__version__)
print("Control version is ",ctrl.__version__)
s = ctrl.tf('s')
Vin = 24.0 # 输入电压
Vout = 40.0 # 输出电压
Pout = 40.0 # 输出功率
Co = 2*1000.0e-6 # 输出电容 2000uF
L = 220e-6 #uH # 电感
f_PWM = 60e3 # 开关频率 60kHz
Iout = Pout/Vout # 计算输出电流
Rload = Vout/Iout # 计算输出负载电阻
D = 1-Vin/Vout # 占空比
fclock = 170e6*16 # MCU的PWM模块的时钟 170MHz*16
PWM_Period_Reg = fclock/f_PWM # 计算周期寄存器
DPWM = 1/ PWM_Period_Reg # PWM模块的增益 DPWM
Gain_PWM_dB = 20*math.log10(DPWM )
R_Sense = 0.015 # 电流才电阻
KopAmp = (3.3/0.2) # 电流采样的运算放大器的倍数
KiSense = R_Sense*KopAmp # 电流采样的增益
KvSense = ((2.0e3)/(51.0+30e3+2.0e3)) # 电压采样的增益
Kadc = 32767.0/3.3 # ADC 增益, 12位ADC左移3位,变成15位ADC 2^15= 32768
def Voltage_Plant():
"""
fz = 5.873697418240959 Hz
fp0 = 1.0 Hz
wz = 36.905529317110265
wp0 = 6.283185307179586
Ts = 0.0001
Ti = 0.02709621074412762
Kp = 0.1702505132277443
Ki = 0.0006283185307179586
"""
# 填充PI补偿器参数
f_p0 = 1.0
w_p0 = 2*np.pi*f_p0
f_z1 = 5.873697418240959
w_z1 = 2*np.pi*f_z1
# PI 补偿器传递函数
GvComp = w_p0*((1+s/w_z1)/(s))
# 输出电压和输入电压的采样增益
KvoutSense = KvSense
KvinSense = KvSense
# 输入电压前馈的增益
VinFeed = (Vin*KvinSense*Kadc)/((np.sqrt(2)*Vin*KvinSense*Kadc)*(np.sqrt(2)*Vin*KvinSense*Kadc))
# 参考电流到电感电流的传递函数
iL_divide_Iref = 1/(KiSense*Kadc)
# 电感电流到输出电压的传递函数如下
Ro = Rload # 负载
Hv = ((Ro)/(s*Co*Ro+1))*((Vin)/(Vout))
# 未补偿环路传递函数为:
GvUncomp = (Hv)*(KvoutSense*Kadc*VinFeed*iL_divide_Iref)
# 补偿后环路传递函数为:
GvLoop = GvComp*Hv
f = np.logspace(0, 3, 1000)
w = 2 * np.pi * f
# 画传递函数的伯德图
mag,phase,omega=ctrl.bode_plot(GvUncomp,w,dB=True,Hz=True,deg=True,plot=True,label=r'$Gv_{Uncomp}$')
mag,phase,omega=ctrl.bode_plot(GvComp,w,dB=True,Hz=True,deg=True,plot=True,label=r'$Gv_{Comp}$')
mag,phase,omega=ctrl.bode_plot(GvLoop,w,dB=True,Hz=True,deg=True,plot=True,label=r'$Gv_{Loop}$')
fig = plt.gcf()
axes = fig.get_axes()
axes[0].set_title('Voltage Frequency Response')
plt.legend()
plt.show()
Voltage_Plant()
环路测量
可以使用Bode100,在电流采样的R29电阻两端注入信号,测量电流环;在电压采样的R21两端注入信号,测量电压环。
参考文档
[1] Digital PFC CCM boost converter 300 W design example using XMC1400 microcontroller
提示
本人在此发布博文(包括但不限于汉字、拼音、阿拉伯字母 、图片、影像,以及前述之各种任意组合等等)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人观点。如需要详查请直接与键盘发明者及生产厂商法人代表联系。