《机电控制系统仿真与软件设计》报告书.docx
《《机电控制系统仿真与软件设计》报告书.docx》由会员分享,可在线阅读,更多相关《《机电控制系统仿真与软件设计》报告书.docx(30页珍藏版)》请在冰豆网上搜索。
《机电控制系统仿真与软件设计》报告书
机械与车辆学院
《机电控制系统仿真与软件设计》
报告
(2013-2014学年第一学期)
课程设计题目:
机电控制系统设计与仿真
姓名:
学号:
班级:
指导老师:
时间:
成绩:
目录
一、课程设计性质和目的-2-
二、课程设计的内容及要求-2-
三、课程设计的进度及安排-3-
四、MATLAB/Stateflow学习-4-
五、水位控制系统模型-4-
六、嵌入式C代码-5-
七、调试运行及分析-7-
八、心得体会-7-
九、参考文献-8-
十、致谢-8-
十一、附录-9-
附录1simulink水位控制模型-9-
附录2stateflow水位控制模型-10-
附录3proteus水塔控制仿真-11-
附录4ert_main.c函数文件-12-
附录5rt_zcfcn.c函数文件-15-
附录6untitled.c函数文件-18-
附录7untitled_data.c函数文件-24-
一、课程设计性质和目的
机械电子工程专业是一个对实践、应用能力要求很强的专业,机电控制系统设计与仿真课程学习的目的是让学生借助MATLAB软件来研究机电控制系统的设计方法,与传统控制系统设计采用直接编写程序代码不同的是,本课程是在MATLAB/SIMULINK中设计出控制系统模型,再通过EmbeddedCoder将控制系统模型生成可执行的C代码,然后加载至MCU中去,采用这种新颖的方法,不用再专注于繁琐程序代码的编写工作,而可以将精力花费在控制算法的研究上。
通过学习本课程让学生也了解现代控制行业发展趋势及控制系统实现的先进方法。
二、课程设计的内容及要求
在Proteus中建立起水位控制系统仿真模型,如图1所示。
B表示为下限水位传感器,C表示为上限水位传感器,D1为指示灯,电机为泵。
图1水位控制系统仿真模型
下限水位传感器B接单片机P1.0管脚,上限水位传感器接单片机P1.1管脚,指示灯D1接单片机P1.3管脚,电机由单片机P1.2经过光耦和继电器来控制。
工作过程是水位未到下限水位时,泵工作抽水,同时D1指示灯常亮,水位上升到下限水位继续上升,当水位上升到上限水位时,泵停止工作,同时D1指示灯灭,如果下限水位传感器未动作,而上限水位传感器却动作了,则泵停止工作,同时指示灯D1开始按一定时间间隔闪烁报警。
根据上述的控制要求在SIMULINK中,运用Stateflow工具箱建立起该控制系统的模型,并进行仿真运行分析,达到控制系统要求后,再通过SIMULINK菜单code选项,c/c++code/buildmodel,生成嵌入式C代码。
然后在Keil中对生成的C代码进行I/O配置和适当修改,编译成HEX文件,最后将该HEX文件加载至Proteus仿真平台就可以验证代码的正确性了。
三、课程设计的进度及安排
表一:
时间分配进度表
序号
项 目
时 间
1
布置设计任务、初步运用MATLAB基本知识
6号上午
2
进一步熟悉MATLAB,SIMULINK各种设置的熟悉
6号下午
3
流水灯控制系统SIMULINK建模练习
7号上午
4
流水灯控制系统SIMULINK建模仿真,控制代码的自动生成和编译c代码修改、编译与仿真
7号下午
5
水位控制系统SIMULINK建模
8号上午
6
控制代码的自动生成和编译c代码修改、编译调试与仿真
8号下午
7
仿真控制系统调试分析、编写设计报告
9号上午
8
课程设计报告的整理
9号下午
9
打印课程设计报告
10号上午
10
答辩
10号下午
四、MATLAB/Stateflow学习
MATLAB是一种科学计算软件,专门以矩阵的形式处理数据。
MATLAB将高性能的数值计算能力和强大的数字可视化功能集成在一起,提供了大量的内置函数,因而被广泛地应用于科学计算、控制系统、信息处理等领域的分析仿真和设计工作;而Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模和仿真,即适用于对事件响应系统进行建模和仿真。
Stateflow和Simulink结合起来,可以创建确定性监管控制系统。
利用Stateflow可视化的模型和直观的仿真能力,可以清晰、简洁地反映出动态逻辑关系。
它的基础是有限状态机理论,它通过状态图、流程图的创建,对事件驱动系统进行建模和仿真。
此次课程设计是基于MATLAB/Stateflow软件上的一次实践,利用Stateflow可视化的模型和直观的仿真能力,对水塔进行逻辑图的绘制,建立动态系统模型进行仿真。
然后对仿真出来的代码进行修改和添加。
这样就不需要花太多时间从事代码的开发,可以让设计者腾出更多的精力进行顶层控制策略的设计。
采用Stateflow进行系统建模,直观、逻辑关系清晰、简便,RTW生成执行代码正确,可以大大缩短系统开发周期。
五、水位控制系统模型
首先新建一个simulink文件,然后在simulinklibrary中的stateflow模型库中拉出一个char,建立如附录1所示的水位控制模型。
分为三个状态,状态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。
通过菜单栏打开modelexplorer,设置触发事件和I/O,led、motor为输出,数据类型选择为uint8,sensor_B,sensor_C为输入,数据类型选择为uint8。
delay为转移条件用fail(下降边沿触发)。
并为simulink控制模型添加输入和输出,如附录2所示。
设定好stateflow了以后,再设置simulink中的ConfigurationParameters,Solveroptions中Type选择定步长Fixed-step,其他默认;硬件HardwareImplement选项Devicevendor选择Intel,Devicetype选择8051,其他默认;Real-timeWorkshop中,Systemtargetfile选项选择ert.tlc,编译语言language选择C,其他默认。
六、嵌入式C代码
在simulink菜单中Tools选择Real-timeWorkshop下的BuildModel,在matlab命令窗口commandwindow中可以看到详细的编译步骤,编译成功后,simulink文件所在文件夹会出现名为untitled_ert_rtw的文件夹。
在该文件夹下,建立如附录3所示的proteus仿真模型,取名为水塔电路图;并建立名为untitled的keil新工程,芯片选择ATMEL公司的AT89C51,接下来要将rtw编译所得到的C源文件导入keil中修改并进行编译生成单片机可执行的.hex文件。
在keil工程中,SourceGroup1导入rtw编译所得到的C源文件,共有3个,一个为ert_main.c、一个为untitled.c还有rt_zcfcn.c,ert_main.c为主程序,里面要设定输入输出端口,untitled.c为功能程序。
然后修改ert_main.c文件,头文件处加入#include,并对所到的管脚进行定义,
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
其中输入输出管脚的名称,可以在untitled.c中查找得到,必须保持一致。
在/*setthemodel*/前加
untitled_U.sensor_B=P1_0;
untitled_U.sensor_C=P1_1;
在/*getmodeloutputshere*/
P1_3=untitled_Y.Out1;
P1_2=untitled_Y.Out2;
将
int_Tmain(int_Targc,constchar_T*argv[])
改成
int_Tmain()
将如下程序段屏蔽或者删除。
Print(“warning:
Thesimulationwillrunforever.”
“GeneratedERTmainwont’tsimulatemodelstepbehavior.”
“Tochangthisbehaviorselectthe‘MAT-filelogging’option./n”)
在while循环体中添加rt_OneStep();在Initializemodel中设置定时器,去掉printf指令和fflush((NULL)),(void)(argc);。
最后Performotherapplicationtaskshere处添加rt_OneStep()函数调用,设置好后,进行编译并生成HEX文件。
在代码的修改中出现了一个很粗心的错误,就是将输出口的接口搞反了,P1_2=untitled_Y.Out1;
P1_3=untitled_Y.Out2;
正确的应该是
P1_2=untitled_Y.Out2;
P1_3=untitled_Y.Out1;
结果,足足多花了两个小时。
matlab编译完的C代码:
#include
#include"untitled.h"
#include"rtwtypes.h"
voidrt_OneStep(void)
{
staticboolean_TOverrunFlag=0;
if(OverrunFlag){
rtmSetErrorStatus(untitled_M,"Overrun");
return;
}
OverrunFlag=TRUE;
untitled_step();
OverrunFlag=FALSE;
}
int_Tmain(int_Targc,constchar*argv[])
{
(void)(argc);
(void)(argv);
untitled_initialize();
printf("Warning:
Thesimulationwillrunforever."
"GeneratedERTmainwon'tsimulatemodelstepbehavior."
"Tochangethisbehaviorselectthe'MAT-filelogging'option.\n");
fflush((NULL));
while(rtmGetErrorStatus(untitled_M)==(NULL)){
}
untitled_terminate();
return0;
}
七、调试运行及分析
修改完,经过编译正确,将编译好的hex文件导入proteus软件中进行仿真,
见图4。
当水位低于下限,B、C未触发时,抽水电机运行抽水,指示灯点亮。
当水位高于下限低于上限,B触发,C未触发时,抽水电机运行抽水,指示灯点亮。
当水位上升至上限,B、C均触发时,抽水电机停止抽水,指示灯灭。
出现错误时,电机停止运转,指示灯闪烁。
八、心得体会
通过本次水位控制系统的Matlab机电控制系统设计与仿真,使我Matlab的应用有了一个深刻的认识,也有了一个全面的提高。
这主要得益于老师耐心的教诲与同学们提供资料与帮助的结果。
通过这次课程设计,我学到了一个全新的软件,让自己在理论知识和软件操作能力方面都得到了很好的训练!
还学会了充分利用网络资源等一切可以利用的资源。
九、参考文献
[1]王静霞主编,单片机应用技术,电子工业出版社,2009.
[2]MathworksCorp.StateflowUser'sGuideR2013a[Z],2013.
[3]刘杰主编,基于模型的设计——MCU篇,北京航空航天大学出版社,2011.
[4]张威.Matlab.Stateflow逻辑系统建模,西安电子科技大学出版社,2007.
十、致谢
在此,我对我的指导老师王倩老师致以我最衷心的感谢与诚挚的敬意!
王老师干劲十足,易于亲近,而且在对学生是非常负责,一次次耐心地指导我。
如果没有她的悉心教诲,我顺利完成我的课程设计!
同时,也非常感谢在这期间帮助过我的所有同学,谢谢你们的帮助!
感谢我们的王倩老师。
十一、附录
附录1simulink水位控制模型
附录2stateflow水位控制模型
附录3proteus水塔控制仿真
附录4ert_main.c函数文件
/*
*File:
ert_main.c
*
*CodegeneratedforSimulinkmodel'untitled'.
*
*Modelversion:
1.2
*SimulinkCoderversion:
8.4(R2013a)13-Feb-2013
*TLCversion:
8.4(Jan192013)
*C/C++sourcecodegeneratedon:
ThuJan0910:
22:
052014
*
*Targetselection:
ert.tlc
*Embeddedhardwareselection:
Intel->8051Compatible
*Codegenerationobjectives:
Unspecified
*Validationresult:
Notrun
*/
#include/*Thisert_main.cexampleusesprintf/fflush*/
#include"untitled.h"/*Model'sheaderfile*/
#include"rtwtypes.h"/*MathWorkstypes*/
#include
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
/*
*Associatingrt_OneStepwithareal-timeclockorinterruptserviceroutine
*iswhatmakesthegeneratedcode"real-time".Thefunctionrt_OneStepis
*alwaysassociatedwiththebaserateofthemodel.Subratesaremanaged
*bythebaseratefrominsidethegeneratedcode.Enabling/disabling
*interruptsandfloatingpointcontextswitchesaretargetspecific.This
*examplecodeindicateswheretheseshouldtakeplacerelativetoexecuting
*thegeneratedcodestepfunction.Overrunbehaviorshouldbetailoredto
*yourapplicationneeds.Thisexamplesimplysetsanerrorstatusinthe
*real-timemodelandreturnsfromrt_OneStep.
*/
voidrt_OneStep(void)
{
staticboolean_TOverrunFlag=0;
/*Disableinterruptshere*/
/*Checkforoverrun*/
if(OverrunFlag){
rtmSetErrorStatus(untitled_M,"Overrun");
return;
}
OverrunFlag=TRUE;
/*SaveFPUcontexthere(ifnecessary)*/
/*Re-enabletimerorinterrupthere*/
/*Setmodelinputshere*/
untitled_U.sensor_C=P1_1;
untitled_U.sensor_B=P1_0;
/*Stepthemodel*/
untitled_step();
/*Getmodeloutputshere*/
P1_2=untitled_Y.Out2;
P1_3=untitled_Y.Out1;
/*Indicatetaskcomplete*/
OverrunFlag=FALSE;
/*Disableinterruptshere*/
/*RestoreFPUcontexthere(ifnecessary)*/
/*Enableinterruptshere*/
}
/*
*Theexample"main"functionillustrateswhatisrequiredbyyour
*applicationcodetoinitialize,execute,andterminatethegeneratedcode.
*Attachingrt_OneSteptoareal-timeclockistargetspecific.Thisexample
*illustateshowyoudothisrelativetoinitializingthemodel.
*/
int_Tmain()
{
/*Unusedarguments*/
//(void)(argc);
//(void)(argv);
/*Initializemodel*/
untitled_initialize();
/*Attachrt_OneSteptoatimerorinterruptserviceroutinewith
*period0.5seconds(themodel'sbasesampletime)here.The
*callsyntaxforrt_OneStepis
*
*rt_OneStep();
*/
/*printf("Warning:
Thesimulationwillrunforever."
"GeneratedERTmainwon'tsimulatemodelstepbehavior."
"Tochangethisbehaviorselectthe'MAT-filelogging'option.\n");
fflush((NULL));*/
while(rtmGetErrorStatus(untitled_M)==(NULL)){
/*Performotherapplicationtaskshere*/
rt_OneStep();
}
/*Disablert_OneStep()here*/
/*Terminatemodel*/
untitled_terminate();
return0;
}
/*
*Filetrailerforgeneratedcode.
*
*[EOF]
*/
附录5rt_zcfcn.c函数文件
/*
*File:
rt_zcfcn.c
*
*CodegeneratedforSimulinkmodel'untitled'.
*
*Modelversion:
1.2
*SimulinkCoderversion:
8.4(R2013a)13-Feb-2013
*TLCversion:
8.4(Jan192013)
*C/C++sourcecodegeneratedon:
ThuJan0910:
22:
052014
*
*Targetselection:
ert.tlc
*Embeddedhardwareselection:
Intel->8051Compatible
*Codegenerationobjectives:
Unspecified
*Validationresult:
Notrun
*/
#include"rt_zcfcn.h"
/*Detectzerocrossingsevents.*/
ZCEventTypert_ZCFcn(ZCDirectionzcDir,ZCSigState*prevZc,real_TcurrValue)
{
slZcEventTypezcsDir;
slZcEventTypetempEv;
ZCEventTypezcEvent=NO_ZCEVENT;/*assume*/
/*zcEventmatrix*/
staticconstslZcEventTypeeventMatrix[4][4]={
/*ZERPOSNEGUNK*/
{SL_ZCS_EVENT_NUL,SL_ZCS_EVENT_Z2P,SL_ZCS_EVENT_Z2N,SL_ZCS_EVENT_NUL},/*ZER*/
{SL_ZCS_EVENT_P2Z,SL_ZCS_EVENT_NUL,SL_ZCS_EVENT_P2N,SL_ZCS_EVENT_NUL},/*POS*/
{SL_ZCS_EVENT_N2Z,SL_ZCS_EVENT_N2P,SL_ZCS_EVENT_NUL,SL_ZCS_EVENT_NUL},/*N