當前位置:編程學習大全網 - 編程語言 - 求壹個單片機C語言編寫的PID控制程序。謝謝!!

求壹個單片機C語言編寫的PID控制程序。謝謝!!

#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=加熱時間控制

*****************************************************************************/

void PID_Math(void)

{

signed long ee1; //偏差壹階

//signed long ee2; //偏差二階

signed long d_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; //保存當前偏差

}

////////////////////////////////////////////////////////////void PID_Math() end.

  • 上一篇:關於傻瓜式的室內設計軟件,能否推薦?
  • 下一篇:深圳lxit學校在哪啊?專業是軟件開發的
  • copyright 2024編程學習大全網