久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2998|回復(fù): 0
收起左側(cè)

PID學(xué)習(xí)筆記(先翻譯大神教程)

[復(fù)制鏈接]
ID:113472 發(fā)表于 2016-4-11 16:24 | 顯示全部樓層 |閱讀模式
提高初學(xué)者PID原文地址:
http://brettbeauregard.com/blog/ ... s-pid-introduction/

提高初學(xué)者的PID:
這里是第一次接觸PID需要學(xué)習(xí)的公式:
1141321gpgs2p8zss5ti5z.png
它能引導(dǎo)大多數(shù)人寫出如下的PID控制器代碼:
  1.     /*working variables*/
  2.     unsigned long lastTime;
  3.     double Input, Output, Setpoint;
  4.     double errSum, lastErr;
  5.     double kp, ki, kd;
  6.     void Compute()
  7.     {
  8.        /*How long since we last calculated*/
  9.        unsigned long now = millis();
  10.        double timeChange = (double)(now - lastTime);

  11.        /*Compute all the working error variables*/
  12.        double error = Setpoint - Input;
  13.        errSum += (error * timeChange);
  14.        double dErr = (error - lastErr) / timeChange;

  15.        /*Compute PID Output*/
  16.        Output = kp * error + ki * errSum + kd * dErr;

  17.        /*Remember some variables for next time*/
  18.        lastErr = error;
  19.        lastTime = now;
  20.     }

  21.     void SetTunings(double Kp, double Ki, double Kd)
  22.     {
  23.        kp = Kp;
  24.        ki = Ki;
  25.        kd = Kd;
  26.     }
復(fù)制代碼

Compute()被稱作定期或不定期的,它工作非常正常。雖然這個(gè)系列不是“工作的最好的”。如果我們想做出和工業(yè)PID控制器相近的驅(qū)動(dòng)器,我們需要解決幾個(gè)問(wèn)題:
Sample Time(采樣時(shí)間)——如果這是一個(gè)固定的時(shí)間間隔,PID算法的功能實(shí)現(xiàn)將是非常好的。如果已知了這個(gè)間隔時(shí)間,代碼中也可以簡(jiǎn)化一些內(nèi)部的數(shù)學(xué)運(yùn)算。
Derivative Kick(微分的過(guò)沖)——不是最大的問(wèn)題,但是很容易解決,所以我們也將處理這個(gè)問(wèn)題。
On-The-Fly Tuning Changes——好的PID函數(shù)是當(dāng)調(diào)整參數(shù)的時(shí)候不會(huì)干擾內(nèi)部運(yùn)算的。
Reset Windup Mitigation(緩解積分飽和)——我們將會(huì)了解什么是積分飽和,并且在有利的方向上進(jìn)行解決方案的實(shí)施。
On/Off (Auto/Manual)(開關(guān)-自動(dòng)或手動(dòng))——在大多數(shù)應(yīng)用中,有時(shí)候我們希望關(guān)閉PID控制器手動(dòng)調(diào)節(jié)輸出而不受控制器的干涉。
Initialization(初始化)——當(dāng)控制器打開的時(shí)候我們希望是“無(wú)擾切換”,即我們不希望輸出值忽然變成一個(gè)新的值。
Controller Direction(控制器的方向)——這是最后一個(gè)不是在魯棒本身名稱下的變化。它是為了確保用戶能輸入正確的調(diào)優(yōu)參數(shù)而設(shè)計(jì)的。

一旦我們解決了這些問(wèn)題,我們將有一個(gè)對(duì)PID算法深刻的了解。我們還會(huì)擁有最新的Arduino PID控制庫(kù)。所以不管你是想自己寫出自己的PID算法還是想去了解PID算法里到底發(fā)生了什么,我希望這些都能幫上你。現(xiàn)在我們開始旅程吧。

提高初學(xué)者的PID——采樣時(shí)間
初學(xué)者的PID被稱作不規(guī)則的,這就有了以下兩個(gè)問(wèn)題:
》你沒有從PID中得到一致的狀態(tài)特性,因?yàn)橛袝r(shí)它是非常快的變化,有時(shí)卻沒有。
》你需要額外的數(shù)學(xué)運(yùn)算解決微分和積分,它們都同時(shí)依賴于時(shí)間的變化。

