|
#include "pid.h"
PID pid; //存放PID算法所需要的數(shù)據(jù)
// pid.Sv=120; //用戶設(shè)定溫度
// pid.Kp=30; //比例系數(shù)
// 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; //當(dāng)前的偏差值 = 設(shè)定值 - 返回值
pid.Pout=pid.Kp*pid.Ek; //比例輸出 = 比例系數(shù)*偏差
pid.SEk+=pid.Ek; //歷史偏差總和
DelEk=pid.Ek-pid.Ek_1; //最近兩次偏差之差
ti=pid.T/pid.Ti; //系數(shù)1
ki=ti*pid.Kp; // 系數(shù)2
pid.Iout=ki*pid.SEk*pid.Kp; //積分輸出 = 系數(shù)2 * 偏差和 * 比例系數(shù)
td=pid.Td/pid.T; //系數(shù)3
kd=pid.Kp*td; //系數(shù)4
pid.Dout=kd*DelEk; //微分輸出 = 系數(shù)4 * 最近兩次偏差和
out= pid.Pout+ pid.Iout+ pid.Dout; //PID輸出 = 比例輸出 + 積分輸出 + 微分輸出
///////////////////////////輸出保護(hù)///////////////////////////////
if(out>pid.pwmcycle)
{
pid.OUT=pid.pwmcycle;
}
else if(out<0)
{
pid.OUT=pid.OUT0;
}
else
{
pid.OUT=out;
}
//pid.OUT+=; //本次的計算結(jié)果
pid.Ek_1=pid.Ek; //更新偏差
pid.C10ms=0;
}
|
評分
-
查看全部評分
|