<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201609/297088.htm

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

            #include "config.h"

            struct _PID

            {

            float PVn; //反饋信號變量

            float SPn; //設(shè)定值

            float Mn; //PID運算結(jié)果

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

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

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

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

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

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

            float MPn; //比例項的結(jié)果值

            float MIn; //積分項的結(jié)果值

            float MDn; //微分項的結(jié)果值

            };

            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的結(jié)果

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

            float Mn_value(struct _PID *PID)

            {

            float myMn = 0.0;

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

            return myMn;

            }

            //計算積分項的調(diào)整值

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

            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)時的仿真結(jié)果如下:無法全部初始化為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



          關(guān)鍵詞: AVR PID

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();