解決方法:
確保PID定義在一個(gè)固定的時(shí)間間隔里。我這樣做的原因是讓compute指令每個(gè)周期都被調(diào)用一次。根據(jù)之前設(shè)定好的采樣周期,PID決定是該計(jì)算還是立刻返回值。

一旦我們知道了PID是在一個(gè)恒定的時(shí)間內(nèi)運(yùn)算,微分和積分也就變得簡(jiǎn)單了。

代碼:
  1.     /*working variables*/
  2.     unsigned long lastTime;
  3.     double Input, Output, Setpoint;
  4.     double errSum, lastErr;
  5.     double kp, ki, kd;
  6.     int SampleTime = 1000; //1 sec
  7.     void Compute()
  8.     {
  9.        unsigned long now = millis();
  10.        int timeChange = (now - lastTime);
  11.        if(timeChange>=SampleTime)
  12.        {
  13.           /*Compute all the working error variables*/
  14.           double error = Setpoint - Input;
  15.           errSum += error;
  16.           double dErr = (error - lastErr);

  17.           /*Compute PID Output*/
  18.           Output = kp * error + ki * errSum + kd * dErr;

  19.           /*Remember some variables for next time*/
  20.           lastErr = error;
  21.           lastTime = now;
  22.        }
  23.     }

  24.     void SetTunings(double Kp, double Ki, double Kd)
  25.     {
  26.       double SampleTimeInSec = ((double)SampleTime)/1000;
  27.        kp = Kp;
  28.        ki = Ki * SampleTimeInSec;
  29.        kd = Kd / SampleTimeInSec;
  30.     }

  31.     void SetSampleTime(int NewSampleTime)
  32.     {
  33.        if (NewSampleTime > 0)
  34.        {
  35.           double ratio  = (double)NewSampleTime
  36.                           / (double)SampleTime;
  37.           ki *= ratio;
  38.           kd /= ratio;
  39.           SampleTime = (unsigned long)NewSampleTime;
  40.        }
  41.     }
復(fù)制代碼

在第10和第11行,如果它的時(shí)間可以計(jì)算出來(lái),那就將由算法本身決定。因?yàn)槲覀儸F(xiàn)在知道樣本之間的時(shí)間是相同的,我們并不需要不斷乘以時(shí)間的變化。我們只需要適當(dāng)調(diào)整Ki和Kd(30和31行),雖然在數(shù)學(xué)上的結(jié)果是等價(jià)的,但更有效。

雖然這樣做又一個(gè)小小的波動(dòng)。如果用戶在操作過(guò)程中決定改變采樣時(shí)間,Ki和Kd將需要重新調(diào)整來(lái)以對(duì)這一新的變化做出反應(yīng)。這就第39-42行代碼所處理的問(wèn)題。

另外請(qǐng)注意我在第29行將采樣時(shí)間轉(zhuǎn)換成秒s了。嚴(yán)格的的說(shuō)這是沒有必要的,只是允許用戶輸入的Ki和Kd是uint型的s而不是ms。



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区免费观看 | 欧美激情三区 | 成人一级视频 | 成年人免费在线视频 | 国产一区在线看 | 国产精品美女久久 | 中国一级毛片 | 欧美在线a | 国产一区二区不卡 | 99re国产| 日本色综合 | 国产亚洲欧美在线 | 乳色吐息在线观看 | 一级片av| 国产一级片免费 | 久草网站 | 成年视频在线观看 | 国产精品久久久久久亚洲影视 | 国产二区视频在线观看 | 一区二区免费看 | 日韩欧美在线观看 | 激情婷婷 | www.国产精品 | 久草福利在线 | 国内精品一区二区 | 欧美日韩国产三级 | 国产一级片免费 | 麻豆av在线| 午夜视频在线 | a级片久久 | 欧美日韩在线免费观看 | 日本成人中文字幕 | 久久久久久97 | 激情视频网 | www精品 | 一区二区三区在线免费观看 | 国产主播一区二区 | 日韩欧美在线视频 | www.国产精品.com | 日韩高清一区 | 久久精品在线视频 |