-
1 # 南風微涼南巷似水浮生
-
2 # 南風微涼南巷似水浮生
#include<stdlib.h>
#include"global_varible.h"
/****************************************************************************
*模組名:PID
*描述:PID調節子程式
*採用PID-PD演算法。在偏差絕對值大於△e時,用PD演算法,以改善動態品質。
*當偏差絕對值小於△e時,用PID演算法,提高穩定精度。
*PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
*入口:無
*出口:無
*改變:PID_T_Run=加熱時間控制
*****************************************************************************/
voidPID_Math(void)
{
signedlongee1;//偏差一階
//signedlongee2;//偏差二階
signedlongd_out;//積分輸出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700;//溫度控制設定值37.00度
PID_e0=Temp_Set-Temp_Now;//本次偏差
ee1=PID_e0-PID_e1;//計算一階偏差
//ee2=PID_e0-2*PID_e1+PID_e2;//計算二階偏差
if(ee1>500)//一階偏差的限制範圍
ee1=500;
if(ee1<-500)
ee1=-500;
PID_e_SUM+=PID_e0;//偏差之和
if(PID_e_SUM>200)//積分最多累計的溫差
PID_e_SUM=200;
if(PID_e_SUM<-200)
PID_e_SUM=-200;
PID_Out=PID_kp*PID_e0+PID_kd*ee1;//計算PID比例和微分輸出
if(abs(PID_e0)<200)//如果溫度相差小於1.5度則計入PID積分輸出
{
if(abs(PID_e0)>100)//如果溫度相差大於1度時積分累計限制
{
if(PID_e_SUM>100)
PID_e_SUM=100;
if(PID_e_SUM<-100)
PID_e_SUM=-100;
}
d_out=PID_ki*PID_e_SUM;//積分輸出
if(PID_e0<-5)//當前溫度高於設定溫度0.5度時積分累計限制
{
if(PID_e_SUM>150)
PID_e_SUM=150;
if(PID_e_SUM>0)//當前溫度高於設定溫度0.5度時削弱積分正輸出
d_out>>=1;
}
PID_Out+=d_out;//PID比例,積分和微分輸出
}
else
PID_e_SUM=0;
PID_Out/=100;//恢復被PID_Out係數放大的倍數
if(PID_Out>200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0>300)//當前溫度比設定溫度低3度則全速加熱
PID_Out=200;
if(PID_e0<-20)//當前溫度高於設定溫度0.2度則關閉加熱
PID_Out=0;
Hot_T_Run=PID_Out;//加熱時間控制輸出
PID_e2=PID_e1;//儲存上次偏差
PID_e1=PID_e0;//儲存當前偏差
}
////////////////////////////////////////////////////////////voidPID_Math()end.
回覆列表
#include<stdlib.h>
#include"global_varible.h"
/****************************************************************************
*模組名:PID
*描述:PID調節子程式
*採用PID-PD演算法。在偏差絕對值大於△e時,用PD演算法,以改善動態品質。
*當偏差絕對值小於△e時,用PID演算法,提高穩定精度。
*PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
*入口:無
*出口:無
*改變:PID_T_Run=加熱時間控制
*****************************************************************************/
voidPID_Math(void)
{
signedlongee1;//偏差一階
//signedlongee2;//偏差二階
signedlongd_out;//積分輸出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700;//溫度控制設定值37.00度
PID_e0=Temp_Set-Temp_Now;//本次偏差
ee1=PID_e0-PID_e1;//計算一階偏差
//ee2=PID_e0-2*PID_e1+PID_e2;//計算二階偏差
if(ee1>500)//一階偏差的限制範圍
ee1=500;
if(ee1<-500)
ee1=-500;
PID_e_SUM+=PID_e0;//偏差之和
if(PID_e_SUM>200)//積分最多累計的溫差
PID_e_SUM=200;
if(PID_e_SUM<-200)
PID_e_SUM=-200;
PID_Out=PID_kp*PID_e0+PID_kd*ee1;//計算PID比例和微分輸出
if(abs(PID_e0)<200)//如果溫度相差小於1.5度則計入PID積分輸出
{
if(abs(PID_e0)>100)//如果溫度相差大於1度時積分累計限制
{
if(PID_e_SUM>100)
PID_e_SUM=100;
if(PID_e_SUM<-100)
PID_e_SUM=-100;
}
d_out=PID_ki*PID_e_SUM;//積分輸出
if(PID_e0<-5)//當前溫度高於設定溫度0.5度時積分累計限制
{
if(PID_e_SUM>150)
PID_e_SUM=150;
if(PID_e_SUM>0)//當前溫度高於設定溫度0.5度時削弱積分正輸出
d_out>>=1;
}
PID_Out+=d_out;//PID比例,積分和微分輸出
}
else
PID_e_SUM=0;
PID_Out/=100;//恢復被PID_Out係數放大的倍數
if(PID_Out>200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0>300)//當前溫度比設定溫度低3度則全速加熱
PID_Out=200;
if(PID_e0<-20)//當前溫度高於設定溫度0.2度則關閉加熱
PID_Out=0;
Hot_T_Run=PID_Out;//加熱時間控制輸出
PID_e2=PID_e1;//儲存上次偏差
PID_e1=PID_e0;//儲存當前偏差
}
////////////////////////////////////////////////////////////voidPID_Math()end.