新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于AVR ATMega16 的PID控制算法程序

        基于AVR ATMega16 的PID控制算法程序

        作者: 時間:2016-09-18 來源:網(wǎng)絡 收藏

          最近由于有些時間,于是想起了做一個設計,在網(wǎng)上收集了不少關于控制的理論,于是計劃用mega16L做一個測試程序,發(fā)現(xiàn)一些意想不到的誤差,不知各位同仁是否有遇到與我的類似的現(xiàn)象:我定義了一個PID結構體,在初始化的時候無法把每個元素的初始化值設置為0(見下面的仿真圖),而且,PID結構體中的部分參數(shù)是應該不變的,在整個PID運算中,但是不應該變化的參數(shù)卻在PID運算發(fā)生了變化,不知道是什么原因,到現(xiàn)在也無法查出原因。有興趣的朋友可以一起參與討論或有經驗的朋友 給與相關幫助,謝謝!

        本文引用地址:http://www.104case.com/article/201609/297088.htm

          詳細的代碼和仿真情況如下:(我的硬件系統(tǒng)是本站的min Mega16/32 + JTAG ICE)

          #include "config.h"

          struct _PID

          {

          float PVn; //反饋信號變量

          float SPn; //設定值

          float Mn; //PID運算結果

          float Kc; //比例系數(shù)

          float Ts; //采樣時間(ms)

          float Ti; //積分時間(ms)

          float Td; //微分時間(ms)

          float Mx; //積分項調整參數(shù)

          float PVn_1;//前一次反饋變量

          float MPn; //比例項的結果值

          float MIn; //積分項的結果值

          float MDn; //微分項的結果值

          };

          struct _PID *myPID;

          void init_myPID(void);

          void init_ports(void);

          void init_device(void);

          float MPn_value(struct _PID *PID);

          float MIn_value(struct _PID *PID);

          float MDn_value(struct _PID *PID);

          float Mx_value(struct _PID *PID);

          float Mn_value(struct _PID *PID);

          void main (void)

          {

          init_device();

          init_myPID();

          myPID->SPn = 155.5;

          myPID->Kc = 13.2;

          myPID->Ts = 0.2;

          myPID->Ti = 600.0;

          myPID->Td = 0.0;

          myPID->PVn = 108.2;

          while(1)

          {

          myPID->MPn = MPn_value(myPID);

          myPID->MDn = MDn_value(myPID);

          myPID->Mx = Mx_value(myPID);

          myPID->MIn = MIn_value(myPID);

          myPID->Mn = Mn_value(myPID);

          myPID->PVn_1 = myPID->PVn;

          }

          }

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

          void init_myPID(void)

          {

          myPID->PVn = 0.0;

          myPID->SPn = 0.0;

          myPID->Mn = 0.0;

          myPID->Kc = 0.0;

          myPID->Ts = 0.0;

          myPID->Ti = 0.0;

          myPID->Td = 0.0;

          myPID->Mx = 0.0;

          myPID->PVn_1 = 0.0;

          myPID->MPn = 0.0;

          myPID->MIn = 0.0;

          myPID->MDn = 0.0;

          }

          //------------------------------------------------------------------------------

          void init_ports(void)

          {

          PORTA = 0x00; //If ADC Function was be used,the PORTA could`t set bit 1

          DDRA = 0x00; //the port set input mode.

          PORTB = 0x00;

          DDRB = 0x00;

          PORTC = 0x00; //m103 output only

          DDRC = 0x00;

          PORTD = 0x00;

          DDRD = 0x00;

          }

          //------------------------------------------------------------------------------

          void init_device(void)

          {

          CLI();

          init_ports();

          MCUCR = 0x00; //Set Power control(State:Close)

          GICR = 0x00; //Set boot guide(State:Close).

          SEI(); //re-enable interrupts

          //all peripherals are now initialized

          }

          // 計算 比例項的值

          //------------------------------------------------------------------------------

          float MPn_value(struct _PID *PID)

          {

          float myMPn = 0.0;

          myMPn = PID->Kc *( PID->SPn - PID->PVn);

          return myMPn;

          }

          //計算積分項的值

          //------------------------------------------------------------------------------

          float MIn_value(struct _PID *PID)

          {

          float myMIn = 0.0;

          myMIn = PID->Kc*(PID->Ts/PID->Ti)*(PID->SPn - PID->PVn) + PID->Mx;

          return myMIn;

          }

          //計算微分項的值

          //------------------------------------------------------------------------------

          float MDn_value(struct _PID *PID)

          {

          float myMDn = 0.0;

          myMDn = PID->Kc * (PID->Td/PID->Ts) * (PID->PVn_1 - PID->PVn);

          return myMDn;

          }

          //計算PID的結果

          //------------------------------------------------------------------------------

          float Mn_value(struct _PID *PID)

          {

          float myMn = 0.0;

          myMn = PID->MPn + PID->MIn + PID->MDn;

          return myMn;

          }

          //計算積分項的調整值

          //------------------------------------------------------------------------------

          float Mx_value(struct _PID *PID)

          {

          float myMx = 0.0;

          if(PID->Mn > 1.0)

          {

          myMx = 1.0 - (PID->MPn + PID->MDn);

          }

          else if(PID->Mn < 0.0)

          {

          myMx = -(PID->MPn + PID->MDn);

          }

          return myMx;

          }

          

         

          運行到PID初始化函數(shù):void init_myPID(void)時的仿真結果如下:無法全部初始化為0

          

         

          運行到:

          myPID->SPn = 155.5;

          myPID->Kc = 13.2;

          myPID->Ts = 0.2;

          myPID->Ti = 600.0;

          myPID->Td = 0.0;

          myPID->PVn = 108.2;

          重新賦值后,部分參數(shù)Ts并不為0.2



        關鍵詞: AVR PID

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 邯郸市| 武定县| 小金县| 吉水县| 汪清县| 安康市| 五莲县| 奉节县| 南投市| 白沙| 鄂托克旗| 黄山市| 德州市| 合肥市| 西乌珠穆沁旗| 苏州市| 宁国市| 浦城县| 互助| 两当县| 康马县| 六枝特区| 沙坪坝区| 商河县| 阳泉市| 女性| 电白县| 建湖县| 巴塘县| 舟山市| 澜沧| 普陀区| 黄平县| 万安县| 凤凰县| 鹿泉市| 缙云县| 三明市| 平果县| 巴中市| 陕西省|