导读:辽宁工业大学万得电车队成立于2014年11月,是由锦州万得汽车集团有限公司冠名赞助的车队,队员由汽车、机械、电气、电信、艺设、文传、经管等多个学院的本科生及研究生组建而成,每个赛季培养学生50余人。万得电车队2014年成立至今,国内外8场比赛3次亚军,1次季军,获20余个奖杯车队,万得电车队秉承砺器悟道的校训,以感恩、尊重、创新、创造为建队理念,致力于自主研发制造一辆性能优越的电动方程式赛车并驰骋于大学生方程式大赛赛场。
2021年2月7日20时,2021大学生方程式赛车技术交流月第十二期公开课《基于STM32处理器电动赛车VCU设计入门》,将由辽宁工业大学万得电车队电气组负责人闫丰雨主讲。(点击下图可回看)
以下是正文:
整车控制器作为整车设计中最重要的部分,整车程序设计更是其中的重要环节。在传统开发方式中,人工手写代码需要花费很长一段时间。所以目前大部分公司都采用基于模型的开发方式,使用模型直接生成控制器控制程序。相比于手写代码,通过模型生成代码的方式可以为我们缩短开发周期,提升程序更新的速度。
使用到的软件:MATLAB 2020b、STM32cube MX、Keil
一、MBD加速整车控制器程序开发
基于模型开发(Model-Based Design)简称MBD,在正常控制器程序开发过程中主要可以分为四个部分来保证程序开发的稳定性,并且加速控制程序开发。
(1)前期的需求分析与设计规范制定
在基于模型的开发流程中,需要对产品进行需求分析,并且根据需求建立需求文档或技术规范。以保证后续开发过程中各个设计环节都遵循我们前期制定好的规范和需求进行设计。这样的设计方法可以保证程序设计方向不会偏离最初的期望目标。
(2)需求与模型的跟踪链接
系统和模型可以之间可以建立一个双向链接,开发过程中可以根据需求链接到模型,同时也可以从模型链接到我们最初的需求。可以保证在设计的各个阶段都可以查验该设计是否满足设计需求,在模型开发初期进行需求追踪和测试,便于设计者尽早发现设计缺陷。
(3)代码自动生成
我们使用simulink/stateflow等搭建好系统模型后,可以使用Embedded Coder完成代码自动生成,这个工具可以帮助我们完成控制器控制程序代码自动生成工作,方便快捷,节省开发周期的同时还会帮助我们避免手写代码时人为产生的错误。
(4)测试和验证
基于模型开发另一个优势就是我们可以使用仿真的方式来对我们的设计进行各个阶段的验证,并且这个验证过程是可以反复进行的,确保开发的程序可以满足我们设计需求,并且尽可能早的发现设计缺陷或问题,减少解决问题的时间和成本。
二、基于STM32处理器VCU程序设计工具链配置
基于STM32处理器我们设计了一款整车控制器,该方案主要有以下几个方面的优势:
(1)相比于市面上的成品控制器,自己设计的控制器更能满足我们赛车的设计需求,不会出现接口数量不足或冗余的情况。
(2)该控制器可以使用MATLAB进行程序开发与验证,相当于一款自行设计的快速原型控制器,满足使用基于模型开发的流程。
接下来通过实现一个简单的小灯闪烁控制程序设计,来帮助大家了解怎样完成工具链的配置与这些工具如何使用。
首先我们打开控制器硬件设计原理图,通过硬件设计来配置好我们的软件,由下图可以看到我们使用的芯片为STM32F405ZGT6这款芯片,小灯的控制引脚分别为PC6和PC7两个引脚。
1、控制器的初始化设置
接下来我们在STM32cube MX中进行控制器的初始化配置,1新建工程 → 2选择芯片型号→ 3双击查询结果打开芯片配置界面。
图2-新建工程
图3-引脚功能设置
设置引脚输出模式:1单击GPIO打开设置界面 → 2单击PC6设置引脚 → 3设置引脚初始电平为低电平 → 4设置引脚输出方式为推挽输出(OUTPUT PUSH PULL)
图4-输出方式配置
选择编译IDE保存工程:1设置工程名称 → 2选择工程存储路径 → 3选择编译器IDE
2、基于Matlab程序设计过程
以上步骤我们就完成了控制器引脚的初始化并将初始化信息保存在了.ioc文件中,接下来我们在MATLAB中使用simulink与stateflow进行程序设计。
打开MATLAB新建simulink模型,设置工作路径为.ioc文件的根目录。
打开参数配置界面,完成simulink模型的参数配置:1选择MODELING → 2单击MODEL SETTING。
选择TLC文件:1单击Code Generation → 2打开tlc文件列表 → 3选择STM32.tlc
使simulink与STM32cube MX建立链接:1单击STM32 Options → 2勾选STM32CubeMX Path update,勾选后系统会自动索引到STM32Cube MX的安装路径,并与simulink建立链接。
选择MCU配置模块,完成MCU在simulink下的设置:打开模型库,1选择Target Support Package - STM32 Adapter → 2单击MCU CONFIG → 3选择STM32_config模型
加载.ioc文件,1双击STM32_config → 2单击select STM32 configuration file → 3选择demo.ioc
然后选择GPIO_Write控制模块进行小灯控制程序设计:1选择GPIO_Write → 2勾选控制引脚
接下来使用stateflow模块完成小灯闪烁控制程序的设计,在chart模块中设置A和B两个状态,状态A为LED3亮、LED4灭,状态B为LED3灭、LED4亮。两个状态之间的切换条件为1s后自动跳转。
最后完成了整个小灯闪烁控制程序的模型设计部分
3、控制模型转化设置
接下来要将控制模型转化成C代码以及keil工程,1我们在模型界面使用键盘Ctrl D运行模型,运行通过后 → 2 Ctrl B完成代码自动生成。下图为simulink界面生成的代码
在生成C代码的同时,STM32.TLC还帮助我们生成了keil工程,我们使用keil打开程序,程序编译与下载:1单击rebuild完成编译 → 2单击download完成程序下载
以上就是使用simulink完成STM32控制器控制程序编写的全部步骤。
三、stateflow在控制程序设计中的应用
stateflow逻辑状态机可以嵌入到simulink中使用,从小灯闪烁控制实验中我们可以看出,stateflow可以将我们的逻辑以图形化的方式清晰表示出来,并且支持代码生成。在我们编写控制程序时复杂的逻辑往往会增加我们控制程序编写的难度,有了stateflow我们可以清晰的看出各个逻辑状态之间的切换关系,这可以大大简化控制器的复杂逻辑程序设计,并且清晰的表达逻辑之后,也方便了我们后期的程序维护。
简单的statefllow状态图主要包括状态、状态转移和转移标签。
(1)状态
以小灯闪烁控制状态机为例,状态A和状态B为两个不同的状态,在状态机内部标有en状态动作关键字状态动作关键字有三种,分别为entry、exit、During。
entry代表当状态被激活时执行下列动作;
exit代表当状态关闭或退出时执行下列动作;
During代表当状态保持活动状态时执行下列动作;
我们可以看到状态A上标有箭头符号,其作用是将状态A设置为初始状态,也就是模型执行过程中,进入chart模块时会首先执行状态A中的程序。
(2)状态转移
状态A与状态B之间的箭头连线就是stateflow中的状态转移,状态转移是规定了方向的,箭头方向就是状态转移的方向。
(3)转移标签
转移标签主要由四个标签组成,分别为event、[condition]、{Condition Actions}/Transition Actions。
四、我的公开课
基于模型设计可以帮助我们加速控制程序开发,保证控制程序的稳定性。所以为了让赛车控制程序可以使用这种开发方式,我们使用STM32芯片设计了一款快速原型控制器,使用Simulink完成控制程序设计以及代码生成。这些工具帮助我们缩短了设计周期,提高了我们控制设计的稳定性。
受仿真秀平台邀请,2月7日,笔者将在2021大学生方程式赛车技术交流月第(十二)期公开课《基于STM32处理器电动赛车VCU设计入门》,与大学生方程式参与者和兴趣爱好者一起聊一聊基于模型开发那些事。(点击文尾的阅读原文可永久反复观看)。