#include "pid.h"
PID pid; //存放PID算法所需要的数据
// pid.Sv=120; //用户设定温度
// pid.Kp=30; //比例系数
// pid.T=500; //PID计算周期
// pid.Ti=5000000; //积分时间
// pid.Td=1000; //微分时间
// pid.pwmcycle=200; //pwm周期1000
// pid.OUT0=1;
void PID_Calc() //pid计算
{
float DelEk;
float ti,ki;
float td;
float kd;
float out;
if(pid.C10ms<(pid.T)) //计算周期未到
{
return ;
}
pid.Ek=pid.Sv-pid.Pv; //当前的偏差值 = 设定值 - 返回值
pid.Pout=pid.Kp*pid.Ek; //比例输出 = 比例系数*偏差
pid.SEk+=pid.Ek; //历史偏差总和
DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差
ti=pid.T/pid.Ti; //系数1
ki=ti*pid.Kp; // 系数2
pid.Iout=ki*pid.SEk*pid.Kp; //积分输出 = 系数2 * 偏差和 * 比例系数
td=pid.Td/pid.T; //系数3
kd=pid.Kp*td; //系数4
pid.Dout=kd*DelEk; //微分输出 = 系数4 * 最近两次偏差和
out= pid.Pout+ pid.Iout+ pid.Dout; //PID输出 = 比例输出 + 积分输出 + 微分输出
///////////////////////////输出保护///////////////////////////////
if(out>pid.pwmcycle)
{
pid.OUT=pid.pwmcycle;
}
else if(out<0)
{
pid.OUT=pid.OUT0;
}
else
{
pid.OUT=out;
}
//pid.OUT+=; //本次的计算结果
pid.Ek_1=pid.Ek; //更新偏差
pid.C10ms=0;
}