stm32cubemx+ADC的多通道轮询数据采集和DMA数据采集实现,亲测可用

news2024/9/24 11:21:56

ADC是单片机的重要组成,也是存在一定的难点。

一、多通道轮询数据采集。

1、配置时钟,用的无源晶振。

2、SW烧写方式

添加USART

3、ADC选择了四个通道

其中两个是采集电压,另外两个是采集芯片内部温度和参考电压。

4、配置采集模式

这里是重点:

①ADC的时钟,查询数据手册,可以看到在VDDA供电2.4V-3.6V时候,最大值不大于36MHz

在我们设置时钟树后,会自动变成合适的分频,让ADCCLK小于36MHz

②scan conversion mode 扫描转换模式,选择enable,会对ADC1的16个通道扫描。

③discontinuous conversion 选择enable, 不会自动完成转换,需要手动控制转换。

④number of discontinuous conversions,这里选择1,指的是每次转换的通道数量。比如现在我们选择4个ADC通道,每次转换一个通道,分为4组。如果设置为2,每次转换2个通道,分为2组。

⑤ADC regular conversion mode 

number of conversion,选择4,意思是对4个通道进行ADC数据转换。

⑥设置每个通道的参数。

Rank1、2、3、4,4组。

每组对应的通道名称,以及采样时间。

5、设置时钟树

6、工程信息7、

代码部分:

①、添加打印函数

/* USER CODE BEGIN Includes */
#include "stdio.h"

/* USER CODE END Includes */
/* USER CODE BEGIN 0 */



/**
  * @brief  The application entry point.
  * @retval int
  */
int fputc(int c, FILE *stream)    //重写fputc函数
{
 /*
    huart1是工具生成代码定义的UART1结构体,
    如果以后要使用其他串口打印,只需要把这个结构体改成其他UART结构体。
*/
    HAL_UART_Transmit(&huart1, (unsigned char *)&c, 1, 1000);   
    return 1;
}



/* USER CODE END 0 */

②、采集和打印

int main(void)
{
  /* USER CODE BEGIN 1 */
  uint16_t ADC_value;//
	uint8_t i;
  /* USER CODE END 1 */
   printf("<<<<<<<ADC 非DMA多通道采集\r\n ");
	 HAL_Delay(2000);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */	
		printf("\r\n *****ADC 输出 *****\r\n");  //我这里设置间断数为1,也就是将4个通道分成了4组,那么我每次采集的时候都需要手动去触发ADC采集,也就是调用一次HAL_ADC_Start函数
    for(i=0;i<4;i++)
		{
			HAL_ADC_Start(&hadc1);//启动ADC转换,必须放在for循环中,否则只能采集第一个通道的ADC值;
			HAL_ADC_PollForConversion(&hadc1,100); //用于轮询转换,是一个阻塞函数,等待转换完成,参数100ms是阻塞时间
			if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)) //判断转换完成标志位是否设置,为1的时候产生中断。
				ADC_value=HAL_ADC_GetValue(&hadc1); //开始读ADC的值
			}
	printf("AD[1] value =%d ",ADC_value);//打印输出
		}	
							HAL_ADC_Stop(&hadc1); //停止擦剂
	

我们从设计参考手册中,可以查询到。

单次转换模式,我们每次采集一个通道的数据会产生一个中断。对于四个通道,需要四次采完。

每次开启采集,判断采集完成,判断转换标志位设置,开始读取数据。采集到是16位的ADC数据。

输出的结果如下:

除了第三个通道,测量芯片内部问题有问题,还没找到原因,其他的都正常。

二、多通道ADC +DMA方式

一样的就不再赘述了。

①扫描通道模式,使能

②连续转换模式,使能

③DMA连续转换请求,使能

④number of conversion 转换通道数 2,本次选择两个通道。

DMA使能,

mode:circular 循环

data width :word

代码部分:

int main(void)
{
  /* USER CODE BEGIN 1 */
uint32_t ADC_Value[100];//定义32位的100个数据的数组,存储adc的数据
	uint8_t i;
	uint32_t ad1,ad2;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC_Value,100); //直接采集到50组,通道4和通道5的数据,ADC_Value[i],偶数存的是通道4的数据,奇数存的是通道5的数据
printf("<<<<<<<ADC many DMA test\r\n");
HAL_Delay(2000);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
ad1=0,ad2=0;
    /* USER CODE BEGIN 3 */ 
		HAL_Delay(1000); 
		for(i=0;i<50;i++) 
		{
			ad1+=ADC_Value[2*i]; //通道4数据累加
			ad2+=ADC_Value[2*i+1];//通道5数据累加
		}
		ad1/=50;//求平均值
		ad2/=50;//求平均值
		printf("\r\n ****ADC DMA Example****\r\n\r\n");
    printf("AD1 value = %d\r\n",ad1);
		printf("AD2 value = %d\r\n",ad2);
		HAL_Delay(1000);
				
  }
  /* USER CODE END 3 */

代码量还是比较少的。

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

萌啦数据官网丨萌啦ozon数据分析工具官网

在当今这个数据驱动的时代&#xff0c;电子商务的蓬勃发展离不开精准的数据分析与洞察。对于在OZON平台上耕耘的商家而言&#xff0c;掌握市场趋势、优化产品布局、提升运营效率成为了赢得竞争的关键。正是在这样的背景下&#xff0c;萌啦数据官网应运而生&#xff0c;作为一款…

信用卡使用雷区大揭秘:为何你贷款被拒?

