STMF1学习笔记(八)—DMA方式多通道采集

server/2024/10/15 20:16:08/

1、初始化

2、DMA设置

3、业务代码—DMA方式

一、

在 main 函数前面添加变量。其中 ADC_Value 作为转换数据缓存数组,ad1,ad2

PA0( 转换通道 0),PA1( 转换通道 1) 的电压值。
/* USER CODE BEGIN PV */
/* Private variables */
uint32_t ADC_Value[100];
uint8_t i;
uint32_t ad1,ad2;
/* USER CODE END PV */

二、

while(1) 前面以 DMA 方式开启 ADC 装换。 HAL_ADC_Start_DMA() 函数第二个参
数为数据存储起始地址,第三个参数为 DMA 传输数据的长度。
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 100);
/* USER CODE END 2 */
由于 DMA 采用了连续传输的模式, ADC 采集到的数据会不断传到到存储器中(此处
即为数组 ADC_Value )。 ADC 采集的数据从 ADC_Value[0] 一直存储到 ADC_Value[99] ,然
后采集到的数据又重新存储到 ADC_Value[0] ,一直到 ADC_Value[99] 。所以 ADC_Value
数组里面的数据会不断被刷新。这个过程中是通过 DMA 控制的,不需要 CPU 参与。我
们只需读取 ADC_Value 里面的数据即可得到 ADC 采集到的数据。其中 ADC_Value[0]
通道 0(PA0) 采集的数据, ADC_Value[1] 为通道 1(PA1) 采集的数据, ADC_Value[2] 为通
0 采集的数据,如此类推。数组偶数下标的数据为通道 0 采集数据,数组奇数下标的
数据为通道 1 采集数据。

三、

while(1) 循环中添加应用程序,将采集的数据装换为电压值并输出。

/* USER CODE BEGIN 3 */HAL_Delay(500);for (i = 0, ad1 = 0, ad2 = 0; i < 100;){ad1 += ADC_Value[i++];ad2 += ADC_Value[i++];}ad1 /= 50;ad2 /= 50;printf("\r\n********ADC-DMA-Example********\r\n");printf("[\tmain]info:AD1_value=%1.3fV\r\n", ad1 * 3.3f / 4096);printf("[\tmain]info:AD2_value=%1.3fV\r\n", ad2 * 3.3f / 4096);
程序中将数组偶数下标数据加起来求平均值,实现均值滤波的功能,再将数据装换为电
压值,即为 PA0 管脚的电压值。同理对数组奇数下标数据处理得到 PA1 管脚的电压值。
同时 ADC 采样也可以采用我之前描述的采用定时器对其平滑滤波!
         通常片上的 ADC 的精度往往达不到我们的要求,因为它的精度实在是太低了。有两
个替代方案:
1 SDADC, 这个是 STM32F373 上特有的功能, 16 位高速 ADC ,支持差分输入。掌
握难度较大。
2 ADS, 就是外置 ADC 能 做到 0.01mV 的精度!这类芯片只需要进行 SPI 通信操作,便可以获取 ADC 数据
参考: 【ADC-HAL库】DMA方式多通道采集_哔哩哔哩_bilibili

http://www.ppmy.cn/server/46041.html

相关文章

代码随想录训练营Day54:Leetcode392、115

Leetcode392&#xff1a; 问题描述&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"…

辅助科技照亮道路,携手共促盲文书写技能新飞跃

在这个科技日新月异的时代&#xff0c;创新的力量正以前所未有的方式融入我们的日常生活&#xff0c;特别是对于视觉障碍群体而言&#xff0c;技术的每一次进步都是通往更加独立生活的桥梁。今天&#xff0c;让我们聚焦于一款名为“蝙蝠避障”的辅助软件&#xff0c;它不仅为盲…

一些常见的 Conda 命令

Conda 是一个用于包管理和环境管理的开源软件包&#xff0c;特别是用于Python环境。以下是一些常见的 Conda 命令&#xff1a; 创建环境&#xff1a; conda create --name myenv # 创建一个名为 myenv 的新环境 conda create --name myenv python3.8 # 创建一个指定 Python 版本…

射频功率限幅器简略

在功率输入保护方面&#xff0c;限幅器是最好用的器件之一&#xff0c;可以保护后级电路不受超限功率的损害&#xff0c;限幅器其实像TVS功能一样&#xff0c;让超过阈值的功率释放到接地上&#xff0c;来达到限制幅度的目的&#xff0c;目前限幅器的限幅幅度大多都大于15dBm,很…

软件测试 - 第四章课后作业

软件测试 - 第四章课后作业 一单选题&#xff08;共6题&#xff0c;33分&#xff09; (单选题)下列选项中&#xff0c;不属于HTTP请求组成部分的是( )。 A. 请求行 B. 请求体 C. 状态行 D. 请求头 正确答案: C:状态行;(单选题)下列关于HTTP响应说法错误的是( )。 A. 当服务器…

VB.net进行CAD二次开发(三)

参考文献1中CAD .net开发系列1-7&#xff0c;非常地好&#xff0c;需要逐一测试和运行 上面的catch块只显示一个错误信息。实际的清理工作是在finally块中进行的。这样做的理由是如果在事务处理被提交&#xff08;Commit()&#xff09;之前&#xff0c;Dispose()被调用的话&am…

任务悬赏系统:遵守规则,轻松赚取佣金

前言 在数字化时代&#xff0c;任务悬赏系统作为一种新兴的平台&#xff0c;正逐渐融入我们的日常生活。这类系统不仅为用户提供了自我展示和技能变现的舞台&#xff0c;更成为了一种轻松赚取佣金的途径。 一、任务悬赏系统是什么&#xff1f; 简单来说&#xff0c;任务悬赏系…

MySQL -- SQL笔试题相关

1.银行代缴花费bank_bill 字段名描述serno流水号date交易日期accno账号name姓名amount金额brno缴费网点 serno: 一个 BIGINT UNSIGNED 类型的列&#xff0c;作为主键&#xff0c;且不为空。该列是自动增量的&#xff0c;每次插入新行时&#xff0c;都会自动递增生成一个唯一的…