设计与开发

单片机 在模型 Simulink基于模型开发方式在任意单片机上运行

小编 2024-11-28 设计与开发 23 0

Simulink基于模型开发方式在任意单片机上运行

导言-一个基于模型的例子

使用Arduino在simulink中搭建的LED闪烁的一个例子,相比之前C语言代码实现的方式,这里没有写一行代码就实现了LED闪烁。读者有没有感觉这种开发方式即简单又方便,要实现什么功能就直奔主题,不用一行一行的敲代码、排查代码错误。图1只是arduino其中的I/O输出外设,在图2中还有其它很多外设可以使用,再结合matlab强大的功能,读者可以实现很多实际应用。

图1 Arduino-simulink的LED闪烁模型

图2 simulink中arduino其它外设的模型

任意单片机基于模型开发方式

并不是每一个芯片厂商都有足够的人力和资金投入到主流开发软件的生态适配,目前除了市面上用的比较火的几款单片机(STM32、TMS320F28xx、S32K等)和Arduino平台可以直接使用Matlab的硬件支持包直接开发外,其它单片机没办法直接使用,这里给大家介绍一种万能的方式,可以在任意单片机上使用基于Simulink模型开发方式。

1、8051单片机上运行Simulink模型代码

第1步:搭建Simulink模型

如图3 所示,,这里使用了三个库,分别是“Delay(延时模型)”、“Logical Operator-NOT(逻辑操作-非模型)”和“out(输出端口模型)”,这里的输出端口为了方便代码移植将名字改为LED。

图3 LED闪烁simulink模型

第2步:设置模型生成参数并生成代码

如图4所示,点击按钮“Model Configuration Parameters”对simulink进行设置。

图4 simulink设置按钮

如图5所示,在弹出的“Configuration Parameters:xxxx”窗口中找到“Solver”栏,并点击设置运行参数,按照图中的设置,完成后点击“Apply”。

图5 “Solver”栏参数设置

如图6所示,在“Hardware Implementtation”栏中设置硬件参数,按照图中的设置进行操作,完成后点击“Apply”。

图6 “Hardware Implementtation”栏参数设置

如图7所示,点击“Code Generation”栏,设置代码生成参数,完成后点击“Apply”。

图7 “Code Generation”参数设置

如图8所示,点开“Code Generation”左边的“>”符号,在子栏目中找到“Code Style”项设置代码生成风格,完成后点击“Apply”。

图8 “Code Style”栏设置

如图9所示,点开“Code Generation”左边的“>”符号,在子栏目中找到“Code Placement”中设置“File packaging format”参数,完成后点击“Apply”,到这一步,所有参数都设置完成,然后点击“OK”按钮。

图9 “Code Placement”栏设置

如图10所示,点击按钮“Build Model”生成代码。

图10 点击生成模型代码

代码生成根据电脑性能不同,需要的时间也不一样,稍等一会儿,弹出“Code Generation Report”窗口报告,如图11所示,在这个窗口中可以看到整个模型生成了三个文件,分别是“ert_main.c”、"LED_Blink.c"和"LED_Blink.h",然后在LED_Blink.slx文件所在的目录下多了一个“LED_Blink_ert_rtw”名字的文件夹,生成的三个文件也包含在当中;看这三个代码有点像之前讲的模块化编程方式命名。

图11 LED_Blink模型代码生成报告

第3步:将simulink生产的代码添加到8051单片机工程中

这一步也是整个过程中最关键部分,也是在很多资料中一直没讲清楚的部分,将生成的代码移植到51单片机工程中去。先新建一个名字(其它名字也可以,只要正确建立Keil工程即可)为“LED_Blink”的Keil工程,工程的存放路径放在刚刚模型生成代码"Blink→LED_Blink_ert_rtw“文件夹下,如图12所示。

图12 在生成模型文件夹下建一个Keil工程

打开刚刚建立的Keil工程,将ert_main.c和LED_Blink.c文件添加到”Source Group 1“中,如图13所示。

图13 模型代码添加

在刚刚添加的文件中双击打开ert_main.c,在下面代码位置处加入8051单片机的内容,代码如下所示:

#include <stddef.h>#include <stdio.h> /* This ert_main.c example uses printf/fflush */#include "LED_Blink.h" /* Model's header file */#include "rtwtypes.h"#include <REGX52.H> /* 添加51单片机头文件 *//*********** 变量定义 *************/#define MAIN_CLOCK 12000000#define SYSTEM_DELAY 1000 /* 系统周期1ms */#define LED_TASK_TIME 500 /* SYSTEM_DELAY*0.500 = 500ms任务 */uint16_T LED_Task_Count = LED_TASK_TIME; /* 任务定时器变量 */void SYSTEM_T0_Init( void ); /* 定时器0初始化函数 */

添加单片机代码

然后在ert_main.c文件中添加定时器初始化代码,如下所示:

