久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

漫談PID——實(shí)現(xiàn)與調(diào)參

 hi_monkey 2020-07-03

閑話:

作為一個(gè)控制專業(yè)的學(xué)生,說起PID,,真是讓我又愛又恨,。甚至有時(shí)候會覺得我可能這輩子都學(xué)不會pid了,但是經(jīng)過一段時(shí)間的反復(fù)琢磨,,pid也不是很復(fù)雜,。所以在看懂pid的基礎(chǔ)上,寫下這篇文章,,方便學(xué)習(xí)和交流,。

==================================================================

PID控制器是工業(yè)過程控制中廣泛采用的一種控制器,其中,,P,、I、D分別為比例(Proportion),、積分(Integral),、微分(Differential)的簡寫;將偏差的比例,、積分和微分通過線性組合構(gòu)成控制量,,用該控制量對受控對象進(jìn)行控制,稱為PID算法 ,。

其中KP,、KI、KD分別為比例系數(shù),、積分系數(shù),、微分系數(shù)。

比例系數(shù)KP :反應(yīng)系統(tǒng)當(dāng)前最基本的誤差,,系數(shù)大,,可以加快調(diào)節(jié),減小誤差,,但是過大的比例使系統(tǒng)穩(wěn)定性下降,,甚至造成系統(tǒng)的不穩(wěn)定。

積分系數(shù)KI  :反應(yīng)系統(tǒng)的累計(jì)誤差,,使系統(tǒng)消除穩(wěn)態(tài)誤差,,提高無差度,,只要有誤差,積分調(diào)節(jié)就會起作用,。

微分系數(shù)KD :反應(yīng)系統(tǒng)誤差的變化率,,具有預(yù)見性,們可以預(yù)見偏差的變化趨勢,,產(chǎn)生超前的控制效果,。因此可以改善系統(tǒng)的動態(tài)性能。但是微分對噪聲有放大作用,,會減弱系統(tǒng)的抗干擾性,。

轉(zhuǎn)化為數(shù)學(xué)語言就是:

由上面的方框圖,可以知道其傳遞函數(shù)(拉式域表達(dá)式)為:

控制理論和數(shù)學(xué)分析中,,我們一般借助拉普拉斯變化和傅里葉變換來幫助我們分析系統(tǒng)的某些特性,比如暫態(tài)響應(yīng),、穩(wěn)態(tài)響應(yīng)等,。但是在程序中,我們只能根據(jù)時(shí)域中的離散化的表達(dá)式來編寫算法,。

所以將上式轉(zhuǎn)化為時(shí)域表達(dá)式為:

我們需要在計(jì)算機(jī)中通過編程實(shí)現(xiàn)這個(gè)式子,,而上式又是連續(xù)時(shí)間的表達(dá)式,所以只能先將其離散化,,推導(dǎo)出他的差分方程如下:

        .....................................(1)

這就是增量式pid算法的差分方程,。

其中 T 為PID的計(jì)算周期,就是 dt  ,。其值由微控制器的定時(shí)器決定,,自己設(shè)置pid的運(yùn)算周期。

e(k) 為本次計(jì)算時(shí),,傳感器反饋的值和設(shè)定值之間的差,。

e(k-1) 為上次計(jì)算時(shí),傳感器反饋的值和設(shè)定值之間的差,。

e(k-2) 為上上次計(jì)算時(shí),,傳感器反饋的值和設(shè)定值之間的差。

有了pid算法的差分方程,,就可以通過編程來實(shí)現(xiàn)這個(gè)算法,。之所以得通過差分方程來實(shí)現(xiàn),是因?yàn)椴罘址匠痰囊话憬夥ㄊ堑?,而迭代法只需要知道初值和通?xiàng)公式就能計(jì)算出所有時(shí)刻的的值,。這是計(jì)算機(jī)最擅長的事情了。

這個(gè)式子就是最本質(zhì)的離散化PID表達(dá)式,。后面我將基于他推導(dǎo)出其他幾個(gè)常見的表達(dá)式,,但是實(shí)質(zhì)都是這個(gè)式子,。

