APP下载

基于Matlab模糊控制器HDL代码的自动生成

2012-06-01诸葛俊贵

电子科技 2012年1期
关键词:模糊控制液位代码

诸葛俊贵

(上海师范大学精密机电系统与控制工程研究室,上海 201418)

经典和现代控制理论都是建立在被控对象具有精确数学模型的基础上,而实际应用中的许多系统很难用精确的数学模型来描述,难以建模,无法确定控制过程的传递函数和状态方程[1]。而模糊控制在处理这类问题上具有明显优势,尤其对那些控制精度要求不高和需要紧跟环境变化的系统。

随着FPGA技术的快速发展,FPGA在智能电子产品、智能家居、智能交通等领域得到了广泛应用。但在FPGA上直接实现模糊控制算法比较困难,由于Matlab的强大功能,可以借助Matlab的Simulink、Fuzzy Logic和HDL Coder等工具间接快速地自动生成模糊控制器的HDL代码。

1 Fuzzy Logic工具箱设计模糊控制器

实验目的是要将设计的模糊控制器用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 用查找表设计模糊控制器的步骤

2.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个数据,完成水箱液位模糊控制器查找表的制定。

3 控制器查找表的状态机实现

在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并运行,结果表明与原举例中效果一样,而且稳定。

4 在Matlab中自动生成HDL代码

在 Matlab 命令窗口中输入 hdlsetup('mysltank'),打开模型文件mysltank.mdl在窗口菜单Simulation中选中Configuration Parameters,在弹出的窗口中左下角点击HDL Coder,在右边generate HDL for下拉菜单选择Mysltank/Subsystem1,在右下角点击Apply,再单击Run Compatibility Checker,检测兼容性通过,最后单击Generate自动生成HDL代码,在Matlab命令窗口中点击运行生成的链接就可打开生成的HDL代码。

5 结束语

以水箱液位模糊控制为例,详细讨论了利用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.

猜你喜欢

模糊控制液位代码
基于STM32燃气热水锅炉液位控制系统设计与实现
石油储罐液位开关的应用分析
创世代码
创世代码
创世代码
创世代码
T-S模糊控制综述与展望
基于模糊控制的PLC在温度控制中的应用
基于模糊控制的恒压供水系统的研究
用于光伏MPPT中的模糊控制占空比扰动法