基于32单片机的16通道ADC的数据采集

2023-11-01

基于32单片机的16通道ADC的数据采集

这个部分的内容,是作为外部模拟量部分的采集工作,按照任务要求,所设计的方案,需要完成以下指标:

  • ADC必须能采集16通道的模拟量
  • ADC的分辨率是16bit
  • 采样率不小于20khz

由此分析可以得出,完成这个任务,对于H7系的MCU而言,性能 是绰绰有余的,可以保证上述指标的完美实现,但奈何手头的这个H7板子是借来的,所有只能花短暂的时间进行这个H7的ADC模块的调试。而长远考虑是要将数据的采集放在F4上来完成,所以这里提出了两种MCU类型的ADC多通道的数据采集方案的对比设计。

对于F4而言:

必须选择使用规则组的形式,进行多通道的模拟量采集,但是采集的精度只有12bit的分辨率,分辨率越高,则每个通道转换所需要的时间就越长。对于实验设计而言,需要先完成三个通道的数据正确采集后,再扩展更多通道的数据采集。即分为分辨率扩展和通道数目的扩展两个部分完成。

  • ADC 主要特性

    这是F4的芯片手册的介绍
    ● 可配置 12 位、10 位、8 位或 6 位分辨率
    ● 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
    ● 单次和连续转换模式
    ● 用于自动将通道 0 转换为通道“n”的扫描模式
    ● 数据对齐以保持内置数据一致性
    ● 可独立设置各通道采样时间
    ● 外部触发器选项,可为规则转换和注入转换配置极性
    ● 不连续采样模式
    ● 双重/三重模式(具有 2 个或更多 ADC 的器件提供)
    ● 双重/三重 ADC 模式下可配置的 DMA 数据存储
    ● 双重/三重交替模式下可配置的转换间延迟
    ● ADC 转换类型(参见数据手册)
    ● ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V
    ● ADC 输入范围:VREF- <VIN < VREF+
    ● 规则通道转换期间可产生 DMA 请求

通过阅读正点原子的开发教程和官方的芯片手册,按照任务指标的要求和自己开发的习惯上的考虑,我总结出了这些需要注意的问题:

  1. F4内置的ADC的多通道模拟量数据采集中规则组的通道数最多是16个
  2. 采集的分辨率最大是12bit
  3. ADC1和ADC2均可
  4. 触发方式是硬件边沿触发或者软件的逐次触发均可,用来启动ADC的转换
  5. 扫描模式适用于多通道,单通道禁用
  6. 连续转换,可以在启动ADC转换后,自动完成多次的数据采集
  7. 初始化时的规则序列的长度这个参数指的是规则组中的通道数
  8. ADC完成一组转换后,可以触发外部事件,形成中断等。
  9. ADC的最大工作频率是36MHz
  10. 单通道的数据转换时间是 Tconv= 采样时间 + 12个周期
  11. 12bit的分辨率,故转换后的数值是3.3/2^12=3.3/4096=0.0008056640625
  12. 此时钟来自于经可编程预分频器分频的 APB2 时钟
  13. 如果转换过程足够慢,则可使用软件来处理转换序列。在这种情况下,必须将 ADC_CR2 寄 存器中的 EOCS 位置 1,才能使 EOC 状态位在每次转换结束时置 1,而不仅是在序列结束 时置 1。当 EOCS = 1 时,会自动使能溢出检测。因此,每当转换结束时,EOC 都会置 1,并且可以读取ADC_DR 寄存器。溢出管理与使用 DMA 时的管理相同。
  14. 当转换的通道数目过多时,需要借助DMA来及时转移采集完成的数据,保证数据连续快速的采集。

F4中ADC引脚分布

对于H7而言:

