1 引言
模糊控制不需要控制對象的精確數學模型,是一種基于規則的控制,依據操作人員的控制經驗和專家的知識,通過查表得到控制量。因此,模糊控制器具有響應快、超調小、魯棒性強等特點。它能夠克服系統中模型參數變化和非線性等不確定因素,在大滯后、非線性系統中得到廣泛應用。
隨著eda技術得發展,fpga在數字邏輯系統中發揮越來越重要的作用,采用硬件描述語言的硬件電路設計方法得到了廣泛應用。本文利用vhdl硬件描述語言在fpga芯片上設計了一種簡化的模糊控制器。
2 模糊控制器的設計
2.1 模糊控制器系統框圖
由于一維模糊控制器的動態性能不能令人滿意,三維及三維以上的模糊控制器結構太復雜,建立模糊控制規則比較困難,因此一般采用雙輸入單輸出的二維模糊控制器。其系統框圖如圖1所示,輸入為誤差e和誤差變化率ec,輸出為控制量u。

圖1 模糊控制系統框圖
2.2 提取控制總表
論域和模糊狀態應根據問題的實際情況而定,現在假設e,ec和u的模糊子集均為{nb,nm,ns,zo,ps,pm,pb},模糊論域均為[-4,4],設e的基本論域為[-2,2],ec的基本論域為[-1,1],u的基本論域為[-5,5]。則ke=2,kc=4,ku=1.25。打開matlab中的模糊邏輯工具箱,在模糊控制單元中輸入以上參數,并選擇合適的隸屬度函數曲線、模糊推理方法和解模糊化方法,建立模糊控制規則庫[2]。模糊推理,解模糊化等過程由計算機完成,打開rule view提取模糊控制總表,然后乘上比例因子ku,把論域內的模糊值轉化為實際值,得到實際的控制表[3]。
3 fpga實現
根據模糊控制器的特點,采用模塊化設計方法。模糊控制模塊如圖2所示,clk為全局時鐘,g和f為輸入給定和反饋,u為輸出控制量,設g,f和u地位數為八位。模糊控制模塊內部結構分為下四個模塊:jianfa模塊,lisanhua模塊jianbiao模塊和chuli模塊,如圖3所示。

圖 2 模糊控制模塊

圖 3 模糊控制頂層文件原理圖
jianfaqi模塊主要是利用給定值g和反饋值f計算誤差e和誤差變化率ec。進行減法運算時,總是數值大的減去數值小的,正負號分別由eo和co標識,不需要考慮溢出和借位等問題。其主要的vhdl語言描述如下所示:
begin
process(clk)
begin
if clk'event and clk='1'then
if f>=g then
a<=f-g;
m<='1';
elsif f<g then
a<=g-f;
m<='0';
end if; --計算誤差
b<=a;
n<=m;
end if;
end process;
process(clk)
begin
if clk'event and clk='1'then
if m='0' and n='0' then
if a>=b then
ec<=a-b;
co<='0';
elsif a<b then
ec<=b-a;
co<='1';
end if;
elsif m='0'and n='1' then
ec<=a+b;
co<='0';
elsif m='1' and n='0' then
ec<=a+b;
co<='1';
elsif m='1' and n='1' then
if a>=b then
ec<=a-b;
co<='1';
elsif a<b then
ec<=b-a;
co<='0';
end if;
end if; --計算誤差變化率
lisanhua模塊的作用是把jianfaqi模塊得到的誤差e和誤差變化率ec在各自的論域范圍內進行離散處理。離散時把量化因子ke和kc乘入,這樣可以避免編寫乘法模塊,簡化了過程,減少了占用資源,以下是誤差e離散化的vhdl語言描述,誤差變化率ec與之類似。
begin
process(clk)
begin
if clk'event and clk='1'then
if eo='0' then
if e<="0000001" then
elunyu<="0000";
elsif "00000001"<e and e<="00000011" then
elunyu<="0001";
elsif "00000011"<e and e<="00000101" then
elunyu<="0010";
elsif "00000101"<e and e<="00000111" then
elunyu<="0011";
elsif "00000111"<e and e<="11111111" then
elunyu<="0100";
end if;
elsif eo='1' then
if e<="00000001" then
elunyu<="0000";
elsif "00000001"<e and e<="00000011" then
elunyu<="1001";
elsif "00000011"<e and e<="00000101" then
elunyu<="1010";
elsif "00000101"<e and e<="00000111" then
elunyu<="1011";
elsif "00000111"<e and e<="11111111" then
elunyu<="1100";
end if;
end if;
jianbiao模塊的作用是把控制總表用vhdl語言的形式描述,此控制表是模糊控制表乘上比例因子ku后的實際值,表格描述采用case…when結構,如下所示:
begin
process(elunyu,eclunyu)
variable tmp: std_logic_vector(7 downto 0);
begin
tmp:=elunyu&eclunyu;
case tmp is
when"11001100"=>
result<="00000101";
co<='1';
when"11001011"=>
result<="00000010";
co<='1';
……
when others =>
result<="00000000";
co<='0';
end case;
end process;
由于控制表中的數是當前控制變化量,還不能直接作用于被控對象,chuli模塊的作用就是根據當前控制變化量,在前一次控制量的基礎上進行運算得到此次控制量。同時規定控制量的上下限,上限根據具體情況而定,下限是零。主程序如下:
begin
process(clk)
begin
if clk'event and clk='1'then
if ci='0' then
if b>="01010000"then
b<="01010000";
elsif b<"01010000"then
b<=a+b;
end if;
elsif ci='1' then
if b>=a and b<="01010000"then
b<=b-a;
elsif b>"01010000"then
b<="01010000"-a;
elsif b<a then
b<="00000000";
end if;
end if;
end if;
end process;
process(clk)
begin
if b>="01001101"then
u<="01010000";
else
u<=b;
end if;
end process;
4 仿真結果
該模糊控制系統在maxplusⅱ10.2下編譯仿真[4],仿真結果如下:

圖4 模糊控制系統仿真波形
由圖4中波形可以看出,在給定值g不變的情況下,控制量u隨著反饋值f的變化而變化,變化規律與理論上模糊控制系統的輸出規律完全一致。
5 結束語
本設計采用flex10k10lc84-4芯片,用硬件描述語言vhdl設計了模糊控制器,根據程序資源的大小,可以靈活的選擇芯片,也可以根據實際情況很方便地進行修改和調整。經仿真表明,該設計符合模糊控制系統的要求。










