|
- #include "pid.h"
- #include "tm1640.h"
- #define K_percent 50
- #define T 0.1 //采樣周期為1s
- #define Ti 10000 //積分常數(shù)
- #define Td 0 //微分常數(shù)
- Struct_pid_def PID_Temp;
- extern u16 Pump_Temp;
- void PID_init(void)
- {
- /*
- PID_Temp.Kp=20;//K_percent;
- PID_Temp.Ki=0.2;//K_percent*(T/Ti);//積分系數(shù)
- PID_Temp.Kd=1;//K_percent*(Td/T);//微分系數(shù)
- */
-
- PID_Temp.Kp=50;//K_percent;
- PID_Temp.Ki=1.5;//K_percent*(T/Ti);//積分系數(shù)
- PID_Temp.Kd=2.5;//K_percent*(Td/T);//
-
- PID_Temp.Set_value=50;//設(shè)定輸出值
-
-
- PID_Temp.Now_value=Pump_Temp; //當(dāng)前輸出值
- PID_Temp.Last_value=0;//上一次輸出值
- PID_Temp.Pre_value=0; //前一次輸出值
- }
- int Pid_calc(Struct_pid_def *PID)
- {
- int Ek=0,Ek_Last=0,Ek_Pre=0;
- volatile float Pid_out=0;//定義當(dāng)前誤差,上一次誤差,前一次誤差及pid的調(diào)整輸出值
- PID->Now_value=Pump_Temp; //當(dāng)前輸出值
-
- Ek=(PID->Set_value)-(PID->Now_value);//計(jì)算當(dāng)前誤差
-
-
-
- Ek_Last=PID->Set_value-PID->Last_value;//計(jì)算當(dāng)前誤差
- Ek_Pre=PID->Set_value-PID->Pre_value;//計(jì)算當(dāng)前誤差
-
-
- Pid_out=(Ek-Ek_Last)*PID->Kp + PID->Ki*Ek + (PID->Kd)*(Ek-2*Ek_Last+Ek_Pre);
-
-
- PID->Pre_value= PID->Last_value;//存儲前次值
- PID->Last_value=PID->Now_value;//存儲上次值
-
- return (int)Pid_out;
- }
- u16 PID_Ctrl(void)
- {
- int Hot_percent;
-
- Hot_percent+=Pid_calc(&PID_Temp);
- if(Hot_percent<0)
- {
- Hot_percent=0;
- }
- if(Hot_percent>100)
- {
- Hot_percent=100;
- }
-
- SEG_display(PID_Temp.Set_value,Hot_percent,Pump_Temp);
- return Hot_percent;
- }
復(fù)制代碼
全部資料51hei下載地址:
PID實(shí)驗(yàn).rar
(374.52 KB, 下載次數(shù): 270)
2018-9-6 02:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|