基于Stateflow和单片机的水位控制

时间:2022-06-13 03:48:56

基于Stateflow和单片机的水位控制

摘 要 Stateflow作为MATLAB软件中用于动态逻辑系统建模的工具,可以将复杂的逻辑问题简单化,已经得到了广泛应用。本文以单片机的水位控制为例,首先用Stateflow建立起控制模型,然后通过RTW工具箱生成可执行C代码,进行修改后并在proteus中搭建起单片机水位控制仿真模型,植入代码进行验证。

关键词 MATLAB;Stateflow;单片机

中图分类号:TP368.1 文献标识码:A 文章编号:1671-7597(2013)11-0000-00

Stateflow是有限状态机的图形工具,它可以将一个复杂的系统分为若干个状态,状态与状态之间的转移条件为状态转移事件,用户可以利用图形化来实现各个状态之间的转换,这样便构成状态转移图。

通常Stateflow是内嵌在simulink仿真模型中的,当完成并调试好控制系统后,可以通过RTW工具箱将控制模型自动生成C代码,用户只需对代码进行必要的设置和修改,就能移植至控制器中去,这样就不需要花太多时间从事代码的开发,可以让设计者腾出更多的精力进行顶层控制策略的设计。本文中选取水位控制任务为例,在simulink中用设计出Stateflow控制模型,进行分析调试后,生成的C代码在keil软件中进行修改和编译,将最终单片机可执行的HEX文件载入用proteus建立的单片机水位控制模型中,来进行分析、验证。实践证明,采用Stateflow进行系统建模,直观、逻辑关系清晰、简便,RTW生成执行代码正确,可以大大缩短系统开发周期。

1 Stateflow水位控制模型的建立

水位控制的任务要求为:水池中有2个液位传感器,下限传感器B和上限传感器C,当水位低于下限时,抽水电机运行抽水,水位上升当水位升至上限时,电机停止抽水,系统工作时,指示灯点亮,若上限传感器C触发而下限传感器B未触发,说明系统出现故障,此时电机停止,同时指示灯闪烁以进行警示。

软件平台采用的版本为Matlab2013a,首先新建一个simulink文件,然后在simulink library中的stateflow模型库中拉出一个char,建立如图1所示的水位控制模型。

图1 stateflow水位控制模型

这里分为三个状态,状态1为motor_off(抽水电机停止状态),此时led=0(指示灯灭),motor=0(抽水电机停止),状态2为motor_on(电机运行状态),此时led=1(指示灯亮),motor=1(电机运行),状态3为error(故障状态),此时motor=0(电机停止),led闪烁(由子状态来实现),led_on和led_off状态间的转移条件为delay事件(在后面生成的代码中进行添加,用定时中断来做)。状态1、状态2、状态3之间的转移条件为水位传感器B、C来决定。下限传感器B动作时sensor_B=0,上限传感器C动作时,sensor_C=0。

通过菜单栏打开model explorer,设置触发事件和I/O,led、motor为输出,数据类型选择为uint8,sensor_B,sensor_C为输入,数据类型选择为uint8。delay为转移条件用fail(下降边沿触发)。

接下来为simulink控制模型添加输入和输出,如图2所示。

图2 simulink模型

进simulink菜单model configuration parameters进行设置Solver、Hardware、Code generation。

2 C代码修改及验证

设置好后,通过simulink菜单code选项,c/c++ code/build model,生成嵌入式c代码,成功后,为了测试代码的可行性,我们在proteus平台中建立直流电机正反转控制模型,如图3所示。

其中I/O设置,传感器B、传感器C、电机控制信号、led指示灯分别接P1.0、P1.1、P1.2、P1.3口。

接下来要对自动生成的代码进行修改,在keil中创建新工程,使用AT89C51芯片,将water_level_control_ert_rtw(simulink文件命名为water_level_control)文件夹中的C文件添加进工程,对ert_main.c进行修改。添加51所需头文件,对用到的引脚进行定义,添加定时中断,在void rt_OneStep(void)函数中添加模型输入和输出,必须与硬件电路一一对应起来,去掉int_T main(int_T argc,const char *argv[])函数的中参数,去掉Unused arguments,在Initialize model中设置定时器,去掉printf指令和fflush((NULL)),在while函数中添加delay翻转信号,来实现Stateflow中的脉冲信号。最后在Perform other application tasks here处添加rt_OneStep()函数调用,设置好后,进行编译并生成HEX文件,加载至图3所示模型中进行分析验证。

当水位低于下限,B、C未触发时,抽水电机运行抽水,指示灯点亮,如图4所示。

当水位上升至上限,B、C均触发时,抽水电机停止抽水,指示灯灭,如图5所示。

图5 电机停止工作仿真图

3 结论

本文以单片机的水位控制为对象,尝试了利用Stateflow构建起水位控制的逻辑模型,分析了该控制系统中的状态以及状态之间的转移条件,利用RTW工具箱自动生成了C代码,并对代码进行了相应的修改,为了验证代码的可行性在proteus平台中建立水位控制模型,仿真实验证明代码正确有效。由此可以看出Stateflow对于系统的开发带来的便利是显而易见的。

参考文献

[1]Mathworks Corp.Stateflow User's Guide R2013a[Z].2013.

[2]张威.Stateflow逻辑系统建模[M].西安电子科技大学出版社,2007.

上一篇:基于Android平台的手机虚拟键鼠的设计与实现 下一篇:机采井电器设备基础数据查询软件研制与应用