VCU模型开发流程

第一部分:单片机C底层代码开发

  • 需要一块你准备开发成VCU的单片机开发板,进行底层代码开发板验证,VCU常用的模块有PWM,GPIO,CAN,AD,DA,FLASH等,根据自己的需求进行C代码验证
  • 在验证的过程中要有意识进行抽象,你中期会将代码抽象成SFunction模块,例如GPIO输入就要设置分组、上下拉、引脚号,你在C代码中就要把这部分抽象成变量提前留好接口,需要留出什么需要自己想好
  • VCU模型开发流程_第1张图片

第二部分:MATLAB模块的建立

  • 首先打开simulink,选择建立一个空白library,然后界面添加几个子系统,如下所示,将其分门别类归纳好,让子系统显示成下图这样,主要在ICON设置
    在这里插入图片描述

  • 然后双击打开子系统,在里面添加sfunction,添加sfunction后会让你设置name和parameters,其中mex能获取的参数就是parameters提供的,name则是模块的名字
    VCU模型开发流程_第2张图片

  • 该外形主要是通过mask里的ICON进行配置的,模块相关东西全是通过MASK配置的VCU模型开发流程_第3张图片

  • 外形显示:ICON配置
    VCU模型开发流程_第4张图片

  • 参数设置:即下图这些参数,Port Name下拉都有什么等,通过parameters选项卡设置
    VCU模型开发流程_第5张图片VCU模型开发流程_第6张图片

  • 设置完这两部分,一个模块就有雏形了,其中Init选项卡可以进行参数校验,比如是否超范围,是否为空等等,但此时还无法生成代码,生成代码需要继续设置别的东西

模块代码生成

  • 这部分看源码,读文档,模块 mex和TLC这三个名字一定要相同
  • 代码生成主要有以下两部分,mex文件和tlc文件,mex文件是通过matlab提供的Sfunction C模板通过mex命令生成的,tlc文件其中的代码很大一部分就是你在第一步部分写的底层C代码
  • 在这里插入图片描述在这里插入图片描述
  • MEX文件的作用是将模块的参数和tlc文件链接起来,tlc文件是代码生成的关键文件,MEX文件将模块设置的GPIOB GPIO_PIN_0等参数传递给TLC,然后TLC生成GPIO_Init()和GPIO_Read()
  • C模板功能及API的官方解释,C模板下载地址,sfuntmpl_basic.c和 sfuntmpl_doc.c,建议这两个文件仔细看看,这部分还是建议找个人家没编译成mex的C文件比对着help看API功能,其中比较重要的有以下几个
    • mdlInitializeSizes 指定 中各种参数的大小SimStruct,例如块的输出端口数。
    • mdlInitializeSampleTimes 指定模块的采样时间。
    • mdlOutputs 计算块的输出。
    • mdlTerminate执行模拟结束时所需的任何操作。如果不需要任何操作,则可以将此函数实现为存根。
    • mdlRTW是提供给TLC的接口参数
    • 还有一个就是输出模块配置问题,比如标定 接datatype 再接PWM,期望是先标定再转换再输出,但有可能是先输出再标定再转换,即输入到输出滞后了一轮,输出模块加上ssSetInputPortDirectFeedThrough可以解决
      VCU模型开发流程_第7张图片
  • TLC文件:TLC文件介绍,其中最重要的有
    • %function Outputs(block, system) Output,生成的代码要放到while里,一般放执行代码,例如GPIO_Read
    • %function Start(block,system) Output,生成的代码要放到while之前,Start里面一般放Init相关代码,例如GPIO_Init
  • 其中S-function的Block parameters里面的parameters,是提供给mex文件的接口,
  • 你如果建好了一个模块,将其放入模型生成代码看看是否正确,多试试你就会比较理解了

模型配置

  • 模型设置里通用栏,注意这里是模型不是模块了,定步长,离散系统
    VCU模型开发流程_第8张图片
  • 代码生成栏,ert.tlc只是设置当前选项卡有什么选项等等VCU模型开发流程_第9张图片
  • 其中模型生成代码的整体逻辑(即main文件代码)主要是这里的tlc配置,如果你只是测试模块功能这里可以不用管在这里插入图片描述
  • 选项卡配置,我觉得讲的比较好chhttty的博客:博客1和博客2

