码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Simulink 自动代码生成电机控制:基于Keil软件集成


    目录

    系统软件架构

    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计算,最后乘上一个常数即可。其他电压采样,温度采样根据实际硬件电路参数进行计算就好了

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

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

    1. rtU.Phase_CurrentABC[0] = Ia_A;
    2. rtU.Phase_CurrentABC[1] = Ib_A;
    3. rtU.Phase_CurrentABC[2] = Ic_A;
    4. 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看波形

  • 相关阅读:
    常用应届生Java开发笔试面试题(更新中)
    Mysql和Redis如何保证数据一致性
    Spring循环依赖
    个人收入理财App的设计与实现
    springboot+微信小程序基于微信小程序的高校学生疫情在校封闭管理系统毕业设计源码240904
    Python 零基础入门的第一天——开发环境的搭建
    Servlet | ServletConfig接口、ServletContext接口详解
    STM32单片机驱动L298N
    使用c#强大的表达式树实现对象的深克隆之解决循环引用的问题
    动态规划:01背包(Dynamic Programming)
  • 原文地址:https://blog.csdn.net/weixin_42665184/article/details/127374885
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号