諸葛俊貴
(上海師范大學(xué)精密機(jī)電系統(tǒng)與控制工程研究室,上海 201418)
經(jīng)典和現(xiàn)代控制理論都是建立在被控對(duì)象具有精確數(shù)學(xué)模型的基礎(chǔ)上,而實(shí)際應(yīng)用中的許多系統(tǒng)很難用精確的數(shù)學(xué)模型來(lái)描述,難以建模,無(wú)法確定控制過(guò)程的傳遞函數(shù)和狀態(tài)方程[1]。而模糊控制在處理這類(lèi)問(wèn)題上具有明顯優(yōu)勢(shì),尤其對(duì)那些控制精度要求不高和需要緊跟環(huán)境變化的系統(tǒng)。
隨著FPGA技術(shù)的快速發(fā)展,F(xiàn)PGA在智能電子產(chǎn)品、智能家居、智能交通等領(lǐng)域得到了廣泛應(yīng)用。但在FPGA上直接實(shí)現(xiàn)模糊控制算法比較困難,由于Matlab的強(qiáng)大功能,可以借助Matlab的Simulink、Fuzzy Logic和HDL Coder等工具間接快速地自動(dòng)生成模糊控制器的HDL代碼。
實(shí)驗(yàn)?zāi)康氖且獙⒃O(shè)計(jì)的模糊控制器用Matlab自動(dòng)生成 HDL代碼,以用于 FPGA中。由于用 Fuzzy Logic設(shè)計(jì)的模糊控制器tank.fis嵌入到Simulink中的Fuzzy Controller元件中不能自動(dòng)生成HDL代碼,故采用Lookup Table來(lái)設(shè)計(jì)模糊控制器以便用Matlab內(nèi)嵌的HDL Coder自動(dòng)生成HDL代碼。
實(shí)驗(yàn)按照Demos中的舉例Water Level Control in a Tank來(lái)設(shè)計(jì)模糊控制器的,這是一個(gè)標(biāo)準(zhǔn)二維mamdani模糊控制器。其輸入變量有兩個(gè)分量,偏差e和偏差變化率rate=de/dt,一個(gè)輸出量u。偏差e為給定液位與實(shí)際輸出液位的偏差,命名為level,偏差變化率就是偏差隨時(shí)間的變化率,輸出量為閥門(mén)的開(kāi)度,這里為valve,該模糊控制器有5條控制規(guī)則。
對(duì)于輸入變量level有3個(gè)模糊子集high、okay和low覆蓋在模糊論域[-1,1]上,輸入變量rate同樣有3個(gè)模糊子集negative、none和positive覆蓋在模糊論域[-0.1,0.1]上,輸出變量valve則有5個(gè)模糊子集close_fast、close_slow、no_change、open_slow 和 open_fast覆蓋在模糊論域[-1,1]上。
首先,從圖2看出兩輸入變量level和rate的隸屬函數(shù)都是高斯函數(shù)且high、okay和low參數(shù)分別為[0.3 -1]、[0.3 0]和[0.3 1],而 negative、none和positive的參數(shù)分別為[0.03 -0.1]、[0.03 0]和[0.03 0.1],輸出變量valve為三角形函數(shù),它們的參
表5 水箱液位模糊控制器查找表
下面用一組數(shù)據(jù)的計(jì)算說(shuō)明表5的制定[2]。設(shè)偏差level=-1,變化率rate=-0.1,由表1和表2可以查出:
式(1)表示level=-1時(shí),其模糊語(yǔ)言值為high(1),括號(hào)中的值為其隸屬度。同理,可以查出:
由以上兩式語(yǔ)言值按表4可得出規(guī)則:if level is high(1)and rate is negative(1)then valve is close-fast(1)。規(guī)則中valve的語(yǔ)言值隸屬度是根據(jù)規(guī)則前件及規(guī)則蘊(yùn)涵均采用“取小”操作運(yùn)算得到的。即規(guī)則中high和negative的隸屬度均為1,兩者取小,所以后件valve隸屬度也為1。
然后反模糊化,從圖1可以看出輸出隸屬度函數(shù)為對(duì)稱(chēng)三角形,故采用中心值平均法進(jìn)行反模糊化運(yùn)算較簡(jiǎn)單。模糊控制器輸出的精確值為
圖1 輸出隸屬函數(shù)曲線(xiàn)
將valve=-0.9的值填寫(xiě)到控制查找表中l(wèi)evel=-1與rate=-0.1的交叉點(diǎn),依次類(lèi)推,共需計(jì)算出11×11=121個(gè)數(shù)據(jù),完成水箱液位模糊控制器查找表的制定。
在Matlab主界面左下角單擊Start按鈕,依次選擇Simulink-Stateflow-New Chart,在彈出的模型文件編輯窗中雙擊Chart。對(duì)輸入的數(shù)據(jù)先判斷對(duì)應(yīng)列的值,再查找對(duì)應(yīng)行,輸出查找結(jié)果,其中嵌入了一個(gè)eM函數(shù)odata=df(idata),在狀態(tài)流程圖的每一步都調(diào)用了該函數(shù),該函數(shù)的功能是將輸入數(shù)據(jù)轉(zhuǎn)換為有符號(hào)、16位字長(zhǎng)、小數(shù)部分長(zhǎng)為8位的定點(diǎn)數(shù)輸出。
給Chart模塊添加兩個(gè)數(shù)據(jù)輸入一個(gè)數(shù)據(jù)輸出,分別命名為col、row和tab_out,再?gòu)膸?kù)中找到in和out模塊,拖入到模型文件編輯器,其中有兩個(gè)in,一個(gè)out,將兩個(gè)in和一個(gè)out與Chart模塊的兩個(gè)輸入端和一個(gè)輸出端連接,然后選中所有模塊,右鍵Creat Subsystem,生成子系統(tǒng)。
最后將生成的子系統(tǒng)替換掉原來(lái)sltank.mdl文件中的Fuzzy Controller模塊,連好線(xiàn)后注意在子系統(tǒng)的兩個(gè)輸入和輸出端都要添加covert數(shù)據(jù)類(lèi)型轉(zhuǎn)換模塊,輸入端轉(zhuǎn)換器將double轉(zhuǎn)換為sfix16_En8,輸出轉(zhuǎn)換器則相反,否則數(shù)據(jù)類(lèi)型不匹配運(yùn)行出錯(cuò)。
將修改后的模型另存為mysltank.mdl并運(yùn)行,結(jié)果表明與原舉例中效果一樣,而且穩(wěn)定。
在 Matlab 命令窗口中輸入 hdlsetup('mysltank'),打開(kāi)模型文件mysltank.mdl在窗口菜單Simulation中選中Configuration Parameters,在彈出的窗口中左下角點(diǎn)擊HDL Coder,在右邊generate HDL for下拉菜單選擇Mysltank/Subsystem1,在右下角點(diǎn)擊Apply,再單擊Run Compatibility Checker,檢測(cè)兼容性通過(guò),最后單擊Generate自動(dòng)生成HDL代碼,在Matlab命令窗口中點(diǎn)擊運(yùn)行生成的鏈接就可打開(kāi)生成的HDL代碼。
以水箱液位模糊控制為例,詳細(xì)討論了利用Matlab進(jìn)行模糊控制器的設(shè)計(jì)和模糊控制器算法HDL代碼的自動(dòng)生成技術(shù)。該技術(shù)可以用于快速生成模糊控制器算法的 HDL代碼,生成的代碼可以移植到FPGA控制系統(tǒng)。
[1]石磊,陳亞娜.模糊控制器的設(shè)計(jì)研究[J].機(jī)電產(chǎn)品開(kāi)發(fā)與創(chuàng)新,2007(6):108-110.
[2]席愛(ài)民.模糊控制技術(shù)[M].西安:西安電子科技大學(xué)出版社,2008.
[3]陳靜,周志鋒.基于Nios處理的模糊控制器設(shè)計(jì)[J].電子科技,2006,19(6):8 -10.
[4]王史春.基于模糊控制算法實(shí)現(xiàn)信號(hào)燈智能研究[J].電子科技,2009,22(11):32 -35,56.
[5]黃明慧,王海娟.數(shù)字下變頻的一種新型設(shè)計(jì)方法[J].電子科技,2010,23(11):55 -58.