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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機PID算法程序(二)位置式PID控制算法

          51單片機PID算法程序(二)位置式PID控制算法

          作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
          51單片機組成的數(shù)字控制系統(tǒng)控制中,PID控制器是通過PID控制算法實現(xiàn)的。51單片機通過AD對信號進行采集,變成數(shù)字信號,再在單片機中通過算法實現(xiàn)PID運算,再通過DA把控制量反饋回控制源。從而實現(xiàn)對系統(tǒng)的伺服控制。



          位置式PID控制算法







          位置式PID控制算法的簡化示意圖









          上圖的傳遞函數(shù)為:



          (2-1)

          時域的傳遞函數(shù)表達式



          (2-2)

          對上式中的微分和積分進行近似



          (2-3)

          式中n是離散點的個數(shù)。

          于是傳遞函數(shù)可以簡化為:



          (2-4)

          其中





          u(n)——第k個采樣時刻的控制;

          KP——比例放大系數(shù);

          Ki——積分放大系數(shù);

          Kd——微分放大系數(shù);

          T——采樣周期。



          如果采樣周期足夠小,則(2-4)的近似計算可以獲得足夠精確的結(jié)果,離散控制過程與連續(xù)過程十分接近。

          (2-4)表示的控制算法直接按(2-1)所給出的PID控制規(guī)律定義進行計算的,所以它給出了全部控制量的大小,因此被稱為全量式或位置式PID控制算法。



          缺點:

          1)由于全量輸出,所以每次輸出均與過去狀態(tài)有關(guān),計算時要對e(k)(k=0,1,…n)進行累加,工作量大。

          2)因為計算機輸出的u(n)對應(yīng)的是執(zhí)行機構(gòu)的實際位置,如果計算機出現(xiàn)故障,輸出u(n)將大幅度變化,會引起執(zhí)行機構(gòu)的大幅度變化,有可能因此造成嚴(yán)重的生產(chǎn)事故,這在實際生產(chǎn)中是不允許的。





          位置式PID控制算法C51程序

          具體的PID參數(shù)必須由具體對象通過實驗確定。由于單片機的處理速度和ram資源的限制,一般不采用浮點數(shù)運算,而將所有參數(shù)全部用整數(shù),運算
          到最后再除以一個2的N次方數(shù)據(jù)(相當(dāng)于移位),作類似定點數(shù)運算,可大大提高運算速度,根據(jù)控制精度的不同要求,當(dāng)精度要求很高時,注意保留移位引起的“余數(shù)”,做好余數(shù)補償。這個程序只是一般常用pid算法的基本架構(gòu),沒有包含輸入輸出處理部分。


          =====================================================================================================*/
          #include
          #include //C語言中memset函數(shù)頭文件



          /*====================================================================================================
          PID Function
          The PID (比例、積分、微分) function is used in mainly
          control applications. PIDCalc performs one iteration of the PID
          algorithm.
          While the PID function works, main is just a dummy program showing
          a typical usage.
          =====================================================================================================*/



          typedef struct PID {
          double SetPoint;//設(shè)定目標(biāo)Desiredvalue
          double Proportion;//比例常數(shù)Proportional Const
          double Integral;//積分常數(shù)Integral Const
          double Derivative;//微分常數(shù)Derivative Const
          double LastError;// Error[-1]

          double PrevError;// Error[-2]
          double SumError;// Sums of Errors
          } PID;
          /*====================================================================================================
          PID計算部分
          =====================================================================================================*/
          double PIDCalc( PID *pp, double NextPoint )
          {
          double dError, Error;
          Error = pp->SetPoint - NextPoint;//偏差
          pp->SumError += Error;//積分
          dError = Error - pp->LastError;//當(dāng)前微分
          pp->PrevError = pp->LastError;
          pp->LastError = Error;
          return (pp->Proportion * Error//比例項
          + pp->Integral * pp->SumError//積分項
          + pp->Derivative * dError//微分項
          );
          }
          /*====================================================================================================
          Initialize PID StructurePID參數(shù)初始化
          =====================================================================================================*/
          void PIDInit (PID *pp)
          {
          memset ( pp,0,sizeof(PID));
          }
          /*====================================================================================================
          Main Program主程序
          =====================================================================================================*
          double sensor (void)// Dummy Sensor Function
          {
          return 100.0;
          }
          void actuator(double rDelta)// Dummy Actuator Function
          {}
          void main(void)
          {
          PID sPID;// PID Control Structure
          double rOut;// PID Response (Output)
          double rIn;// PID Feedback (Input)
          PIDInit ( &sPID );// Initialize Structure
          sPID.Proportion = 0.5;// Set PID Coefficients
          sPID.Integral = 0.5;
          sPID.Derivative = 0.0;
          sPID.SetPoint = 100.0;// Set PID Setpoint
          for (;;) {// Mock Up of PID Processing
          rIn = sensor ();// Read Input
          rOut = PIDCalc ( &sPID,rIn );// Perform PID Interation
          actuator ( rOut );// Effect Needed Changes
          }


          評論


          技術(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); })();