Simulink 自动代码生成电机控制:基于Keil软件集成

article/2025/11/10 6:34:37

目录

系统软件架构

1.应用层全模型生成,底层手写代码

2.应用层模型生成,底层也是基于模型生成

3.Autosar

软件集成操作

接口配置

总结


系统软件架构

嵌入式软件开发包含应用层和底层,目前基于模型的开发软件架构总结为以下几种:

1.应用层全模型生成,底层手写代码

这种方法比较灵活,底层代码可以找芯片厂的Demo程序,也可以自己开发,通信协议可以集成也可以自定义,个人比较喜欢这种,切换芯片平台容易,可移植性强

2.应用层模型生成,底层也是基于模型生成

芯片厂家或者自己开发芯片底层的模型,通过Simulink直接生成可执行文件,elf或者hex,这个模型和底层关联性强,工具链关联性强,需要芯片厂家有相应的MBD tool box等一系列工具,优点是使用工具少,缺点是调试麻烦且对工具链依赖太高,比较灵活的外设使用无法满足需求,比如电源类开发,或者单电阻之类对底层需要很灵活的配置底层,这部分免不了手写代码。通信协议芯片厂家提供,当然也可以自己写,再通过Simulink进行模型化的集成,比较麻烦。

3.Autosar

Autosar是一个分工明确的架构,应用层可以通过Simulink生成带RTE结构的代码和Autosar底层代码相结合,底层代码可以通过专业工具配置MCU外设,比较灵活的发波中断等时序要求比较高的操作需要手写代码配合像CDD,像通信协议标定协议需要CCP或者XCP等其他类通信协议需要集成或者手写。这种方法汽车电子上应用较多,优点模块化集成,多人合作,V流程开发,符合一定的标准。缺点,成本很高,一个人只能做某一个部分,如底层,AutosarOS等,通信协议集成,应用层都需要不同的人来负责,工具使用多,低成本开发不适合,能运行Autosar架构的芯片少,局限于汽车电子应用。

Autosar架构代码可以参考:

Simulink代码生成:Autosar模型及代码生成_卡洛斯伊的博客-CSDN博客_simulink生成autosar代码

关于STM32代码生成 ,这里采用,应用层全模型生成,底层手写代码,模型方便移植到各种平台

软件集成操作

这里以Keil为例进行软件集成操作

操作步骤如下:

1. STM32通过CubeMX生成部分底层代码,如UART,ADC采样,中心对齐PWM,HALL中断和通道,IO口等。配置好后直接生成Keil的Project。如下图,除了Simulink_Model外,其他的都是CubeMX生成的底层项目文件和文件夹,之所以把Simulink_Model放在这个目录里,方便每次更改模型后生成代码可以直接编译,不需要手动复制粘贴。

 2.用Keil打开Project, 在MDK-ARM文件夹中

 生成代码的文件夹,用到的只有.c和.h

 3.Keil添加代码

添加.c文件,操作如下点1,弹出如下窗口,点2创建项目文件夹,如3是创建好的文件夹,点4找到Simulink生成代码的文件夹里除了ert_main.c外的所有.c,可以看到4窗口里都是simulink生成的.c.

 

 得到如下的目录,这时候还不能编译,还需要添加.h文件

 添加.h文件夹

 

 点上图的3,弹出如下窗口,这里点1创建一个文件夹,路径是Simulink生成代码的文件夹

 

 接口配置

Keil配置好后,还需要把底层代码接口和应用层代码的接口进行一一对应

1.电流采样,这里的运放增益是5, 参考电压是1.65V ,差分输入。采样电阻0.01R,ADC是12bit。

计算如下:

