諸葛俊貴
(上海師范大學精密機電系統與控制工程研究室,上海 201418)
經典和現代控制理論都是建立在被控對象具有精確數學模型的基礎上,而實際應用中的許多系統很難用精確的數學模型來描述,難以建模,無法確定控制過程的傳遞函數和狀態方程[1]。而模糊控制在處理這類問題上具有明顯優勢,尤其對那些控制精度要求不高和需要緊跟環境變化的系統。
隨著FPGA技術的快速發展,FPGA在智能電子產品、智能家居、智能交通等領域得到了廣泛應用。但在FPGA上直接實現模糊控制算法比較困難,由于Matlab的強大功能,可以借助Matlab的Simulink、Fuzzy Logic和HDL Coder等工具間接快速地自動生成模糊控制器的HDL代碼。
實驗目的是要將設計的模糊控制器用Matlab自動生成 HDL代碼,以用于 FPGA中。由于用 Fuzzy Logic設計的模糊控制器tank.fis嵌入到Simulink中的Fuzzy Controller元件中不能自動生成HDL代碼,故采用Lookup Table來設計模糊控制器以便用Matlab內嵌的HDL Coder自動生成HDL代碼。
實驗按照Demos中的舉例Water Level Control in a Tank來設計模糊控制器的,這是一個標準二維mamdani模糊控制器。其輸入變量有兩個分量,偏差e和偏差變化率rate=de/dt,一個輸出量u。偏差e為給定液位與實際輸出液位的偏差,命名為level,偏差變化率就是偏差隨時間的變化率,輸出量為閥門的開度,這里為valve,該模糊控制器有5條控制規則。
對于輸入變量level有3個模糊子集high、okay和low覆蓋在模糊論域[-1,1]上,輸入變量rate同樣有3個模糊子集negative、none和positive覆蓋在模糊論域[-0.1,0.1]上,輸出變量valve則有5個模糊子集close_fast、close_slow、no_change、open_slow 和 open_fast覆蓋在模糊論域[-1,1]上。
首先,從圖2看出兩輸入變量level和rate的隸屬函數都是高斯函數且high、okay和low參數分別為[0.3 -1]、[0.3 0]和[0.3 1],而 negative、none和positive的參數分別為[0.03 -0.1]、[0.03 0]和[0.03 0.1],輸出變量valve為三角形函數,它們的參


表5 水箱液位模糊控制器查找表
下面用一組數據的計算說明表5的制定[2]。設偏差level=-1,變化率rate=-0.1,由表1和表2可以查出:

式(1)表示level=-1時,其模糊語言值為high(1),括號中的值為其隸屬度。同理,可以查出:

由以上兩式語言值按表4可得出規則:if level is high(1)and rate is negative(1)then valve is close-fast(1)。規則中valve的語言值隸屬度是根據規則前件及規則蘊涵均采用“取小”操作運算得到的。即規則中high和negative的隸屬度均為1,兩者取小,所以后件valve隸屬度也為1。
然后反模糊化,從圖1可以看出輸出隸屬度函數為對稱三角形,故采用中心值平均法進行反模糊化運算較簡單。模糊控制器輸出的精確值為


圖1 輸出隸屬函數曲線
將valve=-0.9的值填寫到控制查找表中level=-1與rate=-0.1的交叉點,依次類推,共需計算出11×11=121個數據,完成水箱液位模糊控制器查找表的制定。
在Matlab主界面左下角單擊Start按鈕,依次選擇Simulink-Stateflow-New Chart,在彈出的模型文件編輯窗中雙擊Chart。對輸入的數據先判斷對應列的值,再查找對應行,輸出查找結果,其中嵌入了一個eM函數odata=df(idata),在狀態流程圖的每一步都調用了該函數,該函數的功能是將輸入數據轉換為有符號、16位字長、小數部分長為8位的定點數輸出。
給Chart模塊添加兩個數據輸入一個數據輸出,分別命名為col、row和tab_out,再從庫中找到in和out模塊,拖入到模型文件編輯器,其中有兩個in,一個out,將兩個in和一個out與Chart模塊的兩個輸入端和一個輸出端連接,然后選中所有模塊,右鍵Creat Subsystem,生成子系統。
最后將生成的子系統替換掉原來sltank.mdl文件中的Fuzzy Controller模塊,連好線后注意在子系統的兩個輸入和輸出端都要添加covert數據類型轉換模塊,輸入端轉換器將double轉換為sfix16_En8,輸出轉換器則相反,否則數據類型不匹配運行出錯。
將修改后的模型另存為mysltank.mdl并運行,結果表明與原舉例中效果一樣,而且穩定。
在 Matlab 命令窗口中輸入 hdlsetup('mysltank'),打開模型文件mysltank.mdl在窗口菜單Simulation中選中Configuration Parameters,在彈出的窗口中左下角點擊HDL Coder,在右邊generate HDL for下拉菜單選擇Mysltank/Subsystem1,在右下角點擊Apply,再單擊Run Compatibility Checker,檢測兼容性通過,最后單擊Generate自動生成HDL代碼,在Matlab命令窗口中點擊運行生成的鏈接就可打開生成的HDL代碼。
以水箱液位模糊控制為例,詳細討論了利用Matlab進行模糊控制器的設計和模糊控制器算法HDL代碼的自動生成技術。該技術可以用于快速生成模糊控制器算法的 HDL代碼,生成的代碼可以移植到FPGA控制系統。
[1]石磊,陳亞娜.模糊控制器的設計研究[J].機電產品開發與創新,2007(6):108-110.
[2]席愛民.模糊控制技術[M].西安:西安電子科技大學出版社,2008.
[3]陳靜,周志鋒.基于Nios處理的模糊控制器設計[J].電子科技,2006,19(6):8 -10.
[4]王史春.基于模糊控制算法實現信號燈智能研究[J].電子科技,2009,22(11):32 -35,56.
[5]黃明慧,王海娟.數字下變頻的一種新型設計方法[J].電子科技,2010,23(11):55 -58.