机械与车辆学院《机电控制系统仿真与软件设计》报告(2014-2015学年第一学期)课程设计题目:水塔水位机电控制系统设计与仿真一、课程设计性质和目的机械电子工程专业是一个对实践、应用能力要求很强的专业,机电控制系统设计与仿真课程学习的目的是让学生借助MATLAB软件来研究机电控制系统的设计方法,与传统控制系统设计采用直接编写程序代码不同的是,本课程是在MATLAB/SIMULINK中设计出控制系统模型,再通过Embedded Coder将控制系统模型生成可执行的C代码,然后加载至MCU中去,采用这种新颖的方法,不用再专注于繁琐程序代码的编写工作,而可以将精力花费在控制算法的研究上。
通过学习本课程让学生也了解现代控制行业发展趋势及控制系统实现的先进方法。
二、课程设计的内容及要求在Proteus中建立起水位控制系统仿真模型,如图所示:B表示为下限水位传感器,C表示为上限水位传感器,D1为指示灯,电机为泵。
图1 水位控制系统仿真模型下限水位传感器B接单片机P1.0管脚,上限水位传感器接单片机P1.1管脚,指示灯D1接单片机P1.3管脚,电机由单片机P1.2经过光耦和继电器来控制。
工作过程是:(1)水位未到下限水位时,泵工作抽水,同时D1指示灯常亮,水位超过下限水位继续上升。
(2)当水位上升到上限水位时,泵停止工作,同时D1指示灯灭,(3)如果下限水位传感器未动作,而上限水位传感器却动作了,则泵停止工作,同时指示灯D1开始按一定时间间隔闪烁报警。
(4)根据上述的控制要求在SIMULINK中,运用Stateflow工具箱建立起该控制系统的模型,并进行仿真运行分析,达到控制系统要求后,再通过SIMULINK菜单code选项,c/c++ code/build model,生成嵌入式C代码。
然后在Keil 中对生成的C代码进行I/O配置和适当修改,编译成HEX文件,最后将该HEX 文件加载至Proteus仿真平台就可以验证代码的正确性了。
三、课程设计的进度及安排表1 课程安排四、MATLAB/Stateflow学习通过MATLAB是一种科学计算软件,专门以矩阵的形式处理数据。
MATLAB 将高性能的数值计算能力和强大的数字可视化功能集成在一起,提供了大量的内置函数,因而被广泛地应用于科学计算、控制系统、信息处理等领域的分析仿真和设计工作;而Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模和仿真,即适用于对事件响应系统进行建模和仿真。
Stateflow和Simulink结合起来,可以创建确定性监管控制系统。
利用Stateflow可视化的模型和直观的仿真能力,可以清晰、简洁地反映出动态逻辑关系。
它的基础是有限状态机理论,它通过状态图、流程图的创建,对事件驱动系统进行建模和仿真。
此次课程设计是基于MATLAB/Stateflow软件上的一次实践,利用Stateflow可视化的模型和直观的仿真能力,对水塔进行逻辑图的绘制,建立动态系统模型进行仿真。
然后对仿真出来的代码进行修改和添加。
这样就不需要花太多时间从事代码的开发,可以让设计者腾出更多的精力进行顶层控制策略的设计。
采用Stateflow 进行系统建模,直观、逻辑关系清晰、简便,RTW 生成执行代码正确,可以大大缩短系统开发周期。
五、水位控制系统模型首先在matlab2013a\simulink下建立起水塔水位控制模型如图2所示,并保存。
图2 simulink下建立控制模型In1、In2为控制输入端(P1.0口、P1.1口的按键输入),设定信号名称为delay,该信号作为stateflow中状态之间变换的转换条件(等效按键的按下产生的脉冲)。
Out1、Out2为模型的输出端。
(电机和指示灯的输出端口)在stateflow菜单view下的Model Explorer中设定输入、输出。
输入High_a,port为1,数据类型DataType为uit8,输入low_b,port为1,数据类型DataType为uit8,输入delay触发Trigger为Falling(因为单片机中,设置是按键按下时产生一个下降沿)。
输出为M、led,port分别为1、2,数据类型DataType 为uit8如图所示。
图3 Model Explorer输入输出设定Chart模块为stateflow模块,定义了High_a、Low_b两个输入变量、M、led 两个输出端口。
图4 stateflow建模初始状态:有4种不同的情况High_a和Low_b都为1;High_a和Low_b都为0;High_a为1,Low_b为0;High_a为0,Low_b为1。
这4种状态将直接进入四种不同的固定状态,执行相应的命令。
四种固定状态:(1)状态A为(工作状态):水位在水位的下限Low_b下,输入信号High_a和Low_b都为1。
M(抽水电机工作状态),此时led=1(指示灯亮)。
(2)状态A1为(故障状态):水位在水位的下限High_a以上,未到达水位上限Low_b。
,此时motor=0(电机停止),led闪烁(由子状态来实现)A4、A5状态间的转移以delay条件实现亮灭。
图5 A1模型(3)状态A2为(中间状态):电机和指示灯都保持原来的运行状态不变。
(4)状态A3为(停机状态):水位在水位的下限Low_b以上,也到达水位上限High_a。
M(抽水电机停止状态),此时led=0(指示灯灭)。
(5)delay 事件(delay为转移条件用fail(下降边沿触发)。
(6)状态1、状态2、状态3之间的转移条件为水位传感器 B、C 来决定。
(即由输入信号High_a和Low_b决定)当输入信号High_a和Low_b都为1,进入状态A执行命令。
完毕后进入中间状态A2,等待下一个输入信号(High_a 和Low_b)的变化,再选择进入相应的状态执行命令。
图6 状态及状态转换设定好stateflow了以后,再设置simulink中的Configuration Parameters,Solver options中Type选择定步长Fixed-step,其他默认;硬件Hardware Implement 选项Device vendor选择Intel,Device type选择8051,其他默认;Real-time Workshop中,System target file选项选择ert.tlc,编译语言language选择C,其他默认。
然后在simulink菜单中Tools选择Real-time Workshop下的Build Model,在matlab命令窗口command window中可以看到详细的编译步骤,编译成功后,simulink文件所在文件夹会出现名为test_ert_rtw的文件夹,在该文件夹下,建立如图所示的proteus仿真模型,取名为test;并建立名为test的keil新工程,芯片选择ATMEL公司的AT89C51,接下来要将rtw编译所得到的C源文件导入keil 中修改并进行编译生成单片机可执行的.hex文件。
六、嵌入式C代码描在simulink菜单中Tools选择Real-time Workshop下的Build Model,在matlab命令窗口command window中可以看到详细的编译步骤,编译成功后,simulink文件所在文件夹会出现名为untitled_ert_rtw的文件夹。
在该文件夹下,建立如附录3所示的proteus仿真模型,取名为水塔电路图;并建立名为untitled的keil新工程,芯片选择ATMEL公司的AT89C51,接下来要将rtw编译所得到的C源文件导入keil中修改并进行编译生成单片机可执行的.hex文件。
在keil工程中,Source Group 1导入rtw编译所得到的C源文件,共有3个,一个为ert_main.c、一个为untitled.c还有rt_zcfcn.c,ert_main.c为主程序,里面要设定输入输出端口,untitled.c为功能程序。
图7 导入C源文件(1)如果不进行修改,直接编译会报错,不能编译通过。
主要是要修改ert_main.c文件,打开后在头文件处加入#include<reg51.h>,并对所到的管脚进行定义。
如图所示。
图8 修改头文件和加入管脚定义(2)接下来设定模型输入输出管脚,如图所示。
图9 添加模型输入输出管脚(3)其中输入输出管脚的名称,可以在test.c中查找得到,必须保持一致。
接下来,要对main函数进行修改。
改成(4)将如下程序段屏蔽或者删除。
在while循环体中添加rt_OneStep();即变成将程序中的(void)(argc);fflush((NULL));程序段屏蔽如图所示。
(5)进行编译,会提示找不到solver_zc.h文件,解决办法为:在matlab安装目录下,搜索查找solver_zc.h,将找到的这个文件,复制到test_ert_rtw的文件夹即可,然后右键点击keil工程中Target 1,选择Options for Target ‘Target 1’中Output,选择Creat HEX file,设定好了后,点击编译,成功编译后,便得到test.hex文件,再打开proteus仿真模型,双击AT89C51芯片,加载test.hex文件,运行便得到了任务要求的效果。
七、调试运行及分析修改完,经过编译正确,将编译好的hex文件导入proteus软件中进行仿真,见图4。
当水位低于下限,B、C 未触发时,抽水电机运行抽水,指示灯点亮。
当水位高于下限低于上限,B触发,C 未触发时,抽水电机运行抽水,指示灯点亮。
当水位上升至上限,B、C 均触发时,抽水电机停止抽水,指示灯灭。
出现错误时,电机停止运转,指示灯闪烁。
图10 proteus仿真模型八、心得体会(1)在第一次设计与仿真练习过程中遇到了许多的问题其中:在改写嵌入C语言编译时因为没有屏蔽原程序中的void)(argc);fflush((NULL));语句导致程序无法编译。
(2)在第一次的仿真控制8个LED灯时,8个LED灯全都点亮。
开始时以为是程序模型的错误,经过多次的检查证实了程序模型没有错误。
最后在同学的帮助下,发现了是在嵌入C语言编译中,rt_OneStep();没有放入主函数中。
(3)在水塔水位机电系统设计与仿真实验中:仿真时发现了proteus仿真模型的运行状态不正确,通过多次的检查发现了在stateflow建模时有一个输入端口没有大写,导致输入端口的信号不能与模型连接。
(4)通过本次水位控制系统的Matlab机电控制系统设计与仿真,使我Matlab 的应用有了一个深刻的认识,也有了一个全面的提高。