PID Controller 在各系的自動控制課一定都會講到,我大學時是在大三的時候上到這門課,大致而言學校的自控課程都會先從 laplace transform 開始教,然後教一些分析系統穩定度的方法,然後會以一些基本的控制模型來講解,PID 就是其中一個。
然而不曉得是因為課程安排的關係還是老師太混,我們並沒有教到這套基本控制理論的離散版本,如 Discrete PID Controller,z-Transform 等等,當時老師又出了程式作業,要求我們要使用樂高機器人來實作倒單擺控制,這對當時的我造成了相當大的疑惑,雖然老師有教程式該怎麼寫,但沒解釋太多,直到最近我才重新理解了一遍 PID Controller 的 discret form,並瞭解到連續系統必須要進行離散化才能在電腦上實做。
PID詳細的理論講解我還在理解整理中,可能之後才會補上,這篇就直接從連續的PID公式講起。
PID的input為量測值和目標值的誤差 $e(t)$,分別對誤差進行比例、積分、微分後以一定的比例 ($K_p、K_i、K_d$) 組合:
其中積分和微分是連續的操作,必須進行離散化,假設系統的取樣時間是 $\Delta t$,則積分的離散形式為:
微分 (又稱爲有限差分) 為:
帶回原式:
這時已經可以實作了,需要兩個變數來儲存歷史資料,一個是積分項的 $\sum_{i=1}^n e[i]$,一個是微分項的 $e[n-1]$,再加上 $e[n]$ 一共三個變數,另外有四個常數,除了本來的三個K值以外還有取樣時間$\Delta t$(有些地方會寫成$T_s$)。
總而言之,我對於我們自動控制沒學離散系統感到很困惑,只有學連續系統可能可以分析一些連續的環境,但如果要用電腦來實做,沒有離散的概念是完全不行的,我直到上蘇老師的訊號與系統才開始有這概念。但自控貌似一直都不是本系強項就是了…
以上,如果我有空再補上 Arduino 的範例或 pseudo code,嗯,有空的話 (?