void SYSTEM_T0_Init( void ){ /* 定时器0配置为16位定时器,当溢出时手工重装 */ /* 清除所有有关T0的位 (T1不变) */ TMOD &= 0xF0; /* 设置所需的T0相关位 (T1 不变) */ TMOD |= 0x01; /* 停止定时器0 */ TR0 = 0; /* 设置定时器重装值 */ /* 我们这里设置1ms产生一次中断 */ /* 定时器低8位赋值 */ TL0 = 65536 -(MAIN_CLOCK/SYSTEM_DELAY/12); /* 定时器高8位赋值 */ TH0 = (65536-(MAIN_CLOCK/SYSTEM_DELAY/12))>>8; /* 启动T0 */ TR0 = 1; /* 使能定时器T0中断 */ ET0 = 1;}

在ert_main.c中编写定时器中断代码,如下所示:

/*************************************** 函 数 名:SYSTEM_Tick_Update() interrupt 1** 输入参数:none** 返 回 值:none** 说 明:定时器T0中断入口函数**************************************/void SYSTEM_Tick_Update( void ) interrupt 1{ /* 停止定时器0 */ TR0 = 0; /* 设置定时器重装值 */ /* 我们这里设置1ms产生一次中断 */ /* 定时器低8位赋值 */ TL0 = 65536 -(MAIN_CLOCK/SYSTEM_DELAY/12); /* 定时器高8位赋值 */ TH0 = (65536-(MAIN_CLOCK/SYSTEM_DELAY/12))>>8; /* 启动T0 */ TR0 = 1; /* LED Task 任务计时器*/ LED_Task_Count--;}

定时器中断函数代码

在main主函数中对代码进行修改,如下所示:

int_T main(){ /* Initialize model */ LED_Blink_initialize(); /* 定时器0 初始化 */ SYSTEM_T0_Init(); /* 使能总中断,这样定时器0才会启动 */ EA = 1; /* Attach rt_OneStep to a timer or interrupt service routine with * period 0.2 seconds (the model's base sample time) here. The * call syntax for rt_OneStep is * * rt_OneStep(); */ while (rtmGetErrorStatus(LED_Blink_M) == (NULL)) { /* Perform other application tasks here */if(LED_Task_Count<=0) { LED_Task_Count = LED_TASK_TIME; rt_OneStep(); /*输入/输出接口放置位置*/ P1_0 = LED_Blink_Y.LED; } } /* Disable rt_OneStep() here */ /* Terminate model */ LED_Blink_terminate(); return 0;}

main函数中代码

第4步:编译Keil工程并运行代码

点击Keil编译按钮编译代码,然后将代码烧录到实际芯片中或使用Pretous仿真验证代码。到这里大家就完成了在51单片机上实现LED闪烁Simulink模型代码移植的例子,LED闪烁的频率实际由宏定义#define LED_TASK_TIME 500来控制,在8051单片机上运行该代码时LED将以500ms的周期翻转。

2、simulink生成模型代码剖析

关于8051单片机怎么搭建简单操作系统框架可以参考网络上其他文章或关注作者的后续文章,这里就不再赘述,如图14所示的LED闪烁模型,实际上就是运行模型生成的rt_OneStep()函数,每个Simulink生成的模型里面都会有这个函数,rt_OneStep()运行完之后所有通过输入端的数据都会在搭建的模型逻辑中处理,然后通过输出端输出处理完后的数据,在LED闪烁模型中,没有输入端,只有输出端,所以模型每运行完一次,里面的逻辑翻转一次输出端口LED状态,即LED_Blink_Y.LED的数据,然后只需将模型输出端口与实际物理端口关联即可,这里关联的是P1_0端口,则最终表现出来的效果就是P1_0状态,即模型每运行一次,P1_0端口电平发生一次翻转,P1_0端口有连接LED,LED就会一直闪烁。

图14 基于模型LED程序执行流程

下面再深入到rt_OneStep()函数详细了解下它到底在里面做了什么事情,是不是与前面所说的一致,rt_OneStep()函数详细内容,函数中的其它内容暂时不管,可以看到里面关键的一步,调用了LED_Blink_step()函数,具体代码如下所示:

void rt_OneStep(void){ static boolean_T OverrunFlag = false; /* Disable interrupts here */ /* Check for overrun */ if (OverrunFlag) { rtmSetErrorStatus(LED_Blink_M, "Overrun"); return; } OverrunFlag = true; /* Save FPU context here (if necessary) */ /* Re-enable timer or interrupt here */ /* Set model inputs here */ /* Step the model */ LED_Blink_step(); /* Get model outputs here */ /* Indicate task complete */ OverrunFlag = false; /* Disable interrupts here */ /* Restore FPU context here (if necessary) */ /* Enable interrupts here */}

然后再到LED_Blink_step()函数中查看具体内容,在主函数中调用的LED_Blink_Y.LED在该函数中可以找到具体的逻辑。至此,LED闪烁模型的整个代码分析完成。其它模型也可以采用类似的方式来分析,具体代码如下所示:

