【STM32-MBD】(12)Simulink 模型开发之ADC

STM32-MBD(1)Matlab2022/2023 安装 STM32 硬件支持包
STM32-MBD(1b)Matlab2025b 安装 STM32 硬件支持包
STM32-MBD(2)Simulink 模型部署入门:点灯
STM32-MBD(11)Simulink 模型开发之定时器
STM32-MBD(12)Simulink 模型开发之ADC

    • [1. 项目简介](#1. 项目简介)
      • [1.1 项目内容](#1.1 项目内容)
      • [1.2 软硬件条件](#1.2 软硬件条件)
    • [2. 用 STM32CubeMX 创建工程](#2. 用 STM32CubeMX 创建工程)
      • [2.1 基础配置](#2.1 基础配置)
      • [2.2 ADC 配置](#2.2 ADC 配置)
      • [2.3 项目配置](#2.3 项目配置)
    • [3. Simulink 仿真模型](#3. Simulink 仿真模型)
      • [3.1 创建仿真模型](#3.1 创建仿真模型)
      • [3.2 关联 Simulink 模型与 CubeMX 工程](#3.2 关联 Simulink 模型与 CubeMX 工程)
    • [4. STM32 代码生成与运行](#4. STM32 代码生成与运行)
      • [4.1 从 Simulink 模型生成 STM32 代码](#4.1 从 Simulink 模型生成 STM32 代码)
      • [4.1 Simulink 在线监控](#4.1 Simulink 在线监控)

在基于 Model-Based Design(MBD) 的 STM32 开发流程中,ADC(模数转换器) 是连接物理世界与数字系统的第一道入口。

无论是电压、电流、温度,还是电位器、传感器信号,最终都需要通过 ADC 转换为可处理的数字量。

本文完成一个最小但完整的 ADC 单通道采样实验:

  • 使用 Simulink 读取 Nucleo STM32 开发板上的旋钮(电位器)电压,
  • 生成 STM32 工程代码并在开发板上运行。

1. 项目简介

1.1 项目内容

本文以 STM32G431 为目标平台,介绍如何使用 Simulink 构建 ADC 单通道采样模型,并生成代码部署到 STM32 开发板运行。

本实验的目标是:

  • 使用 STM32 ADC 单通道采样;
  • 采集 Nucleo 开发板板载旋钮(电位器) 对应的模拟电压;
  • 在 Simulink 模型中直接调用 ADC 模块;
  • 完成代码生成、下载并在开发板上稳定运行。

1.2 软硬件条件

关于所需的软硬件条件和安装过程,详见 【STM32-MBD】(1)安装 Simulink STM32 硬件支持包

强烈建议安装相关软件时使用推荐版本。

请严格按照文中介绍的步骤安装和配置软件。

必需的硬件:

  • STM32 开发板(如:NUCLEO-G431RB 开发板,也可以选择其它 STM32 开发板,但需要安装对应的固件包)。
  • Micro-micro USB 数据线,或 USB Type-A 至 Micro-B 连接线缆,用于将STM32 Nucleo 板连接到 PC。

必需的软件:

  • STM32 开发工具(建议首先严格使用推荐版本跑通本文项目)

    • STM32CubeMX (推荐使用 V6.4.0)
    • STM32CubeProgrammer (推荐使用 V2.6.0)
    • STM32CubeIDE(或 Keil,MDK-ARM 等 IDE 工具)
    • STM32Cube_FW_G4 固件包(推荐采用 V1.5.0)
      如果使用其它 STM32 MCU,则需选择对应的固件包。例如使用 STM32F4 时则要选择STM32Cube_FW_F4_V1.26.0 固件包。
  • MATLAB/Simulink(本文使用 MATLAB R2022b,可以采用更新版本)

    • Simulink Coder:从 Simulink 模型、Stateflow 图和 MATLAB 函数生成并执行 C 和 C++ 代码,用于实时和非实时应用,包括仿真加速、快速原型构建和硬件在环测试
    • STM32 嵌入式硬件支持包,Embedded Coder Support Package for STMicroelectronics STM32 Processors,STM32 处理器的嵌入式硬件支持包 youcans

2. 用 STM32CubeMX 创建工程

2.1 基础配置

本例直接使用 STM32CubeMX 创建新的 STM32 工程。也可以从 Simulink 创建 STM32CubeMX 工程。

  1. 打开 STM32CubeMX。

  2. 选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。

    选择 STM32G431RB 作为目标 MCU(参考开发板的 MCU 型号)新建 CubeMX 工程,将工程保存为 "STM32G431_ADC01.ioc"。

  3. 自动转入 CubeMX 的 Pinout Configuration 视图,进行管脚配置:

    (1)选择 "System Core -- SYS" 设置调试器类型,将 Debug 模式设为 "Serial Wire"。

    (2)选择 "System Core -- SYS" 设置基础时钟源,将 Timebase Source 设为 "TIM2"------非常重要!

    注意:Timebase Source 默认为 "SysTick",但在 STM32支持包中 "SysTick" 已经用作框架的基础时间功能,因此必须修改为 非"SysTick" 的其它定时器。否则在编译项目时会报错------非常重要!。

(3)选择 "System Core -- RCC" 配置时钟模式,设置高速晶振为外部时钟,将 High Speed Clock (HSE) 设为 "Crystal/Ceramic Resonator"。

(4)可选地,选择 "System Core -- GPIO" 配置 GPIO。

  • 搜索 PA5 管脚(在 NUCLEO 开发板中 连接LD2 灯),将其设置为 GPIO_Output。
  • 搜索 PC13 管脚(在 NUCLEO 开发板中 连接蓝色用户按键 User Button),将其设置为 GPIO_EXTI13。

(5)设置虚拟串口(LPUART)

如需要使用串口发送 ADC/DAC 数据到 PC 来显示波形:启用 LPUART1,模式设为 Asynchronous;波特率设置为 115200;引脚使用默认的 PA2(TX)/PA3(RX),连接到 Nucleo 板上的 ST-LINK 虚拟串口。

2.2 ADC 配置

板载旋钮(电位器)所连接的 ADC 引脚(如 PC2 → ADC1_IN8,具体以开发板原理图为准),

选取 ADC1 进行 ADC 配置, 将ADC1 IN8 配置为IN8 Single-ended , 然后右键选择PC2 管脚, 将其配置为 ADC1_IN8,此处管脚配置是为了后续将其作为旋钮的ADC进行使用。

  1. 启用并配置 ADC 通道
    (1)选择 "引脚配置(Pinout & Configuration)",从左侧下拉列表中选择 "Analog -- ADC1" ,使用 IN8(PC2) 作为模拟输入通道,将 IN8 设置为 "IN8 Singel-ended"。在 Pinout view 视图中,将 PC2 引脚配置为 "ADC1_IN8"。
    (2)开启独立通道 IN8,设置为 "IN1 Single-ended"。
    (3)配置 ADC 工作模式和参数。
bash 复制代码
ADCs_Common_Settings
   Mode: Independent mode
ADC_Settings
   Clock Prescaler: Asynchronous clock mode divided by 4
   Resolution: ADC 12-bit resolution
   Data Alignment: Right alignment(右对齐)
   Gain Compensation: 0
   Scan Conversion Mode:Disable
   End of Conversion Selection:End of single of conversion
   Continuous Conversion Mode: Disable
   DMA Continuous Requests: Disabled
Number of Conversion: 1  
Rank 1: 
   Channel: Channel 8
   Smapling Time: 24.5 Cycles
   Offset Number: No offset   

2.3 项目配置

  1. 在 Clock Configuration 视图进行时钟配置,如下图所示。
    本实验对于时钟时钟设置没有太多要求,只要设置正确即可。本例中使用外部 160MHz晶振,具体设置如下图所示,只供参考。

  2. 点击菜单栏 "Project Manager" 进入工程配置界面,如下图所示。
    (1)在 Project Name 输入项目名称 "STM32G431_ADC01"。
    (2)在 Toolchain/IDE 选择 IDE 工具为 "STM32CubeIDE"(也可以根据需要选择其它 IDE 工具 )。
    (3)在 "Project Manager" 继续向下拉,"在 MCU and Firmware Package" 栏中,取消选中 "Use latest available version",根据所安装的 G4 固件版本,选择 "STM32Cube FW_G4 V1.6.0";
    (4)如果固件包不是安装在默认路径,则要取消选中 "Use Default Firmware Location",通过 Browse 选择固件包的安装路径。

(5)在 Code Generator 中,勾选 "Generate peripheral initialization as a pair of '.c/.h' files per peripheral",让每个外设生成独立的'.c/.h'文件。

(6)在 Advanced Settings 中,**将 "Driver Selector" 全部设置为 "LL"(默认为 "HAL"),为外设选择低级 (LL) 驱动------非常重要!** 否则编译会报错。

(7)在 Advanced Settings 中,将 "Generated Function Calls" 的 "Visibility(Static)" 勾选项全部取消,对所有外设初始化函数调用取消选择可见性(静态)。

  1. 完成以上配置后,使用快捷键 "CTL+S" 或点击 File--Save Project,保存 CubeMX 项目文件。
    注意:在 STM32CubeMX 中配置完成后,不要点击 "GENERATE CODE" 生成代码,而是直接保存项目文件 "STM32G431_ADC01.ioc"。

3.1 创建仿真模型

在 CubeMX 项目文件所在的路径(例如:"D:\SimulinkProjects\STM32G431_ADC01")下新建 Simulink 仿真模型,注意 *仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在同一个目录下。

  1. 运行 MATLAB 软件,打开 Simulink。点击 "空白模型" 创建新的 Simulink 模型,保存到本项目路径下:STM32G431_ADC01.slx

  2. 在仿真模型中添加 ADC 模块。

(1)点击菜单栏的 "库浏览器" 打开库浏览器,展开 "Embedded Coder Support Package for STMicroelectronics STM32 Processors -- STM32G4xx Based Boards"。

(2)选择 "Analog to Digital Converter" 模块,将其拖动到右侧的模型。

(3)根据 CubeMX 项目中的配置,设置 "Analog to Digital Converter" 模块参数:

c 复制代码
ADC module: ADC1
Conversion group: Regular
Trigger mode: Trigger and read
Number of conversions: 1
  1. 在仿真模型中添加 Matlab Function 模块。
    (1)点击菜单栏的 "库浏览器" 打开库浏览器,展开 "Simulink - User-Defined Function"。
    (2)选择 "Matlab Function" 模块,将其拖动到右侧的仿真模型。
    (3)根据 STM32G431 数据手册中的公式,编写函数计算 电压值。
  1. 在 Simulink 菜单选择 "建模" - "模型设置" (也可以用 CTRL+E),打开"配置参数"对话框。
    左侧边栏中选择"求解器",如下图所示。
    (1)在右侧 "仿真时间" 设置为 "inf"。
    (2)在 "求解器选择" 选项设置类型为 "定步长","固定步长(基础采样时间)" 设为 "1e-3" (对应于 MCU 的 ADC 采样频率为 1KHz)。
    (3)可选地,在 "任务和采样周期选项"下勾选:"将每个离散速率视为单独任务"和"自动处理数据传输的速率转换"。

  2. 在右侧 "硬件实现(Hardware board settings)" 配置 "Target hardware resources" ,关联 STM32CubeMX 工程文件。
    (1)检查 PC 与 STM32G431 开发板连接正常。 在 "Hardware board" 选项的下拉框中选择 "STM32G4xx Based".
    注意:必须确保 PC 与 STM32G431 开发板连接正常,才能进行硬件配置。
    (2)点击 "Browse" 选择当前项目的目录,选择 CubeMX 创建的工程文件 "STM32G431_ADC01.ioc"。
    选择硬件在环通信串口。

  3. 完成搭建仿真模型,保存为文件 STM32G431_ADC01.slx。注意仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在相同的路径下。

4. STM32 代码生成与运行

  1. 用 USB连接线连接 PC 与 NUCLEO-G431RB 开发板。

  2. 在 Simulink 打开仿真模型 STM32G431_ADC01.slx。

  3. 在 "硬件(Hardware)" 窗口点击 "编译、部署和启动"(Ctrl+B 快捷键),就启动模型 STM32G431_ADC01 的编译过程,为模型生成代码,并加载到 NUCLEO-G431RB 开发板。

    模型编译过程的主要信息显示在 "诊断查看器" 中,编译摘要如下。

c 复制代码
=== 模型保存(STM32G431_ADC01) (已用时间: 0.109 秒) ===
    ### 正在启动 STM32G431_ADC01 的编译过程
    ### 正在为 '模型特定' 文件夹结构生成代码和工件
    ### 正在将代码生成到编译文件夹中: C:\MATLAB\MBD_STM32G431\STM32G431_ADC01\STM32G431_ADC01_ert_rtw
...
    ### 使用工具链: GNU Tools for ARM Embedded Processors
    ### 正在创建 'C:\MATLAB\MBD_STM32G431\STM32G431_ADC01\STM32G431_ADC01_ert_rtw\STM32G431_ADC01.mk'...
    ### 正在编译 'STM32G431_ADC01': "C:\MATLAB\R2023b\bin\win64\gmake"  -f STM32G431_ADC01.mk all
...
    Download verified successfully youcans@qq.com
    ### Successful completion of build procedure for: STM32G431_ADC01
    ### 'STM32G431_ADC01' 的 Simulink 缓存工件是在 'C:\MATLAB\MBD_STM32G431\STM32G431_ADC01\STM32G431_ADC01.slxc' 中创建的。
    编译过程已成功完成

编译的顶层模型目标:
    
    模型               操作           重新编译原因     
    =========================================
    STM32G431_ADC01  代码已生成并完成编译。  增量校验和已更改。  
    
    编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
    编译持续时间: 0h 0m 57s
    

目前的程序只是采集 电压,并没有进一步处理或显示,因此我们并不了解具体的运行情况。

  1. Simulink 外部模式配置:

    在 Simulink 菜单栏选择 "建模 - 模型设置" (也可以用 CTRL+E 唤出),打开"配置参数"对话框

    (1) 配置仿真输出:

    点击 "数据导入/导出",取消勾选 "单一仿真输出"。

    (2)配置串口连接:

    在 "硬件实现-Target hardware resources" 选择 "Connectivity",将 "USART/UART" 设为 "LPUART1",将 "Serial port" 设为 电脑上的 COM 端口。具体端口号可以查看电脑 "设备管理器" 中的 "端口(COM和LPT)"。

    点击 "确定" 保存上述配置。

  2. 设置要监测的信号。

    (1)用鼠标单击一根信号线,使信号线高亮。

    (2)点击鼠标右键唤出菜单条,选中 "记录所选信号(Log Selected Signals)",将该信号标记为监测信号。

    (3)在标记的信号线上会出现一个 小圆点发射 的图标,如下图所示。

    在 Monitor & Tune(外部模式) 下,MCU(STM32)在开发板上真实运行,Simulink 不会自动把所有信号传回 PC,只有被明确标记为 "记录(Log)" 的信号才会通过 XCP 从 MCU 上传到 PC。

  3. 基于 SDI 在线监控

    在外部模式下,控制算法运行在 STM32G431 的目标硬件上,模型时间来自目标端本地计时器,Simulink 主机不再控制仿真时间推进。在线监控与调节主要依赖 "数据检查器(Simulation Data Inspector, SDI),而非 Scope 模块。

    完成信号记录后,启动 "Hardware → 监控与调节(Monitor & Tune),即可打开 "数据检查器(SDI)" 对数据进行观察。

    (1)SDI 左侧显示 Run 列表(每次外部模式运行对应一个 Run)

    (2)展开当前 Run,勾选已记录的信号 Vraw、Vout。

    (3)勾选后,信号曲线会自动显示在右侧绘图区。

  4. 旋转板载旋钮,ADC 采样值随旋钮位置连续变化。

小结:

通过本实验,我们验证了 STM32-MBD 流程中 ADC 模块的可用性,成功采集并处理了板载旋钮的模拟电压。

(本节完)

版权声明:

youcans@qq.com 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/156387827)

Copyright@youcans 2025

Crated:2025-12

相关推荐
brave and determined2 小时前
传感器学习(day19):ToF传感技术:从测距到三维视觉革命
嵌入式硬件·学习·嵌入式系统·st·tof·嵌入式设计·flightsense
llilian_162 小时前
时间基准的行业赋能者——北斗卫星授时同步统一设备应用解析 时统 授时同步设备
服务器·网络·单片机
优信电子2 小时前
ESP32-S3开发环境搭建(arduino版本)
单片机·物联网·arduino
躺着要饭3 小时前
AD20 Components没有了,空了
嵌入式硬件
一路往蓝-Anbo4 小时前
C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网
松涛和鸣5 小时前
DAY42 SQLite3 : Dictionary Import and Data Query Implementation with C Language
linux·c语言·数据库·单片机·网络协议·sqlite
d111111111d5 小时前
STM32中USART和UART的区别是什么?
笔记·stm32·单片机·嵌入式硬件·学习
一路往蓝-Anbo6 小时前
C语言从句柄到对象 (三) —— 抛弃 Malloc:静态对象池与索引句柄的终极形态
c语言·开发语言·数据结构·stm32·单片机·算法
集芯微电科技有限公司6 小时前
PC1001超高频率(50HMZ)单通单低侧GaN FET驱动器支持正负相位配置
数据结构·人工智能·单片机·嵌入式硬件·神经网络·生成对抗网络·fpga开发