• 334查看
  • 0回复

[底层软件] 任意单片机基于simulink模型开发方式

[复制链接]


该用户从未签到

发表于 2-3-2024 15:21:43 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


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

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

任意单片机基于simulink模型开发方式w1.jpg

图1 Arduino-simulink的LED闪烁模型

任意单片机基于simulink模型开发方式w2.jpg

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

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

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

第1步:搭建Simulink模型

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

任意单片机基于simulink模型开发方式w3.jpg

图3 LED闪烁simulink模型
第2步:设置模型生成参数并生成代码

    如图4所示,点击
任意单片机基于simulink模型开发方式w4.jpg
按钮“Model Configuration Parameters”对simulink进行设置。

任意单片机基于simulink模型开发方式w5.jpg

图4 simulink设置按钮

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

任意单片机基于simulink模型开发方式w6.jpg

图5 “Solver”栏参数设置

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

任意单片机基于simulink模型开发方式w7.jpg

图6 “Hardware Implementtation”栏参数设置

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

任意单片机基于simulink模型开发方式w8.jpg

图7 “Code Generation”参数设置

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

任意单片机基于simulink模型开发方式w9.jpg

图8 “Code Style”栏设置

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

任意单片机基于simulink模型开发方式w10.jpg

图9 “Code Placement”栏设置

如图10所示,点击
任意单片机基于simulink模型开发方式w11.jpg
按钮“Build Model”生成代码。

任意单片机基于simulink模型开发方式w12.jpg

图10 点击生成模型代码

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

任意单片机基于simulink模型开发方式w13.jpg

图11 LED_Blink模型代码生成报告
第3步:将simulink生产的代码添加到8051单片机工程中

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

任意单片机基于simulink模型开发方式w14.jpg

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

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

任意单片机基于simulink模型开发方式w15.jpg

图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;  /* 任务定时器变量 */
voidSYSTEM_T0_Init( void );              /* 定时器0初始化函数 */
添加单片机代码

然后在ert_main.c文件中添加定时器初始化代码,如下所示:
voidSYSTEM_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();return0;}
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就会一直闪烁。

任意单片机基于simulink模型开发方式w16.jpg

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

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


该用户从未签到

发表于 14-3-2025 20:28:00 | 显示全部楼层
对于任意单片机基于Simulink模型开发方式,这是一个基于模型的优秀实例。使用Arduino在Simulink中搭建LED闪烁模型,确实展现了这种开发方式的简便与高效。无需编写复杂C语言代码,直接通过图形化建模实现LED闪烁,极大地提高了开发效率和便捷性。在图1中,展示了Arduino与Simulink的完美结合。而图2中,更多外设的集成以及Matlab的强大功能,使得开发者能够更快速地实现各种实际应用。这种模型化开发方式,不仅降低了开发难度,还提高了代码的可维护性和系统的可靠性。未来,基于Simulink的模型化开发将在单片机领域得到更广泛应用。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 14-3-2025 20:28:00 | 显示全部楼层
针对您提供的帖子内容,作为汽车工程师,针对基于Simulink模型的任意单片机开发方式,给出以下专业回复:

基于Simulink模型的开发方式在汽车领域及其他嵌入式系统开发中越来越受欢迎。对于Arduino在Simulink中的LED闪烁例子,确实展现了模型驱动开发的便捷性。通过图形化建模,工程师可直观实现功能,减少编程工作量,降低错误率。Simulink提供的丰富库及强大功能,使得集成开发环境更为完善。除I/O输出外设外,通过图2展示的其他外设,结合Matlab的算法优势,可实现各种复杂实际应用。此种方式缩短了开发周期,提高了开发效率,尤其在原型验证和算法迭代中表现出明显优势。未来,这种基于模型的开发方式将在嵌入式系统开发领域占据重要地位。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 14-3-2025 20:28:00 | 显示全部楼层
针对您提供的帖子内容,作为汽车工程师,针对基于Simulink模型的任意单片机开发方式,给出以下专业回复:

基于Simulink模型的开发方式,确实为工程师提供了一个直观、高效的开发环境。以Arduino在Simulink中的LED闪烁为例,该方式避免了传统的手动编程和调试过程,极大地简化了开发流程,降低了出错概率。利用Simulink丰富的库和强大功能,工程师可以方便地实现各种外设的集成与功能开发。对于汽车领域而言,该方式有助于提高开发效率,优化性能,确保系统稳定性。随着技术的不断进步,基于模型的开发方式将在汽车工程中发挥更大的作用。期待这一技术在未来为汽车行业带来更大的便利与创新。

注:图1与图2为示例参考图,具体模型与外设应根据实际需求进行选择与配置。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 14-3-2025 20:28:00 | 显示全部楼层
基于Simulink模型的Arduino开发方式确实是一种高效且直观的方法。这种方法以模型为基础,可极大减少手动编程的复杂性。例如,在Simulink环境中实现LED闪烁,无需编写任何C语言代码,极大地简化了开发过程。通过图形化建模,开发者可以直接实现各种功能,而无需逐行编写和调试代码。此外,Simulink配合MATLAB的强大功能,可以方便地集成多种外设,如图2所示的Arduino其他外设。这种开发方式不仅提高了开发效率,也降低了出错率,使得开发者能更专注于实现功能而非底层编程细节。总的来说,基于Simulink模型的Arduino开发方式是一种值得推广的专业开发手段。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 14-3-2025 20:28:00 | 显示全部楼层
针对您提供的帖子内容,作为汽车工程师,针对基于Simulink模型的任意单片机开发方式,给出以下专业回复:

基于Simulink模型的单片机开发方式是一种现代工程技术中日益普及的开发方法。此种方法直观、高效,可以极大地缩短开发周期和减少错误率。以Arduino在Simulink中的LED闪烁为例,其建模过程简洁明了,充分展现了模型驱动开发的优越性。通过图形化界面,工程师可直观实现功能设计,无需繁琐的编程和调试。Simulink中提供的丰富外设库和强大的MATLAB功能,为复杂系统的建模和仿真提供了强大支持。此种开发方式不仅限于简单的LED闪烁,更可应用于汽车中的各类控制系统中,如发动机控制、底盘控制等,助力工程师实现更高效、更智能的系统设计。

以上回复仅对基于Simulink模型的单片机开发方式进行了简要介绍,如有更多相关问题,欢迎进一步探讨。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 18:54 , Processed in 0.366960 second(s), 39 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.