\frac{I\ast 0.01*5+1.65}{3.3}=\frac{ADC}{4096}

 把计算简化方便MCU计算,最后乘上一个常数即可。其他电压采样,温度采样根据实际硬件电路参数进行计算就好了

	Ia_A=((float)HAL_ADCEx_InjectedGetValue(&hadc1,1)-2043.0f)*0.01611328125f;Ib_A=((float)HAL_ADCEx_InjectedGetValue(&hadc1,2)-2043.0f)*0.01611328125f;Ic_A=((float)HAL_ADCEx_InjectedGetValue(&hadc1,3)-2043.0f)*0.01611328125f;

 计算出电流后,把电流值传递到simulink生成的代码变量接口

	rtU.Phase_CurrentABC[0] = Ia_A;rtU.Phase_CurrentABC[1] = Ib_A;rtU.Phase_CurrentABC[2] = Ic_A;rtU.Bus_Voltage=Bus_volt_V;//24

 在调用接口时,需包含Simlink相应的头文件

 

 2.PWM输出接口

 完成以上操作,软件的集成工作基本完成,更多的接口重复操作即可

总结

Simulink生成代码基于Keil的集成操作比较简单,其他的集成开发环境操作类似,把.c和.h配置好,接口配置好就好了。

关于通信协议有VOFA+

STM32 VOFA+串口调试助手提升电机控制调试效率(下位机代码和上位机操作演示)_卡洛斯伊的博客-CSDN博客_stm32 串口助手

Simulink 显示波形

Simulink串口调试助手的使用----显示电机运行的波形_卡洛斯伊的博客-CSDN博客_串口调试助手显示波形

Keil Array Visualization 显示波形

Keil调试显示波形方法_卡洛斯伊的博客-CSDN博客_keil看波形


http://chatgpt.dhexx.cn/article/eoDjN2UH.shtml

相关文章

mybatis自动生成代码

mybatis自动生成代码有三种方式&#xff1a;命令行、eclipse插件、maven插件。在这里主要介绍比较方便使用的一种方式–maven插件&#xff0c;它可以在eclipse、idea中通用。 在pom.xml文件中配置mybatis-generator插件&#xff1a; <plugin><groupId>org.mybatis…

idea自动生成代码

idea是完全可以自动生成一些基础代码&#xff0c;后续只需要根据生成的基础代码进行业务代码的编写&#xff0c;看看是如何生成的&#xff0c;教程比较全面&#xff0c;请耐心阅读&#xff0c;谢谢啦&#xff01; 1.首先检查自己的idea是否安装了自动生成代码的插件&#xff0…

Matlab/Simulink 自动代码生成详细步骤

最近一直在忙于FCU控制器的模型搭建&#xff0c;空闲之余也想分享一下自己对Simulink建模过程中的一些想法&#xff0c;从接触simulink到应用simulink大约已经两年多了&#xff0c;随着接触时间&#xff0c;慢慢发现simulink在模型搭建方面真的是非常的方面。今天我就和大家分享…

MybatisGenerator自动代码生成器的使用

之前有写过一篇文章通过RuoYi自动生成SpringBoot项目代码&#xff0c;这篇文章有介绍如何通过RuoYi框架来自动生成相关的SpringBoot代码。但并不是所有的小伙伴都会去下载RuoYi这一套框架代码去获取domain、mapper以及mapping&#xff0c;特此本人再推荐一款很实用并且也容易上…

Simulink自动代码生成(一)

一个simulink模型能够生成代码首先要满足的条件&#xff1a; 1&#xff1a;确保模型仿真的正确性2&#xff1a;将需要的输入和输出改成input和output模块3&#xff1a;离散化模型&#xff0c;设置求解器为离散&#xff0c;固定步长满足上面条件后&#xff0c;接下来怎么生成嵌入…

代码一键自动生成,拿走不谢

程序猿学社的GitHub&#xff0c;欢迎Star github技术专题 本文已记录到github 文章目录 前言起源环境实战sql脚本pom.xmlapplication.yml启动类代码自动生成controller类 测试 前言 隔壁老王&#xff1a; 社长&#xff0c;我工作有一段时间咯&#xff0c;我看其他的同事&#x…

4个免费代码自动生成神器

4个免费代码自动生成神器 日常写代码&#xff0c;是一件非常需要耐心的事情&#xff0c;尤其是那些没有技术含量重复使用到的一些代码排列组合&#xff0c;比如前端的一些html和css布局&#xff0c;简单繁杂&#xff0c;这个时候就会使用到一些免费代码自动生成神器&#xff0c…

java自动代码生成