也必须采用规则通道的形式进行模拟量的采集,它的分辨率支持16bit,规则组最多也只能是16通道。

  • ADC的特性
    • 高性能特性
      – 多达 2 个 ADC,可在双重模式下运行
      – 可配置 16 位、14 位、12 位、10 位或 8 位分辨率
      – ADC 转换时间与 AHB 总线时钟频率无关
      – 可通过降低分辨率来缩短转换时间
      – 可管理单端输入或差分输入(可按通道进行编程)
      – AHB 从总线接口,可实现快速数据处理
      – 自校准(偏移校准和线性度校准)
      – 可独立设置各通道采样时间
      – 多达四条注入通道(对常规通道或注入通道的模拟输入分配完全可配置)
      – 硬件辅助准备注入通道的上下文,从而实现快速上下文切换
      – 数据对齐以保持内置数据一致性
      – 数据可由 GP-DMA 管理,基于 FIFO 实现常规通道转换
      – 数据可连接到 DFSDM 进行后期处理
      – 4 个专用数据寄存器供注入通道使用
    • 可通过以下方式启动转换过程:
      – 通过软件启动常规转换和注入转换
      – 通过极性可配置的硬件触发器(内部定时器事件或 GPIO 输入事件)启动常规转换
      和注入转换
    • 转换模式
      – 每个 ADC 均可转换单条通道,也可扫描一系列通道
      – 单次模式会在每次触发时对选定的输入执行一次转换
      – 连续模式可连续转换选定的输入
      – 不连续采样模式

因为H7的性能是要高于F4的ADC的,所以在寄存器的初始化上也就要比F4要复杂一点;而且使用的是HAL库,开发上也要比最开始的标准库函数要更简洁和容易。现总结如下:

  1. 分辨率是16bit
  2. 每个ADC的20个通道中分为4个快速通道,16个慢速通道
  3. 分辨率不同对应的通道的转换时间不同

在这里插入图片描述

ADC的转换时序图:

经过查阅相关的数据手册,可以发现,对于多通道的数据采集,采用连续序列转换,转换效率会更高,而STM32又提供了硬件和软件两种触发方式,分别如下图所示:

在这里插入图片描述

在这里插入图片描述

针对这两种方式,需要仔细的品味其时序转换之间的关系,才能将ADC转换利用好,遂下面是详细的分析过程:

在这里插入图片描述

ADSTART和ADSTP是整个ADC运行过程中的使能使能信号,用来启动和停止ADC的运行;而EOC和EOS是转换指示信号,用来指示每个通道和每个序列转换是否完成;而ADC状态是当前ADC运行到哪一步了;最后是ADC_DR是数据寄存器,用来存放转换完成后的数据。

故通过软件使能ADC后,立刻开始转换,当EOC拉高后,证明当前的一个通道转换完成,可以借助软件启动第二次转换了。当EOS拉高后,说明当前的一个序列已经转换完成了。通过拉高ADSTP可以停止当前序列的转换,前提是必须等待到该序列的最后一个通道转换完成后,才可以拉高。

在这里插入图片描述

通过对比分析,可以发现和软件触发基本一致,只是多了一个TRGx信号,借助硬件边沿信号来启动ADC的转换。图中设置的是下降沿触发ADC。

首先借助软件初始化,使能ADC,即拉高ADCSTART信号,只有当ADSTP拉高时,才会失能ADC这个外设,停止一切通道的数据转换。EOC和EOS同上,用来指示当前通道和当前序列是否抓换完成。而在使能ADC后,只有TRGx的触发信号有效时,才会启动ADC序列的转换,转换完成后的数据被存储到 32 位 ADC_DR 寄存器中。故转换后,需要将数据及时的读出到缓存中,以防数据被覆盖。

在不使用 DMA 的情况下管理转换序列:
如果转换过程足够慢,则可使用软件来处理转换序列。在这种情况下,软件必须使用 EOC 标 志及其相关中断来处理各个数据。每当转换结束时,EOC 都会置 1,并且可以读取 ADCx_DR 寄存器。OVRMOD 应配置为 0,以便将溢出事件作为错误进行管理。

在使用 DMA 的情况下管理转换序列:

由于转换得出的通道值会存储到唯一的数据寄存器中,因此,对于多个通道的转换,使用DMA 非常有帮助。这样可以避免丢失在下一次写入之前还未被读出的 ADCx_DR 寄存器中 的数据。

使用DMA来完成转换后数据的传送和存储

