本文芯片采用STM32G474CBT6,采用STM32cubeMX进行程序生成。
在上文中已经将程序的架构进行了具体的说明,不知道程序架构的可以参考上文。本文主要讲解主要函数的思路及编写。
主要函数:
1、中断函数
2、环路计算函数
3、BURST控制函数
4、状态机函数
5、软起动函数
函数讲解:
1、中断函数
本文两个时间的中断都用同一个定时器完成。50KHz进入一次中断,通过Time_Base标志位来确定200Hz的中断时间。50KHz的中断时间运行AD采样函数、环路计算函数、BURST控制函数和快速保护函数。200Hz的中断运行状态机函数以及慢速保护函数。程序如下。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
Time_Base++; //5ms标志位++
ADCSample(); //AD读取电压电流值
PID_Incremental(Vout_actual); //PID运算更新周期
Burst(); //空载或轻载情况,调频不能满足输出电压需求,Burst控制
FastProtection(); //输出短路保护
if(Time_Base == 250) //定时5ms完成
{
Time_Base = 0; //标志位归零
Time_5ms_Fnish = 1; //5ms完成标志位置1
}
if(Time_5ms_Fnish == 1) //5ms该运行的程序
{
Time_5ms_Fnish = 0; //标志位清零
State_Machine(); //状态机函数
SlowProtection(); //慢速保护函数
}
}
2、环路计算函数
本文采样PID算法进行环路的运算,原理是将AD检测回来的AD值于设定值进行比较运算,再将运算出来的值进行限幅,最后经过限幅之后将其转换成周期值之后将其赋值给芯片的寄存器进行更新。程序如下。
void PID_Incremental(uint16_t Vout_temp)//环路计算
{
error1 = Vset_target - Vout_temp; //当前误差
error1 = error1 * 0.01f;
e1 = error1 - error2; //两次误差变化量
ERROR_Increase_V += Kp * e1 + Ki * error1 + Kd * (e1 - e2);
error2 = error1; //移位
e2 = e1; //移位
if(ERROR_Increase_V >= 3.0f)
{
ERROR_Increase_V = 3.0f;
}
else if(ERROR_Increase_V <= 0.1f)
{
ERROR_Increase_V = 0.1f;
}
PWM_Peroid = 12505.758620689654 + 10942.41379310345 * ERROR_Increase_V; //计算PWM周期值
hhrtim1.Instance->sTimerxRegs[0].PERxR = PWM_Peroid; //更新周期值
hhrtim1.Instance->sTimerxRegs[0].CMP1xR = PWM_Peroid >> 1; //PWM占空比为周期的一半
}
3、BURST控制函数
Burst函数主要是在LLC轻载或者空载的时候频率受到上限时所使用。通过标志位Burst_flag来判断是否进入该函数,当LLC处于轻载或者空载时,标志位为1,进入BURST控制,当LLC处于重载时,标志位为0,退出该模式。程序如下。
void Burst()
{
if(Burst_flag == 1) //进入Burst模式
{
if(Vout_actual > 203)
{
if(PWM_Falg == 0)
{
PWM_Falg = 1; //标志位置1
Close_PWM_LLC(); /关闭PWM
}
}
else
{
if(PWM_Falg == 1)
{
PWM_Falg = 0; //清除标志位
Open_PWM_LLC(); //打开PWM
}
}
}
}
4、状态机函数
LLC的运行状态是由状态机来决定的,状态机通过switch循环来判断,状态可分为初始化状态、等待状态、软起动状态、运行状态和故障状态。当LLC上电时,先将所需要用到的参数进行初始化,初始化之后进入等待状态,在等待状态中进行输入输出的检测判断电路是否正常,若不正常直接跳转至故障状态,若正常则进入软起动状态,软起动结束后电路进入正常的工作状态。单电路在正常运行中若出现故障也会跳转至故障状态。程序如下。
void State_Machine()
{
Current_State = Next_State;
switch(Current_State)
{
case Init: //初始化状态
StateMInit(); //初始化
break;
case Wait: //等待状态
LED_Open_Red_LED(); //红灯亮
StateMWait(); //等待
break;
case Rise: //软启动状态
StateMRise(); //软起动
break;
case Run: //运行状态
StateMRun(); //正常运行
LED_Open_Green_LED(); //绿灯亮
break;
case Err: //故障状态
StateMErr(); //故障运行
break;
default:
break;
}
}
5、软起动函数
软起动是程序中最重要的。软起动可以使LLC启动时不会因为过大的电流对电路造成损坏。本文也采用switch语句对软起动进行控制,逻辑是对电压基准进行一步步的增加,使其有一个缓冲过程(软起动的方法有很多,这是较简单的一个方法)。程序如下。
void StateMRise()
{
Soft_Wave = Next_Soft;
switch(Soft_Wave) //判断软启状态
{
case SSInit: //初始化状态
Burst_flag = 0; //禁止使用Burst模式
Close_PWM_LLC(); //关闭原边PWM
Next_Soft = SSWait; //跳转至软启等待状态
break;
case SSWait: //等待软启动状态
Burst_flag = 1; //使能Burst模式
Open_PWM_LLC(); //打开原边PWM
Next_Soft = SSRun; //跳转至软启状态
break;
case SSRun: //软启动状态
if(Soft_Start_End == 0) //软起动未结束
{
if(Vset_target < 200) //电压参考值小于200
{
Vset_target = Vset_target + 10; //电压参考值递加10
}
if(Vset_target >= 200) //电压参考值大于200
{
Vset_target = 200; //电压参考值等于200
Soft_Start_End = 1; //软起动结束
Next_Soft = SSInit; //软起动跳转至初始化
Next_State = Run; //状态机跳转到正常运行状态
}
}
break;
default:
break;
}
}