如何將連續域的控制器進行離散化實現

大家在學完了自動控制原理之後,最常見的一個問題就是,我設計好了一個控制器,得到了它的傳遞函數,那麼我該怎麼實現它?裡面都是微積分,我該怎麼編程實現它?正好今天有朋友問起了這個問題,我寫了個比較長的答案,就整理一下發在這裡吧。關於控制器增益和時滯的問題過兩天再更。

控制器的邏輯實現有連續實現和數字近似兩種,連續實現主要是指使用運放電路來實現邏輯,數字近似主要是指使用數字計算機來迭代計算。數字計算機一般是只有加法和減法的指令的,微分和積分都是靠數值演算法實現的,而控制器的邏輯也一般都是使用加減乘除的。

本篇僅討論在連續域設計好之後,如何數字離散化實現的問題。模擬控制器(連續實現)和數字控制器的優缺點及常見實現設備打算在下周探討一下。如何使用零階保持器將連續對象離散化之後,直接在z域設計控制器也不在本篇的討論內容。

最常見的兩種方法就是歐拉法和塔斯汀法(Tustins method,也叫bilinear transformation)。

歐拉法即為:

s=frac{z-1}{T}

將傳遞函數中的s用這個替換即可。

這是因為s在拉普拉斯變換裡面是微分,而

dot{x} approx (x(k+1)-x(k))/T

而z變換裡面的z運算符即為:

zx(k)=x(k+1)

微分關係即變為:

dot{x} approx (zx(k)-x(k))/T=x(k)(z-1)/T

但是歐拉法用的是積分的矩形法則,效果有時並不好。所以又提出了根據梯形法則的塔斯汀法:

s=frac{2}{T}frac{z-1}{z+1}

將C(s)裡面的s都替換掉,變成z和C(z)就行了。

可以再matlab裡面用c2d函數進行運算:

[numZ denZ]=c2d(num,den,tustin)%bilinear method

歐拉法在matlab裡面貌似已經是不支持了。

再說下z域里怎麼寫成差分方程。如果我們有控制器:

C(z)=frac{Y(z)}{U(z)}=frac{a_{m}z^{m}+a_{m-1}z^{m-1}....+a_{1}z^{1}+b_{0}}{b_{n}z^{n}+b_{n-1}z^{n-1}....+b_{1}z^{1}+b_{0}}

且n≥m,

將分式轉換:

Y(z)(a_{n}z^{n}+a_{n-1}z^{n-1}....+a_{1}z^{1}+a_{0})=U(z)(b_{m}z^{m}+b_{m-1}z^{m-1}....+b_{1}z^{1}+b_{0})

兩邊同除以z^n

Y(z)(a_{n}+a_{-1}z^{-1}....+a_{1}z^{1-n}+a_{0}z^{-n})=U(z)(b_{m}z^{m-n}+b_{m-1-n}z^{m-1-n}....+b_{1}z^{1-n}+b_{0}z^{-n})

注意

z^{-n}x(k)=x(k-n)

讓Y(z)=Y(k),U(z)=U(k)

a_{n}Y(k)+a_{-1}Y(k-1)....+a_{1}Y(k+1-n)+a_{0}Y(k-n)=b_{m}U(k+m-n)+b_{m-1-n}U(k+m-n-1)....+b_{1}U(k+1-n)+b_{0}U(k-n)

那麼就能得到k時刻Y的值了。

begin{split}n&Y(k)=frac{1}{a_{n}}n((-a_{-1}Y(k-1)....-a_{1}Y(k+1-n)-a_{0}Y(k-n)n&+b_{m}U(k+m-n)+b_{m-1-n}U(k+m-n-1)....+b_{1}U(k+1-n)+b_{0}U(k-n))nend{split}

舉個例子:

C(z)=frac{Y(z)}{u(z)}=frac{2z-1}{z^2+z+1}

分式上下均除以z的平方:

C(z)=frac{Y(z)}{U(z)}=frac{2z^{-1}-z^{-2}}{1+z^{-1}+z^{-2}}

進一步整理:

Y(k)(1+z^{-1}+z^{-2})=U(k)(2z^{-1}-z^{-2})

再把左邊的部分項挪過來:

Y(k)=2U(k-1)-U(k-2)-Y(k-1)-Y(k-2)

這樣就知道k時刻控制器的輸出是多少了,能在程序裡面進行實現了。
推薦閱讀:

機器人和自動化大幅改造製造業,「中國製造」的優勢已經消失
鎖相環(PLL)在振蕩器中的應用-準備篇
前饋形式的震蕩控制器(上)
自動控制領域有哪些必讀的「聖經」(書籍或論文或其他讀物)?
無需軟體,免費自動轉寫英文電話會紀要

TAG:自动化 | 控制理论 | 控制系统 |