使用 DMA 管理转换
由于转换得出的通道值会存储到唯一的数据寄存器中,因此,对于多个通道的转换,使用DMA 非常有帮助。这样可以避免丢失在下一次写入之前还未被读出的 ADCx_DR 寄存器中 的数据。
DMA 模式使能时(单 ADC 模式下 ADCx_CFGR 寄存器中的 DMNGT 位 = 01 或 11,或者 双重 ADC 模式下 MDMA 不为 0b00),会在每次通道转换后生成 DMA 请求。这样便可将转 换的数据从 ADCx_DR 寄存器传输到用软件选择的目标位置。
尽管如此,如果因 DMA 无法及时处理 DMA 传输请求而发生溢出 (OVR=1),ADC 会停止生 成 DMA 请求,新转换对应的数据不会通过 DMA 进行传输。这意味着可将传输到 RAM 的所 有数据都视为有效数据。
根据 OVRMOD 位的配置,可保留或覆盖数据。
DMA 传输请求会禁止,直至软件将 OVR 位清零。
根据应用用途的不同,推荐使用两种不同的 DMA 模式(在单 ADC 模式下,使用 ADCx_CFGR 寄存器中的 DMNGT 位配置;在双重 ADC 模式下,使用 ADCx_CCR 寄存器中的 DAMDF 位配置):
DMA 单次模式(DMNGT 位 = 01)。
如果通过编程将 DMA 设置为传输固定数目的数据,应选择此模式。
DMA 循环模式(DMNGT 位 = 11)
如果在循环模式下对 DMA 进行编程,应选择此模式。
DMA 单次模式 (DMNGT=01)
在该模式下,每次出现新的转换数据时,ADC 都会生成 DMA 传输请求,DMA 到达最后一 个 DMA 传输操作时(发生 DMA_EOT 中断,请参见 DMA 一段),即使转换已再次开始, ADC 也会停止生成 DMA 请求。
DMA 传输完成后(在 DMA 控制器中配置的所有传输操作均已完成后):
ADC 数据寄存器的内容会冻结。
~ 任何正在进行的转换都会中止,其部分结果会被丢弃。
~ 不会将任何新的 DMA 请求发送到 DMA 控制器。如果仍存在已开始的转换,这样可避
免生成溢出错误。
~ 扫描序列会停止并复位。
~ DMA 会停止。
DMA 循环模式 (DMNGT=11)
在该模式下,每次数据寄存器中出现新的转换数据时,ADC 都会生成 DMA 传输请求,即使 DMA 已到达最后一次 DMA 传输操作也不例外。这样可将处于循环模式的 DMA 配置为处理 连续的模拟输入数据流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于32单片机的16通道ADC的数据采集 的相关文章

  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 如何从cdev获取设备

    我正在编写一个内核模块 它将分配一些一致的内存并返回相应的虚拟和物理地址 我正在将模块注册为cdev 分配空间dma alloc coherent 我想使用 mmap 它dma common mmap dma common mmap 需要一
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 环形缓冲区和 DMA

    我试图了解从数据包到达网卡到目标应用程序收到数据包之间发生的所有事情 假设 缓冲区足够大 可以容纳整个数据包 我知道情况并非总是如此 但我不想介绍太多技术细节 一种选择是 1 Packet reaches the NIC 2 Interru
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • 如何注册快手引流号?快手引流账号应该注意什么?

    快手短视频的影响力越来越大 用户也是越来越多 一个流量聚焦的平台 通过用户分享自制的短视zhi频形式获取了大量粉丝 而且不屏蔽任何引流信息 可以说是非常开放 自由 快手在短时间内就拥有大量的用户数不得不说它的推广很到位 那么快手账号应该如何
  • 【题解】游戏 (2019.08.01纪中【NOIP提高组】模拟 B 组T1) DP 博弈论

    题目来源 中山纪念中学 题目描述 Alice和Bob在玩一个游戏 游戏是在一个N N的矩阵上进行的 每个格子上都有 一个正整数 当轮到Alice Bob时 他 她可以选择最后一列或最后一行 并将其删除 但 必须保证选择的这一行或这一列所有数
  • 使用Docker部署Node.js中的Vue项目

    1 准备工作 使用服务器 阿里云 服务器系统 CentOS 7 项目配置 准备好一个项目 该项目下有以下文件 对 package json 文件进行修改 设置项目启动的端口号和使用的ip 注 在修改package json文件中的host为
  • 图解 Java 垃圾回收机制,写得非常好!

    什么是自动垃圾回收 自动垃圾回收是一种在堆内存中找出哪些对象在被使用 还有哪些对象没被使用 并且将后者删掉的机制 所谓使用中的对象 已引用对象 指的是程序中有指针指向的对象 而未使用中的对象 未引用对象 则没有被任何指针给指向 因此占用的内
  • UnsatisfiedDependencyException: Error creating bean with name XXXController'

    在springboot中遇到了UnsatisfiedDependencyException Error creating bean with name XXXController 的问题 代码如下 controller public cla
  • 编辑器组件monaco

    1 配置代码编辑器子组件monaco js
  • 计算机网络篇-运输层

    运输层 运输层向上层应用层提供通信服务 运输层是端到端的通信 也就是说通信的两端是两个主机中的应用进程 运输层还有一个很重要的功能 分用 复用 运输层的两个主要协议 用户数据报协议UDP 不需要建立连接 传输控制协议TCP 提供面向连接的服
  • AngularJS自动化测试之karma+jasmine单元测试

    单元测试专门用于测试小型 独立的代码单元 单个函数 或者较小的功能 其主要难点在于划分小的功能块 本位主要介绍AngularJS的单元测试的环境搭建 Karma是一个基于Node js的JavaScript测试执行过程管理工具 Test R
  • C++实现【获取鼠标位置】以及控制鼠标【打开窗口并点击】

    获取鼠标位置的函数源代码来自 C 认知系列 实时获取鼠标坐标 c 获取鼠标坐标 Zalamp的博客 CSDN博客 鼠标点击操作代码来自 C 控制鼠标移动到指定位置并且左键点击 c 鼠标移动 蜚语77的博客 CSDN博客 在特定程序中实现鼠标
  • Python 合并同一文件夹下所有Excel_xlsx文件

    转载 How to Consolidate Multiple Excel Workbooks With Python 想要将同一文件夹下xlsx文件合并为一个文件 代码 代码来源 仅供学习 import pandas as pd impor
  • Windows域认证(Kerberos认证)图解

    图文经过梳理与绘制已较为详细 希望能帮助大家更清晰 直观地了解Kerberos的认证过程 相关名词 DC 域控制器 KDC 密钥分发中心 AD 账户数据库 AS 身份验证服务 TGS 票据发放服务 TGT 认证票据 Ticket 票据 Ma
  • VOS论文阅读:Fast Video Object Segmentation using the Global Context Module(2020 ECCV)

    Fast Video Object Segmentation using the Global Context Module 2020 ECCV Contribution Method Global Context Module Conte
  • redis 数据类型之字符串(string) 详细介绍

    字符串 string 键是Redis最基本的键值对类型 这种类型的键值对会在数据库中把单独的一个键和单独的一个值关联起来 被关联的键和值既可以是普通的文字数据 也可以是图片 视频 音频 压缩文件等更为复杂的二进制数据 图2 1展示了数据库视
  • openwrt 完美安装 tcpdump

    直接使用 opk install tcpdump 报下面的错 Collected errors check data file clashes Package libpcap1 wants to install file usr lib l
  • Makeflow用户手册 一

    Makeflow用户手册 概述 Makeflow是用于大规模分布式计算的工作流引擎 它接受要执行的大量工作的规范 并尽可能在远程计算机上并行运行 此外 Makeflow是容错的 因此您可以使用它来协调非常大的任务 这些任务可能在出现故障时运
  • (4)各个属性角色分析显示-4

    将折线图 数据集 散点图集合在一个html文件中 1 将折线图 数据集 散点图设置为函数a b c 2 再调用page add 函数 将三个图片组合在一起 3 运行page render x html 函数 将该页面命名 打开html文件
  • Java线程中处理运行时异常(UncaughtExceptionHandler)

    线程在执行单元中不允许抛出checked异常 而且线程运行在自己的上下文中 派生它的线程无法直接获得它运行中出现的异常信息 对此 Java为我们提供了UncaughtExceptionHandler接口 当线程在运行过程中出现异常时 会回调
  • ElasticSearch多字段查询best_fields、most_fields和cross_fields理解

    基于elasticsearch7 6 1 和 kibana7 6 1 本文通过案例进行讲解 希望读者耐心阅读 一 介绍 字段中心查询式 就是以字段为中心 代表就是 best fields和most fields 把所有的字段全都散列 然后从
  • 详解曼哈顿距离&欧式距离&切比雪夫距离

    详解曼哈顿 欧式距离 切比雪夫距离 曼哈顿距离 基本概念 出租车几何或曼哈顿距离 Manhattan Distance 是由十九世纪的赫尔曼 闵可夫斯基所创词汇 是种使用在几何度量空间的几何学用语 用以标明两个点在标准坐标系上的绝对轴距总和
  • 基于32单片机的16通道ADC的数据采集

    基于32单片机的16通道ADC的数据采集 这个部分的内容 是作为外部模拟量部分的采集工作 按照任务要求 所设计的方案 需要完成以下指标 ADC必须能采集16通道的模拟量 ADC的分辨率是16bit 采样率不小于20khz 由此分析可以得出