标定量和观测量模块

  • 这两个模块稍微有些特殊,因为你可能需要把变量定义到sct划分的某个段
  • 例如标定量你可能需要设置成这种形式,__attribute__((section(***))) const volatile uint8_t calibr = 10;
  • 在TLC中配置不太现实,这就需要你自定义Storage Class,在标定量前加上__attribute__((section(***))) 这部分
  • 自定义Storage Class可以参考,chhttty大佬的博客,这个大佬所有的博客都很有借鉴意义,强烈推荐看看
  • 这两个模块基本可以总结为,模块设置好变量名,添加模块的时候调用脚本,在matlab工作空间生成一个Storage Class变量,然后再通过脚本与simulink里的变量进行关联,这样就可以生成带前缀的变量
  • 脚本放置位置VCU模型开发流程_第10张图片
  • 既然已经生成了标定量和观测量,就要准备生成ASAP2文件了,推荐大佬的博客,由于上一步已经做了Storage Class了,所以勾选ASAP2选项后就可以生成A2L文件了,但生成的A2L的文件是最基础的,无法直接给INCA使用,所以需要自定义A2L文件
  • 自定义A2L文件主要参考Mathworks的官方文档和小拜大佬的博客,我稍微说一说关键的函数
  • 首先是asap2userlib下的ASAP2UserFcnWriteHardwareInterface函数,这个主要是将A2L文件静态的头放进去,其次是ASAP2UserFcnWriteMeasurement,这个是跟观测量相关,需要修改的主要就是Interface,其余的基本不用动,多看看他写的注释
  • asap2scalar、asap2lookup2d、asap2lookup1d这三个文件,分别是标定量、一二维查表相关,也基本不用动
  • 最后要将自己的asap2\user添加到路径里,把官方的asap2\user文件夹优先级调低或者删除,就可以按照你的asap2\user文件夹下的内容生成A2L文件

一二维查表模块

  • 建议使用simulink的Subsystem封装一下simulink的Lookup模块,然后使用标定模块给Lookup模块XY轴输入和Table数据,主要靠M文件进行参数传递

模型自定义代码生产位置

  • 参考赞哥的博客,其中可以拷贝一份ert.tlc,然后重命名为test.tlc
  • 然后找到ert_make_rtw_hook.m也拷贝一份,重命名为test_make_rtw_hook.m
  • 然后在m文件里的before_make函数下执行mkdir和copyfile两个命令,进行创建文件夹和拷贝.c.h文件,这样就可以将文件放到指定位置了

模型使用

  • 模型参数需要修改:参考大佬模型配置
  1. Solver,右侧Type选为Fixed-step,Solver选为discrete,然后修改步长时间0.01或者0.001
  2. Code Generation,把System target file选为ert.tlc,生成C代码
  3. Code Generation,把Generate code only勾选
  4. Report,Create code generation report和Open report automatically建议勾选
  5. Templates,Generate an example main program勾选会生成ert_main,File customization template是配置main文件生成的逻辑,选择自己的tlc文件
  6. Interface,Remove error status field in real-time model data structure可以勾选
  7. VCU模型开发流程_第11张图片

结语

  • 此处借STM32的模块和文件进行讲解,这套流程适用于所有单片机,NXP,英飞凌等等,我已经成功实现了一种单片机
  • 效果:在这里插入图片描述VCU模型开发流程_第12张图片
    VCU模型开发流程_第13张图片
  • 如果改好最后的这个example这个tlc,就可以达到将固定几个文件粘贴到MDK工程里就直接编译下载,就能实现目标功能。
  • 最好有一套现成的这样就可以互相对比,改出自己的东西
  • 只是想试试simulink和单片机联调,我建议用STM32他们得工具链,cubemx搭配simulink确实好用,比自己开发的强多了,参考博客

你可能感兴趣的:(单片机,matlab,VCU)