回覆列表
  • 1 # 南風微涼南巷似水浮生

    #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.

  • 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.

  • 中秋節和大豐收的關聯?
  • 麥子是狗尾草變的嗎?