在推導(dǎo)其他的表達(dá)式之前,請注意這幾個(gè)變量的 關(guān)系:

比例系數(shù):KP

積分系數(shù):KI  =  KP*T/Ti  其中Ti 為積分時(shí)間

微分系數(shù):KD = KP*Td/T    其中Td為微分時(shí)間

之所以叫時(shí)間,,是因?yàn)榭紤]了系統(tǒng)的量綱,。

因?yàn)閜id輸出的控制信號應(yīng)該和被控量或參考信號有同樣的物理單位。因?yàn)樵谖锢硐到y(tǒng)中他們是描述的同一種物理量,。假設(shè)被控量是位移,,單位是m, 時(shí)間單位是s,那么KI  KD的單位應(yīng)該為單位1,,而根據(jù)上面的式子,,有一個(gè)運(yùn)算周期T,所以Ti  Td  相應(yīng)的應(yīng)該也有與之倒數(shù)的時(shí)間單位,,來抵消T 的單位,。所以稱之為時(shí)間。

因?yàn)镵P  和 T 都是常數(shù),,所以積分系數(shù)和積分時(shí)間,、微分系數(shù)和微分時(shí)間都是成嚴(yán)格的比例關(guān)系的。他們的區(qū)別就是數(shù)值不一樣,,實(shí)質(zhì)都是積分項(xiàng)和微分項(xiàng)的系數(shù),。如果調(diào)節(jié)的時(shí)候,看到別人說增大積分時(shí)間,,而你的程序中只有積分系數(shù),。那么這時(shí),就應(yīng)該減小積分系數(shù),。其他類推,。

 對于上面的(1)式,因?yàn)?nbsp; KD/T 是一個(gè)常數(shù),,KI * T也是常數(shù),,所以就有些人由于默認(rèn)pid運(yùn)算周期,就把 KD / T直接寫成 KD,,KI * T直接寫成 KI,,

