BUCK-BOOST四开关硬件部分
1.辅助电源
TPS55165升降压电路
TPS5516x-Q1 系列器件是一款高电压同步降压/升压直流/直流转换器。该器件通过多种不同的输入电源(如汽车电池)提供稳定的电源输出。降压/升压重叠控制可确保以最佳的效率在降压和升压模式之间自动转换。TPS55165-Q1 输出电压可以设置为 5V 或 12V 固定电平。TPS55160-Q1 和 TPS55162-Q1 器件具有通过外部电阻分压器设置的 5.7V 至 9V 可配置输出电压。
本此使用TPS55165稳定输出5V和12V,这款芯片输出电流不大,正好用作辅助电源,输出功率较小(大多数集成的升压、降压、升降压芯片在低功率的时候效率较低),所以选择使用芯片的低功耗模式。电路图如下:
下面以5V电路为例讲解一下,芯片如何实现功能。
使用半岛小芯打开TPS55165的芯片手册,找到引脚功能表。
引脚:
1(PGND): | 连接功率地 | 11(VREG_Q): | 紧连VREG,4.7uF去耦到地 |
2(L1): | 与L2之间连接电感 | 12(VREG): | 芯片升降压的栅极驱动电源 |
3(BST1): | 与L1之间连接100nF电容 | 13(GND): | 模拟地 |
4(VINP): | 电源 | 14(VOS_FB): | 5V:接地;12V:接VREG |
5(VINL): | 内部偏置供电输入 | 15(PG): | 高:工作正常 |
6(IGN): | 使能脚,高电平 | 16(VO_SEN): | 输出电压检测,连接VOUT |
7(PS): | 高:低功耗;低:正常 | 17(VOUT): | OUT输出带载 |
8(IGN_PWRL): | 高:使能脚锁存 | 18(GND): | 模拟地 |
9(SS_EN): | 高:使能扩频特性 | 19(BST2): | 与L2之间连接100nF电容 |
10(PG_DLY): | PG延时,10k~100k下拉 | 20(L2): | 与L1之间连接电感 |
21(EP/PowerPAD):焊接到电源地,散热
以TPS55165为例,此辅助电源IGN_PWRL悬空处理,大概功能如上所示。需要使用TPS55160、TPS55162的可自行查找芯片手册。
注意:使用过程中注意到TPS55165有个小小的bug,芯片手册中工作条件这里提到,VINP和VINL在芯片唤醒后的工作电压才是后面所给的范围。
而下图提到的IGN唤醒电压是2.5V~3.7V,经典值3.1V。而我在使用过程中发现,大多数时候在5V以下,辅助电源输出12V的部分并没有正常启动。如果要在3V左右工作,要先将输入电压调节到5V及以上,再将输入电压调节到3V才可以正常使用。
芯片手册提到有关欠压锁定的参数,输出电压设定为12V时,TPS55165的欠压锁定范围刚好是在4V以下,这或许在芯片使用时导致冲突,使得输出电压较低,输出为12V时不能正常工作。
2.BUCK-BOOST主拓扑
四开关拓扑
四开关BUCK_BOOST,顾名思义就是四个MOS管(开关管)。其实就是将一个半桥BUCK电路和一个半桥BOOST电路连接在一起,通过对四个开关管进行控制,实现数控升降压。主拓扑电路如图所示:
采用电阻分压采样,3m电流采样电阻。
电容:电路中输入、输出端滤波电容较多,使用的是X5R、X7R电容,为的是提高系统整体的效率,四开关的控制模式会导致效率相较于BUCK、BOOST的较低。陶瓷电容相较于铝电解电容,阻抗、允许纹波电流、可靠性等功能较好,但价格较贵。使用陶瓷电容系统效率较高,图中多个小容值的电容并联,根据实际形况适当加大电容容值。
改善:原理图、PCB设计中加入了续流二极管(D3、D4、D7、D8),RC吸收电路(C1\R3、C2\R4、C14\R12、C15\R13),快速关断二极管(D1、D2、D5、D6)。
一般先不焊接RC吸收和快速关断二极管,根据实际情况添加焊接,调试RC吸收元件参数。电路图中的二极管等元件要根据实际应用来调节型号。
这里不再对阻尼电阻、泄流电阻、快速关断二极管、续流二极管、RC吸收等进行讲解。
3.驱动电路
IR2104驱动电路
使用经典的给一出二互补波的单路PWM驱动芯片IR2104,将SD使能脚引出和PWM引脚一同由单片机控制。IR2104自带死区控制,死区时间不可通过代码设定。
注意:使用IR2104时,如果将SD引脚直接接到12V上,按理来说IR2104是可以正常工作的。但是当单片机没有给PWM波时,或者PWM波为全低电平时,HO输出低电平,LO输出高电平,此时会导致HO所接上管关闭,LO所接下管导通;这种情况会导致控制BOOST拓扑时,上管常关,下管常开,会将电源的正极通过下管直接短接到负极,电源就过流,存在很大的风险,所以选择将SD引脚引出,通过单片机同时控制PWM、SD引脚,避免电源短接。也可以使用EG3112双路PWM驱动芯片,可以直接避免这种情况。
4.采样电路
(1)INA240电流采样
INA240 器件是一款电压输出、电流检测放大器,具有增强型 PWM 抑制功能,可在独立于电源电压的 –4V 至 80V 宽共模电压范围内检测分流器电阻上的压降。负共模电压允许器件的工作电压低于接地电压,从而适应典型螺线管应用 的反激周期低功耗是一个关键问题。增强型 PWM 抑制功能可为使用脉宽调制 (PWM) 信号的系统(例如,电机驱动和螺线管控制系统)中的较大共模瞬变 (ΔV/Δt) 提供高水平的抑制。凭借该功能,可精确测量电流,而不会使输出电压产生较大的瞬变及相应的恢复纹波。
放大倍数:
INA240A1:20倍
INA240A2:50倍
INA240A3:100倍
INA240A4:200倍
INA240可以进行高、低端采样,还可以通过REF引脚为输出信号添加偏置电压。
下图以VS作为偏置电压,芯片内部集成的REF1和REF2阻值相等。
下图通过拨码开关,使得芯片的REF2引脚接3.3V,REF1引脚接地,此时偏置电压为1.65V。
(2)电压采样电路
1.可以直接使用电阻分压采样。
注意:电阻分压采样电路的位置和电流采样电阻的位置是有讲究的。建议使用第二种接法。
第一种接法如下图所示:
单片机的地连接图左下角的GND,电压采样点为20K滑变与1K电阻中间,例如将滑变调节到9K,空载时稳定输出电压为20V,此时电压采样点电压为2V;但当带载为10时,假设仍然稳定输出20V,输出电流为2A,此时电压采样点的电压是(2-0.01*2)/ 10 + 0.01*2= 0.2V,采样电压仍然为0.2V,但此时输出电压(|OUT+|-|OUT-|)不再是20V,而是20-0.02=19.8V。而功率回路又必须经过电流采样电阻,换一个接法会将误差大大减小,第二种接法如下图所示:
此时将电流采样电阻的位置改变,再看输出电压,仍然是单片机的地连接图左下角的GND,电压采样点为20K滑变与1K电阻中间,将滑变调节到9K(图中的滑变建议换成固定电阻),空载时稳定输出电压为20V,此时电压采样点电压为2V;但当带载为10时,假设仍然稳定输出20V,输出电流为2A,此时电压采样点电压仍然为2.0V,此时OUT-输出端电压为0.02V,最终输出电压(|OUT+|-|OUT-|)= 20 -0.02=19.98V,而不是19.8V,误差大大减小。
而使用差分电路,可以完全解决此问题。
2.使用差分电路,将电压值缩小一定倍数共给单片机采集。
下图使用差分电路将电压缩小15倍,因为通过差分采集输出端电压,控制目标值就是输出端电压,所以输出端能稳定20.00V,上面介绍的使用分压电阻的方法是因为控制目标值一直是输出端正极对地的电压,而不是输出端两端的电压,所以差分放大采集更准确。
注:要合理选择两种采集方式,需要改善整体效率的时候可以使用分压电阻的第二种接法,需要输出电压特别准确的时候可以使用差分采样。
到这里,硬件电路的介绍就结束了。
BUCK-BOOST四开关软件部分
1.STM32F407VET6主控CubeMX配置
(1)时钟树配置
开启定时器TIM2:
使能中断:
(2)PWM输出
使用高级定时器TIM1,PWM频率设置为20K。
(3)ADC+DMA
开启四个通道+DMA传输采集各个信号。
2.软件代码部分
Buck-Boost控制部分的重心在系统在Buck模式和Boost模式间自动平滑切换。
(1)定时器TIM2中断回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim2.Instance) //TIM2中断 10K
{
ADC_Value_Get();
ADC_Value_Filt();
VOUT = ADC_Filt_Value[0]*0.016156f; //输出
AOUT = ADC_Filt_Value[1]*0.005090f;
VIN = ADC_Filt_Value[2]*0.010486f; //输入
AIN = (ADC_Filt_Value[3])*0.000815f;
if (action == 1)
{
PWM_SETA = Incremental_PID(&PID_DC_I,AIN,SETA);
if (mode==1)//恒流模式
{
BUCK_BOOST(); //BUCK-BOOST模式
}
if (mode==2)//恒阻模式
{
SETA = VIN / SETR;
BUCK_BOOST(); //BUCK-BOOST模式
}
if (mode==3)//恒功率模式
{
SETA = SETW / VIN;
BUCK_BOOST(); //BUCK-BOOST模式
}
}
}
}
(2)ADC采集、滤波
void ADC_Value_Get(void) //初始ADC值获取函数
{
uint8_t i = 0;
uint8_t j = 0;
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Get_Value,ADC_Sample_Point);
// flag2++;
for(i = 0; i < ADC_Filt_Point; i++)
{
for(j = 0; j < CHANNEL; j++)
{
ADC_Sample[j][i] = ADC_Get_Value[j + CHANNEL*i];
}
}
}
void ADC_Value_Filt(void) //滤波之后拟合函数,得到当前中断时的AC采样信号真实值
{
uint8_t i = 0;
uint8_t j = 0;
// flag3++;
for(i = 0; i < CHANNEL; i++)
{
// for(j = 0; j < ADC_Filt_Point; j++)
// {
// ADC_Filt_Value[i] = KalmanFilter(&KFStruct, ADC_Sample[i][j])*3.3/4095;
// }
ADC_Filt_Value[i] = ADC_Filter(ADC_Sample[i]); //*AC_RMS.Ratio[i]*3.3/4096当采集DC信号时数组ADC_Filt_Value即为采样值
}
}
(3)PID闭环控制
pid.c
增量式PID。
#include "pid.h"
PID_TypeDef PID_DC_V_BO;
PID_TypeDef PID_DC_V_BU;
PID_TypeDef PID_DC_I_BO;
PID_TypeDef PID_DC_I_BU;
PID_TypeDef PID_DC_V;
PID_TypeDef PID_DC_I;
void PID_Init(void) //PID参数初始化
{
PID_DC_V.Kp = 0.5f;
PID_DC_V.Ki = 0.2f;
PID_DC_V.Kd = 0;
PID_DC_V.Result_max = 8399;
PID_DC_V.Result_min = 1;
PID_DC_I.Kp=0.01f;
PID_DC_I.Ki=10;
PID_DC_I.Kd=0;
PID_DC_I.Result_max=8399;
PID_DC_I.Result_min=1;
}
/*************************************************************************
函数功能:增量PID控制器
入口参数:PID名称,测量值,目标值
返回 值:计算结果
根据增量式离散PID公式 dac+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差 以此类推
Result代表增量输出
Dac+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
float Incremental_PID(PID_TypeDef *PID,float Measured,float Target)
{
PID->Err = Target - Measured; //计算偏差
PID->Result += PID->Kp * (PID->Err - PID->Now_Err)
+ PID->Ki * PID->Err;
PID->Previous_Err=PID->Now_Err; //保存上次偏差
PID->Now_Err=PID->Err; //保存本次偏差
if( PID->Result> PID->Result_max) PID->Result= PID->Result_max; //输出限幅
else if( PID->Result< PID->Result_min) PID->Result = PID->Result_min;
return PID->Result;
}
(4)BUCK-BOOST模式切换
void BUCK_BOOST(void) //BUCK-BOOST自动切换
{
if (Work_flag == 0)
{
BUCK_mode();
}
else
{
BOOST_mode();
}
}
void BUCK_mode(void) //BUCK模式
{
TIM1->CCR1 = (uint32_t)PWM_SETA; //TIM1 20K CH1闭环控制
TIM1->CCR2 = 8399;
if ((TIM1->CCR1) == 8399)
{
Work_flag = 1;
}
}
void BOOST_mode(void) //BOOST模式
{
TIM1->CCR1 = 8399;
TIM1->CCR2 = 8399-((uint32_t)PWM_SETA); //TIM1 20K CH2闭环控制
if ((TIM1->CCR2) == 8300)
{
Work_flag = 0;
}
}
这里平滑切换模式的思路:TIM1通道一输出的PWM波控制Buck两管,通道二输出的PWM波控制Boost两管,初始默认BUCK模式,也就是将下图中Q3管常开、Q4管常关BOOST部分不工作,PID调节左边Q1、Q2两管的占空比,当PID不能将系统调节到目标值时,会将TIM1的通道一输出的PWM占空比拉满也就是将TIM1的CCR1的值拉到8399,判断到TIM1->CCR1的值拉满,切换到Boost模式;同理,当判断到TIM1->CCR2的值拉满,切换到Buck模式。
注:当我通过判断 TIM1->CCR1 == 8399 和 TIM1->CCR2 == 8399 来切换模式时,发现当从BUCK切换到BOOST是没有问题的,但是不能从BOOST模式切换到BUCK模式,考虑到可能是PID的问题,我将 TIM1->CCR2 == 8399 改为 TIM1->CCR2 == 8300 就可以实现平滑切换了。