​好多朋友明明条件挺好&#xff0c;但申请银行贷款时却吃了闭门羹&#xff0c;一查征信&#xff0c;原来是信用卡使用上栽了跟头。信用卡可是个关键角色&#xff0c;用得好助力贷款&#xff0c;用得不好&#xff0c;直接拖后腿。今天咱们就聊聊信用卡对贷款申请的影响情况和解…

鸿蒙OS ArkTS 省市县级联选择框,封装组件

背景&#xff1a; 公司现在要开发纯血鸿蒙版本APP&#xff0c;我被抽调过来做点功能。现在要做一个省市县级联选择框&#xff0c;并且要封装为组件&#xff0c;供其他页面模块使用。 效果图&#xff1a; 难点&#xff1a; 1. 现在官方文档上只是查到了TextPicker组件是可以做…

建筑设计遇上这几个工具,就是锦上添花!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2161.html 当AI遇上建筑&#xff0c;设计界的火花就这样擦出来了&#xff01;&#x1f440; 身为一名内外饰设计工程师&#xff0c;你是否也在担心作品不经意间借鉴过了头…

Tomcat启动控制台乱码解决方案

前言 事情的起因是这样的&#xff0c;当时我用了阿里云osssdk里的代码下载文件&#xff0c;如下 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); &#xff0c;开始一切顺利&#xff0c;直到部署正式环境后&#xff0c;用了一段时间…

【Material-UI】Button 组件中的尺寸设置(Sizes)详解

文章目录 一、基础尺寸选项1. 小尺寸&#xff08;Small&#xff09;2. 中等尺寸&#xff08;Medium&#xff09;3. 大尺寸&#xff08;Large&#xff09; 二、尺寸的应用场景三、高级用法和最佳实践1. 使用主题调整默认尺寸2. 确保一致性3. 考虑无障碍设计 四、总结 在用户界面…

代码随想录算法训练营第五十二天|101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿

101. 孤岛的总面积 DFS搜索&#xff1a; dfs 函数是一个递归函数&#xff0c;用于深度优先搜索&#xff08;DFS&#xff09;遍历网格中的陆地区域。它将访问过的陆地标记为0&#xff0c;并统计陆地的数量。 我们首先定义了四个方向的移动偏移量 dir。 global count 语句用于声…

C++入门2

函数重载 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…

数据结构和算法|递归算法那些事(递归算法的时间复杂度、尾递归优化、斐波那契数列)

对于文章的第一部分&#xff0c;递归算法的时间复杂度&#xff0c;来自于代码随想录文章:通过一道面试题目&#xff0c;讲一讲递归算法的时间复杂度&#xff01; 对于第二节尾递归优化来自于B站&#xff1a;尾递归优化&#xff1a;你的递归调用是如何被优化的&#xff1f; 文章…

Spring Boot - 通过ApplicationListener实现接口请求的性能监控

文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中&#xff0c;监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中&#xff0c;日志记录是一项至关重要的任务。无论是简单的命令行应…

微服务架构-SpringCloud

1.单体应用架构 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程。 优点&#xff1a; 部署简单&#xff1a;由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。技术单一&#xff1a;项目不需要复杂的技术栈&#xff0c;往往一套熟悉的技术栈就…

Netty技术全解析:LineBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【leetcode】杨辉三角(Java语言描述)

杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] …

XIAOJUSURVEY 重磅升级,推出图形化逻辑编排能力

&#x1f389;&#x1f389;&#x1f389;XIAOJUSURVEY 是滴滴开源的企业级问卷系统&#xff0c;现已重磅升级&#xff01;&#xff01;&#xff01; 本次升级基于自研规则引擎&#xff0c;全面支持复杂的问卷逻辑编排&#xff0c;实现了显示逻辑与跳转逻辑的无缝整合。突破了…

MySQL Galera Cluster 部署与介绍

目录 主要特点 组件 一. 环境准备 二. 配置 1. 配置 galera1 主机的my.cnf的文件 2. 配置 galera2 主机的my.cnf的文件 3. 配置 galera3 主机的my.cnf的文件 4. 在给galera1 主机的my.cnf的文件增加节点 5. 写入数据验证同步 6. 配置 galera4 主机的my.cnf的文件 M…

线性回归Pytorch方法

借助 PyTorch 实现深度神经网络 - 线性回归 PyTorch 方法 - 第 3 周 | Coursera 随机梯度下降和数据加载器 在每个epoch中&#xff0c;使用一个样本进行更新的方法称为随机梯度下降&#xff0c;而使用所有样本进行更新的方法称为批量梯度下降。 随机梯度下降&#xff1a; 随…

第五代数字产业园入驻西安,西安国际数字影像产业园究竟能带来哪些颠覆性变革?

西安&#xff0c;这座承载着千年历史文化底蕴的古老城市&#xff0c;在时代的洪流中不断焕发出新的生机与活力。如今&#xff0c;西安第五代数字产业园入驻西安&#xff0c;犹如一颗璀璨的新星在这片土地上冉冉升起&#xff0c;为这座城市的发展注入了强大的动力。而在这一重大…

AFSim 仿真系统---- 通信、传感器与干扰系统方程

概述 本文档旨在描述在WSF中对象之间交互所使用的方程和算法。这包括&#xff1a; 传感器交互通信交互干扰&#xff08;干扰&#xff09;交互 常见无线电频率方程 WSF使用一套通用类来封装涉及无线电频率&#xff08;RF&#xff09;交互的组件&#xff08;实际上&#xff0…

基于B/S模式的JSP二手车交易网站

你好&#xff0c;我是计算机专业的学生&#xff0c;专注于Web开发。希望我的论文能够为您提供一些有价值的信息。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;ECLIPSE、Tomcat 系统展示 首页 用户界面 管理员界面 汽车评…