![](https://i-blog.csdnimg.cn/blog_migrate/8862ee933703a04823f982140231fec0.png)
/*
初始化结构体
v:设置目标稳压电压
an:设置PID系数P
bn:设置PID系数I
Limit:设置每次调控增量值
*/
PID PI_Init(u16 v,float an,float bn,u16 Limit)
{
PID PI_Struct;
PI_Struct.SetValue = v;
PI_Struct.An = an;
PI_Struct.Bn_1 = bn;
PI_Struct.DeltaUn = 0;
PI_Struct.Errorn_1 = 0;
PI_Struct.Un_output = v;
PI_Struct.Limit =Limit;
PI_Struct.even_out=v;
return PI_Struct;
}
/*
PID调控函数
NewInput:输入电压
PI_Struct:导入PI结构体
*/
u16 PI_Controller(u16 NewInput,PID* PI_Struct)
{
s32 Errorn=0;
Errorn = PI_Struct->SetValue - NewInput;//获取输入电压与设定电压的差值大小
PI_Struct->DeltaUn = (PI_Struct->An)*Errorn-(PI_Struct->Bn_1)*(PI_Struct->Errorn_1);//进行PI调控
PI_Struct->Errorn_1 = Errorn;//存储本次差值大小
if(PI_Struct->DeltaUn > PI_Struct->Limit)//限制每次调控电压的变化值
{PI_Struct->DeltaUn = PI_Struct->Limit;}
else if(PI_Struct->DeltaUn < -PI_Struct->Limit)
{PI_Struct->DeltaUn = -PI_Struct->Limit;}
PI_Struct->Un_output = PI_Struct->DeltaUn + PI_Struct->even_out; //计算增量值
PI_Struct->even_out=PI_Struct->Un_output;
if(PI_Struct->Un_output > 220)//调控电压上限值
{PI_Struct->Un_output = 220;}
else if(PI_Struct->Un_output < 50)//调控电压下限值
{PI_Struct->Un_output = 50;}
return PI_Struct->Un_output;
}
相关文件可自行提取:
百度网盘 请输入提取码