void LED_Blink_step(void){ boolean_T rtb_Delay; /* Delay: '<Root>/Delay' */ rtb_Delay = LED_Blink_DW.Delay_DSTATE[0]; /* Outport: '<Root>/LED' incorporates: * Delay: '<Root>/Delay' */ LED_Blink_Y.LED = LED_Blink_DW.Delay_DSTATE[0]; /* Update for Delay: '<Root>/Delay' incorporates: * Logic: '<Root>/Logical Operator' */ LED_Blink_DW.Delay_DSTATE[0] = LED_Blink_DW.Delay_DSTATE[1]; LED_Blink_DW.Delay_DSTATE[1] = !rtb_Delay;}

什么是单片机?单片机的原理你搞清楚了么?单片机都有哪些应用

单片机概述

单片机定义: 片半导体硅片集成:中央处理单元(CPU)、存储器(RAM、ROM)、并行I/O、串行I/O、定时器/计数器、中断系统、系统时钟电路及系统总线。用于测控领域的单片微型计算机,简称单片机。

单片机体积小、成本低,嵌入到工业控制单元、机器人、智能仪器仪表、汽车电子系统、武器系统、家用电器、办公自动化设备、金融电子系统、玩具、个人信息终端及通讯产品中。

单片机分类:

(1)通用型单片机就是其内部可开发的资源(如存储器、I/O等各种外围功能部件等)可以全部提供给用户。

用户根据需要,设计一个以通用单片机芯片为核心,再配以外围接口电路及其它外围设备,并编写相应的软件来满足各种不同需要的测控系统。通常所说的和本书介绍的是指通用型单片机。

(2)专用型单片机是专门针对某些产品的特定用途而制作的单片机。

30页内容详细介绍单片机(文末有获取)

1000G机械必备设计资料内容详情

这1000G资料涉及的范围很广,具体来说包括机械设计、机械原理、模具、机械加工、材料类、电气行业、各种零件模型和非标等等领域,具体内容有:上千份文档类(各类机械设计手册、液压类手册、自动化类手册等等,所有历史文章的PPT源文件等)、常用的设计工具(一些自动计算表格)以及各类视频教程类,我相信这1000G资料对于提升你的能力一定会有很大的帮助。同时在你工作中遇到相关问题的时候,这些资料也能提供很好的指导作用。

获取方式

相关问答

multisim14中 单片机 怎样写程序?

在Multisim14中编写单片机程序的步骤如下:1.打开Multisim14软件,选择“NewProject”选项,创建一个新的项目。2.选择“PlaceComponent”选项,从“N...

MCS-51 单片机 外部中断的触发方式如何设定和选择?

1、打开KeilμVision编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并添加STARTUP.A51文件,然后在当前目录下新建一个C...

为什么自己设计不出来 单片机 程序?该怎么做?

设计编写单片机程序是一个渐进的过程不可一蹴而就,毕竟单片机程序是与硬件有密切关系的,我们一般称为单片机程序叫底层硬件驱动程序。编写程序不但要对软件要熟...

新专长报考项目有哪些?

民乐、声乐、舞蹈、管乐、合唱、绘画、书法、美术、器乐等。机器人、无线电测向、天文、DM/DI、科技创新、单片机、模型、计算机编程、信息学奥赛等民乐、声...

52 单片机 中的RC是什么意思?

RC:一、英文remotecontrol的缩写,意味远程控制,即遥控,也指遥控模型。二、英文resistanceandcapacitancecircuit的缩写是指电阻电容串并联组成...

欧姆龙cp1h定时器的使用?

1.打开编译器,新建一个工程,然后保存在硬盘上的位置,然后选择Atmel-AT89C51单片机为模型,并添加STARTUP.A51文件,然后在当前目录下新建一个C文件,并将其添...

3学 单片机 有前途吗?

3学单片机有前途啊电子技术员2000~4000电子工程师3000~8000单片机嵌入式开发5000+提成什么都会8000+提成什么都不会老板,年收入过百万楼猪努力。。。因为你...

物联网如何打造智慧城市?

收集:全市的智能传感器可以实时收集数据。分析:对智能传感器收集的数据进行评估,以得出有意义的见解。交流:通过强大的交流网络,与决策者交流在分析阶段发...

proteus仿真 AT89C51 P2口接8个开关,P0口接8个led灯 p2开关口...

你的LED有没选错模型?要用LED-RED等后面带颜色的才会亮。你能确定你的程序没...将八个按钮与P2端子相连,并使用Wire&Cable工具绘制线路至单片机输入端;同样...

俄罗斯“海鹰-10”无人机性能如何?

“海鹰-10”无人机的发动机是日本齐藤公司的小型汽油发动机,这种发动机广泛的应用于航空模型上。卫星定位设备来自于瑞士U-blox公司,控制系统的单片机是中国晶...

猜你喜欢