其實(shí)嚴(yán)格來說,這樣寫是不嚴(yán)謹(jǐn)?shù)?。因?yàn)檎{(diào)節(jié)過程中,,運(yùn)算周期 T 也是一個(gè)很重要的參數(shù)。也需要對他進(jìn)行反復(fù)的調(diào)節(jié),。

所以能推導(dǎo)出這么幾個(gè)式子:

但是不管怎么變換,,他的本質(zhì)都是那個(gè)原式,在他的基礎(chǔ)上把常量統(tǒng)一了一下,,或者做了一下變量代換,。增量式pid的式子就一個(gè),,同樣的迭代式,同樣的項(xiàng),,不同的人在不同的程序中取不同的名字,,而初學(xué)者又容易吧相同名字的變量當(dāng)成一個(gè)東西,以為所有編寫代碼的人都像商量好一樣遵守同樣的原則,,但是現(xiàn)實(shí)中你看到的代碼往往事與愿違,。不規(guī)范的程序到處都是。容易讓人產(chǎn)生誤解,。

=====================================================================

現(xiàn)在根據(jù)最初的原式來進(jìn)行pid算法的實(shí)現(xiàn),。

首先做一下變量代換,方便后面進(jìn)行調(diào)試:

所以差分方程就變成了

KP不能為0,,沒有ID或者單個(gè)I ,、 D的控制器

當(dāng)KD為0的時(shí)候,系統(tǒng)為PI控制器,。

當(dāng)KI為0的時(shí)候,,系統(tǒng)為PD控制器。

當(dāng)KD  KI 都不為0的時(shí)候,,系統(tǒng)為PID控制器。

可以根據(jù)系統(tǒng)的情況選擇使用不同的控制器,。我使用的是PID控制器,。

  1. //=============
  2. //PID.C
  3. //=============
  4. #include 'main.h'
  5. #define set_distance 10.00 //設(shè)定距離
  6. #define allow_error 1.0 //死區(qū),允許誤差帶,0.5太小,,系統(tǒng)不穩(wěn)定,,一直在調(diào)節(jié),2就太大,,
  7. extern float real_distance ; //實(shí)際距離
  8. extern PID_value xdata ASR ;
  9. /* ********************************************************
  10. ** 作者 :Andrew
  11. ** 日期 :2018.3.8
  12. ** 說明:
  13. 1,、PID默認(rèn)為PI調(diào)節(jié)器
  14. 2、使用了條件編譯進(jìn)行功能切換,,節(jié)省計(jì)算時(shí)間
  15. 在校正PID參數(shù)的時(shí)候,,將宏定義 PID_DEBUG 設(shè)為1;
  16. 校正完畢后,,置0,;
  17. 3、同時(shí)在初始化的時(shí)候直接為a0,a1,a2賦值
  18. ******************************************************** */
  19. void PID_operation(PID_value *p)
  20. {
  21. //使用條件編譯進(jìn)行功能切換
  22. #if (PID_DEBUG)
  23. float a0,a1,a2;
  24. //計(jì)算中間變量a0,a1,a2;
  25. a0 = p->KP p->KI*p->T p->KD/p->T ;
  26. a1 = p->KP 2*p->KD/p->T ;
  27. a2 = p->KD/p->T ;
  28. //計(jì)算輸出
  29. p->output = p->output_1 a0*p->error - a1*p->error_1 a2*p->error_2 ;
  30. #else
  31. //非調(diào)試狀態(tài)下,,直接給a賦值計(jì)算輸出,,減小計(jì)算量,因?yàn)橐坏┤齻€(gè)系數(shù)確定,T已知,,即可自己計(jì)算出對應(yīng)的a
  32. p->output = p->output_1 p->a0*p->error - p->a1*p->error_1 p->a2*p->error_2 ;
  33. #endif
  34. //輸出限幅
  35. p->output = constrain_float(p->output,p->out_min,p->out_max);
  36. //為下次計(jì)算迭代
  37. //這里順序千萬不要搞錯(cuò),,不然輸出占空比是錯(cuò)誤的,。
  38. p->output_1 = p->output;
  39. p->error_2 = p->error_1;
  40. p->error_1 = p->error;
  41. }
  42. /* ********************************************************
  43. ** 作者 :Andrew
  44. ** 日期 :2018.3.8
  45. ** 說明:
  46. 1、首先根據(jù)設(shè)定與實(shí)際的距離差,,判斷需要前進(jìn)還是后退
  47. 2,、在誤差為 allow_error 之內(nèi),停車,,防止小車一直在抖,,畢竟超聲波有誤差。
  48. ******************************************************** */
  49. void PID_out(void)
  50. {
  51. float xdata duty;
  52. ASR.ref = set_distance; //距離給定
  53. ASR.fdb = real_distance; //獲取實(shí)際距離反饋
  54. ASR.error = ASR.ref - ASR.fdb; //偏差
  55. PID_operation(&ASR);
  56. duty = ASR.output;
  57. if(ASR.error > allow_error) //設(shè)定值大于實(shí)際值,,小車需要后退
  58. {
  59. left_go_back;
  60. right_go_back;
  61. Left_Forward_Duty = (int)Low_Speed (int)duty; //帶符號數(shù)和無符號數(shù)運(yùn)算會轉(zhuǎn)換為無符號數(shù)
  62. Right_Forward_Duty = Left_Forward_Duty; //速度一樣
  63. }
  64. else if((-ASR.error) > allow_error) //設(shè)定值小于實(shí)際值,,小車前進(jìn)
  65. {
  66. left_go_ahead;
  67. right_go_ahead;
  68. Left_Forward_Duty = (int)Low_Speed (int)duty;
  69. Right_Forward_Duty = Left_Forward_Duty ; //速度一樣
  70. }
  71. else //在誤差范圍內(nèi),停車
  72. car_stop();
  73. }
  74. //浮點(diǎn)數(shù)限幅,constrain ->約束,,限制
  75. //如果輸入不是數(shù)字,,則返回極端值的平均值
  76. //isnan函數(shù)檢測輸入是否是數(shù)字,is not a number
  77. float constrain_float(float amt, float low, float high)
  78. {
  79. // if (isnan(amt)) //51里面沒有這個(gè)庫函數(shù),,需要自己實(shí)現(xiàn)
  80. // {
  81. // return (low high)*0.5f;
  82. // }
  83. return ((amt)<(low)?(low):((amt)>(high)?(high):(amt)));
  84. }
  85. /*
  86. //16位整型數(shù)限幅
  87. int constrain_int16(int amt, int low, int high)
  88. {
  89. return ((amt)<(low)?(low):((amt)>(high)?(high):(amt)));
  90. }
  91. */
  92. //========================
  93. //END OF FILE
  94. //========================

注意在增量式pid算法中需要對輸出結(jié)果做限幅處理,。根據(jù)實(shí)際情況選擇自己需要的幅度。

 頭文件中聲明pid需要參數(shù)的結(jié)構(gòu)體:

  1. //==================
  2. //PID.H
  3. //==================
  4. #ifndef __PID_H
  5. #define __PID_H
  6. //PID計(jì)算需要的參數(shù)
  7. typedef struct pid
  8. {
  9. float ref; //系統(tǒng)待調(diào)節(jié)量的設(shè)定值
  10. float fdb; //系統(tǒng)待調(diào)節(jié)量的反饋值,,就是傳感器實(shí)際測量的值
  11. float KP; //比例系數(shù)
  12. float KI; //積分系數(shù)
  13. float KD; //微分系數(shù)
  14. float T; //離散化系統(tǒng)的采樣周期
  15. float a0; //變量代替三項(xiàng)的運(yùn)算結(jié)果
  16. float a1;
  17. float a2;
  18. float error; //當(dāng)前偏差e(k)
  19. float error_1; //前一步的偏差
  20. float error_2; //前前一步的偏差
  21. float output; //pid控制器的輸出
  22. float output_1; //pid的前一步輸出
  23. float out_max; //輸出上限
  24. float out_min; //輸出下限
  25. }PID_value; //定義一個(gè)PID_value類型,, 此時(shí)PID_value為一個(gè)數(shù)據(jù)類型標(biāo)識符,數(shù)據(jù)類型為結(jié)構(gòu)體
  26. /*
  27. //定義pid控制器的初始值,,全是0的話可以用memset()函數(shù)
  28. //#define PID_DEFAULTS {0, 0, \
  29. // 0, 0, 0, \
  30. // 0.0002, \
  31. // 0, 0, 0, \
  32. // 0, 0, 0, \
  33. // 0, 0, 0, 0}
  34. */
  35. //條件編譯的判別條件,,用于調(diào)試
  36. #define PID_DEBUG 1
  37. //pid函數(shù)聲明
  38. void PID_operation(PID_value *p);
  39. void PID_out(void);
  40. float constrain_float(float amt, float low, float high); //浮點(diǎn)數(shù)限幅
  41. //int constrain_int16(int amt, int low, int high); //整型數(shù)限幅
  42. #endif
  43. //========================
  44. //END OF FILE
  45. //========================

關(guān)于pid結(jié)構(gòu)體的初始化,我在主函數(shù)中使用 memset()函數(shù)進(jìn)行初始化,,比較方便,。

初始化之后,就是給賦上自己調(diào)試的參數(shù),。

  1. //初始化PI調(diào)節(jié)器參數(shù)全為0, 該函數(shù)在string.h
  2. memset(&ASR, 0, sizeof(PID_value));
  3. ASR.KP = distance_kp;
  4. ASR.KI = distance_ki;
  5. ASR.KD = distance_kd;
  6. ASR.T = T0;
  7. ASR.out_max = limit_max;
  8. ASR.out_min = limit_min;

然后利用定時(shí)器定時(shí)調(diào)用   PID_out()   函數(shù)即可,。

=====================================================================

 關(guān)于參數(shù)的整定:

首先是一位師傅給出的建議,記在這里,,作為指導(dǎo),;《大體上是這個(gè)架構(gòu),采集,,然后計(jì)算,,但是有幾個(gè)要注意得問題,不注意這些,,可能永遠(yuǎn)調(diào)不好PID或者調(diào)出來得不理想,,首先你的傳感器響應(yīng)速度?以及執(zhí)行單元執(zhí)行到溫度傳感器得時(shí)間是多少,這個(gè)要去測量一下,。比如我加熱單元開始加熱,,我需要0.5得控制精度,那么我從開始加熱到傳感器發(fā)現(xiàn)溫度變化0.5所需得時(shí)間,,t,,那么就以這個(gè)得0.3-0.6去做采集時(shí)間,并以這個(gè)采集時(shí)間得3-5倍去作為PID計(jì)算得時(shí)間,,并把這個(gè)時(shí)間,,和Ki,Kd系數(shù)做一個(gè)處理?!?/p>

首先得有一個(gè)實(shí)際的項(xiàng)目,,才能進(jìn)行參數(shù)的整定。我采用的是簡單的小車距離保持,。

主控:STC89C52

超聲波模塊獲取實(shí)際距離,。三次平均濾波后,精度可達(dá)1cm,。

程序中我設(shè)置距離為10cm,,死區(qū)為( -1.0cm)

當(dāng)僅僅采用比例控制時(shí),小車震蕩比較嚴(yán)重,,基本無法穩(wěn)定

PID參數(shù)的整定方式:
1,、理論計(jì)算法:采用被控對象的準(zhǔn)確模型進(jìn)行數(shù)學(xué)建模。
2,、工程整定法:不依賴被控對象的數(shù)學(xué)模型,,直接在控制系統(tǒng)中進(jìn)行現(xiàn)場整定,也就是現(xiàn)場調(diào)試,。

其實(shí)這個(gè)調(diào)節(jié)關(guān)鍵還是多看,多試,,如果有能力進(jìn)行模型建立的話,,那將更加精確。但是一般情況下使用試湊法,。剛開始我嘗試了不大概30組參數(shù),,總是不能達(dá)到理想的效果。

顯示比例系數(shù)KP一點(diǎn)點(diǎn)的測試,,在超調(diào)量不大且反應(yīng)靈敏的基礎(chǔ)上增加積分或者微分系數(shù),,但是不要一下子全加上。例如我增加了微分,,控制小車的震蕩,,然后對KD進(jìn)行反復(fù)的測試。

最后增加KI用以消除系統(tǒng)的穩(wěn)態(tài)誤差,但是注意要一點(diǎn)點(diǎn)的增加,。不要加的太多,。

進(jìn)行了pid整定以后,效果如圖,。但是由于芯片處理速度和電機(jī)驅(qū)動性的問題,,導(dǎo)致一直無法調(diào)節(jié)到最佳狀態(tài)。

pid調(diào)節(jié)大法:

/******************************
參數(shù)整定找最佳,,從小到大順序查,,
先是比例后積分,最后再把微分加,,
曲線振蕩很頻繁,,比例度盤要放大,
曲線漂浮繞大灣,,比例度盤往小扳,,
曲線偏離回復(fù)慢,積分時(shí)間往下降,,
曲線波動周期長,,積分時(shí)間再加長,
曲線振蕩頻率快,,先把微分降下來,,
動差大來波動慢,微分時(shí)間應(yīng)加長,,
理想曲線兩個(gè)波,,前高后低四比一,
一看二調(diào)多分析,,調(diào)節(jié)質(zhì)量不會低
*******************************/

關(guān)于PID還有很多很多地方等著去實(shí)驗(yàn),,我這里只是面向新手入門的。寫的很淺顯,。但是一點(diǎn)點(diǎn)經(jīng)驗(yàn)不至于讓大家走那么多彎路,。能對PID有一個(gè)初步的了解,這篇文章的目的算是達(dá)到了,。

參考資料:

1,、原理介紹:http://www.cnblogs.com/cjq0301/p/5184808.html

2、原理介紹:https://wenku.baidu.com/view/827c5423647d27284a735105.html

3,、調(diào)參經(jīng)驗(yàn):http://www./bbs/dpj-51884-1.html

謹(jǐn)以此文祭奠我在pid上面花費(fèi)的那么多時(shí)間,。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多