国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
避免過沖的PID算法 控制對象是溫度 C語言代碼
[打印本頁]
作者:
coolfire
時間:
2021-4-17 01:55
標題:
避免過沖的PID算法 控制對象是溫度 C語言代碼
#include "pid.h"
PID pid; //存放PID算法所需要的數(shù)據(jù)
void PID_Calc() //pid計算
{
float DelEk;
float ti,ki;
// float Iout;
// float Pout;
// float Dout;
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;
ki=ti*pid.Kp;
pid.Iout=ki*pid.SEk*pid.Kp; //積分輸出
td=pid.Td/pid.T;
kd=pid.Kp*td;
pid.Dout=kd*DelEk; //微分輸出
out= pid.Pout+ pid.Iout+ pid.Dout;
//////////////////////////////////////////////////////////
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;
}
void PID_Calc_overshoot() //pid計算-過沖處理?
{
float DelEk;
float ti,ki;
// float Iout;
// float Pout;
// float Dout;
float td;
float kd;
float out;
float SvSave;
if(pid.C10ms<(pid.T)) //計算周期未到
{
return ;
}
//判斷Sv
SvSave=pid.Sv;
if(pid.Pv<(SvSave*0.55))//溫度達到計數(shù)開始 66度
{
pid.times=0;
}
if(pid.times<=60)//3分鐘 72度 100s
{
pid.Sv=SvSave*0.6;
}
if((pid.times>60)&&(pid.times<=100))//3分鐘 96度 100s
{
pid.Sv=SvSave*0.8;
}
if((pid.times>100)&&(pid.times<=200))//2分鐘 102度 100s
{
pid.Sv=SvSave*0.85;
}
if((pid.times>200)&&(pid.times<=300))//2分鐘 108度 100s
{
pid.Sv=SvSave*0.9;
}
if((pid.times>300)&&(pid.times<=400))//2分鐘 114度 100s
{
pid.Sv=SvSave*0.95;
}
if(pid.times>400)
{
pid.Sv=SvSave;
}
//////////////////////////////////
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;
ki=ti*pid.Kp;
pid.Iout=ki*pid.SEk*pid.Kp; //積分輸出
td=pid.Td/pid.T;
kd=pid.Kp*td;
pid.Dout=kd*DelEk; //微分輸出
out= pid.Pout+ pid.Iout+ pid.Dout;
//////////////////////////////////////////////////////////
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;
pid.Sv=SvSave;
}
復制代碼
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0