- #include "pid.h"
- PID pid; //存放PID算法所需要的數據
- // pid.Sv=120; //用戶設定溫度
- // pid.Kp=30; //比例系數
- // pid.T=500; //PID計算周期
- // pid.Ti=5000000; //積分時間
- // pid.Td=1000; //微分時間
- // pid.pwmcycle=200; //pwm周期1000
- // pid.OUT0=1;
- void PID_Calc() //pid計算
- {
- float DelEk;
- float ti,ki;
- 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; //系數1
- ki=ti*pid.Kp; // 系數2
- pid.Iout=ki*pid.SEk*pid.Kp; //積分輸出 = 系數2 * 偏差和 * 比例系數
- td=pid.Td/pid.T; //系數3
- kd=pid.Kp*td; //系數4
- pid.Dout=kd*DelEk; //微分輸出 = 系數4 * 最近兩次偏差和
- out= pid.Pout+ pid.Iout+ pid.Dout; //PID輸出 = 比例輸出 + 積分輸出 + 微分輸出
- ///////////////////////////輸出保護///////////////////////////////
- if(out>pid.pwmcycle)
- {
- pid.OUT=pid.pwmcycle;
- }
- else if(out<0)
- {
- pid.OUT=pid.OUT0;
- }
- else
- {
- pid.OUT=out;
- }
- //pid.OUT+=; //本次的計算結果
- pid.Ek_1=pid.Ek; //更新偏差
- pid.C10ms=0;
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|