1.概述 可在线自动生成代码&#xff0c;省去复制、修改通用模板代码的繁琐过程&#xff0c;减少团队70%以上的开发工作量 基于java的template模板引擎velocity&#xff0c;在定义好模板文件后&#xff0c;动态产生适应业务的java、xml、html、sql等代码文件 2.自动生成过程 …

Linux防火墙关闭方法

Linux防火墙关闭方法 关闭防火墙&#xff1a; 1、查看状态&#xff1a;systemctl status firewalld 2、关闭&#xff1a; systemctl stop firewalld&#xff08;只执行这个&#xff0c;重启后不行&#xff0c;还必须执行systemctl status firewalld&#xff09; 1.1、查看seli…

Linux中的Java项目服务器无故关闭

部署在Linux中的项目&#xff0c;最近一直无故关闭。找了很多都找不到原因。最近发现一个现象终于让我知道是什么原因导致我的开发服务器无故关闭了。 起因 部署在linux中的java开发服务器最近一直无故关闭。且是因为我在启动脚本中加了如下命令导致的。 tail -f log/game.lo…

Linux 系统下关闭防火墙

一、重启后永久性生效&#xff1a; 开启&#xff1a; chkconfig iptables on 关闭&#xff1a; chkconfig iptables off 二、即时生效&#xff0c;重启后失效&#xff1a; 开启&#xff1a; service iptables start 关闭&#xff1a; service iptables stop 需要说明的…

linux 桌面关闭防火墙,linux如何关闭防火墙的方法

火墙是一项协助确保信息安全的设备&#xff0c;会依照特定的规则&#xff0c;允许或是限制传输的数据通过。简单的来说防火墙的作用就是保护你的网络免受非法用户的侵入&#xff0c;虽然防火墙是为了你网络安全而存在&#xff0c;但是同时也限制了你上网操作&#xff0c;有很多…

LINUX系统下关闭防火墙

所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法&#xff0c;它是一种计算机硬件和软件的结合&#xff0c;使Internet与Intranet之间建立起一个安全网关。 一、重启后永久性生…

JAVA配置防火墙开放、关闭端口

要达成的目的可以描述为&#xff1a; 在JAVA程序中随机生成一个可用的端口&#xff0c;并在防火墙中开放这个端口。 随机生成可用端口 /*** 随机获取10100-10200的未占用端口** return 端口号*/private int generateLocalPort() {while (true) {int port 10100 (new Random(…

Linux系统关闭防火墙命令

Linux系统关闭防火墙命令 下面是red hat/CentOs7关闭防火墙的命令! 1:查看防火状态 systemctl status firewalld service iptables status 2:暂时关闭防火墙 systemctl stop firewalld service iptables stop 3:永久关闭防火墙 systemctl disable firewalld chkconfi…

Linux下的关闭防火墙

一、临时关闭防火墙 1、 查看防火墙的状态 /etc/init.d/iptables status 2、 临时关闭防火墙 /etc/init.d/iptables stop 3、 查看关闭后的状态 二、永久关闭防火墙 命令&#xff1a;chkconfig --level 2345 iptables off 或者 chkconfig iptables off 其中2345 代表”执…

Linux关闭防火墙命令

一、下面是red hat/CentOs7关闭防火墙的命令! 1:查看防火状态 systemctl status firewalld service iptables status 2:暂时关闭防火墙 systemctl stop firewalld service iptables stop 3:永久关闭防火墙 systemctl disable firewalld chkconfig iptables off 4:重…

原生js 实现图片轮播(图片按钮+左右轮播)

该代码可以实现左右箭头点击切换,按钮点击切换,自动播放方面还需改进 点击切换方面算是实现了效果,自我感觉还需要改进,代码仅供参考 html部分 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>…

JS——【案例】图片轮播图(自动轮播/手动点击/悬停显示)[技术栈:html、css、JavaScript]

1、效果&#xff1a; 2、需求&#xff1a; 3、代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

如何用JS实现轮播图!

轮播图 1.思路与写法 1.1 首先我们拿到一个关于轮播图的实例我们要分析里面的功能&#xff0c;将其模块化处理&#xff1b; 1.2 首先需要实现的是自动轮播的效果&#xff1a; 1.2.1需要用到运动函数框架&#xff0c;startMove()&#xff0c;还需要用到定时器&#xff0c;这里…