STM32Cubemx 配置ADC(HAL库)

news2024/11/28 2:37:19

一、ADC几种模式

1、扫描模式: 使用STM32CUBEMX配置了多通道后,这一项默认开启且无法设置成关闭。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完。例如你开启了CH0、CH1、CH2、CH3这四个通道,启动转换后ADC会自动将这4个通道全部转换完,但是这种连续性是可以被打断的,所以就引出了间断模式。

2、连续模式: 在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。开启连续模式后,ADC的转换不由其他控制。例如将ADC设置为了定时器的TGRO触发采样,如果开启连续模式,ADC将忽略定时器的触发采样。(连续转换模式开启后其实就是满频率的采样)。

3、间断模式: 可以将多个通道进行分组采集,例如你开启了CH0~3这4个通道,假如你设置了间断次数为4,就相当于将4个通道分成了4组,每组1个通道,那么要想采集完这4个通道就需要手动触发4次ADC采集;如果设置了间断次数为2,那么采集完4个通道就需要手动触发2次ADC采集。
 

二、配置ADC单通道采集

  while (1)
  {
		HAL_ADC_Start(&hadc1);     //启动ADC转换
		HAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,50为最大等待时间,单位为ms

		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//判断ADC转换是否完成
		{
			ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值

			printf("ADC1 Reading : %d \r\n",ADC_Value);
			printf("PA5 True Voltage value : %.4f \r\n",ADC_Value*3.3f/4096);
		}
		HAL_Delay(1000);
  }

三、轮询模式的多通道采集(同单通道)

uint32_t ADC_Get_Average(uint32_t Channel,uint8_t times)
{
	ADC_ChannelConfTypeDef sConfig;		//通道初始化
	uint32_t value_sum=0;	
	uint8_t i;
	sConfig.Channel = Channel;
	sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;		//采用周期239.5周期
	sConfig.Rank = 1;
	HAL_ADC_ConfigChannel(&hadc1,&sConfig);											
	for(i=0;i<times;i++)
	{
		HAL_ADC_Start(&hadc1);								//启动转换
		HAL_ADC_PollForConversion(&hadc1,30);				//等待转化结束
		value_sum += HAL_ADC_GetValue(&hadc1);				//求和					
		HAL_ADC_Stop(&hadc1);								//停止转换
	}
	return value_sum/times;									//返回平均值
}

  while (1)
  {
	  SEGGER_RTT_printf(0,"ADC_CHANNEL_10 AD:%d\r\n",ADC_Get_Average(ADC_CHANNEL_10,30));
	  SEGGER_RTT_printf(0,"ADC_CHANNEL_11 AD:%d\r\n",ADC_Get_Average(ADC_CHANNEL_11,30));
	  SEGGER_RTT_printf(0,"ADC_CHANNEL_12 AD:%d\r\n",ADC_Get_Average(ADC_CHANNEL_12,30));
	  SEGGER_RTT_printf(0,"ADC_CHANNEL_13 AD:%d\r\n\r\n",ADC_Get_Average(ADC_CHANNEL_13,30));
	  HAL_Delay(200);
    /* USER CODE BEGIN 3 */
  }

 

四、DMA实现多通道采集

4.1 STM32Cubemx配置

(1)Data Alignment--->Right alignment                 此项选择右对齐,保持不变。

(2)Scan Conversion Mode--->Enable                 此项选择扫描模式使能,代表对15路ADC输入分别扫描,如果不使能,其将会只读取一个输入的值。

(3)Continuous Conversion Mode --->Enable        此项选择连续扫描模式,表示将连续不断的对ADC的值进行转换。如果此项不使能,将会只采集一次就会停止,直到下一次使能才继续进行一次ADC转换。

(4)Discontinuous Conversion Mode--->Disable        此项和第三项是重复的。

(5)Number of Conversion---->15                此处有多少路输入就选择多少,而且只有在此处选择数字之后下面才会出来15个不同的通道。而且此处应该是在进入ADC1中第一个需要操作的步骤,否则(2)(3)是灰色的,无法选择使能。

 (6)在出现的15个Rank中,分别配置每一路,例如Rank1配置为Channel 0,采样时间55.5Cycles; Rank2配置为Channel 1,采样时间同样为55.5Cycles。此处的注意事项是,如果你不对每一路进行检查配置,可能出现好多Rank同时采集一个Channel,从而导致AD的采集数据的错误。

 

4.2 采集一次

uint16_t ADC_Value[5];

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,sizeof(ADC_Value) / sizeof(ADC_Value[0]));

 while (1)
  {
    /* USER CODE END WHILE */
	  SEGGER_RTT_printf(0,"%d %d %d %d %d\r\n",ADC_Value[0],ADC_Value[1],ADC_Value[2],ADC_Value[3],ADC_Value[4]);
	  HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

4.3 多次采集求平均值

#define FILTER_NUM 30
#define ADC_CHANNELS 5
uint16_t ADC_ConvertedValue[FILTER_NUM][ADC_CHANNELS];
uint16_t getADC_CH(uint8_t channel)
{
    uint16_t tbuf[FILTER_NUM];
    uint32_t tdat = 0;
    // 判断传入参数是否合法
    if (channel >= ADC_CHANNELS)
    {
        return 0;
    }
    for (int i = 0; i < FILTER_NUM; i++)
    {
        tbuf[i] = ADC_ConvertedValue[i][channel];
    }
    for (int i = 0; i < FILTER_NUM; i++) 
    {
        tdat += tbuf[i]; 
    }
    tdat = tdat/FILTER_NUM; 
    if (tdat < 5)
    {
        tdat = 0;
    }
    return tdat;
}

int main()
{
	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&ADC_ConvertedValue, FILTER_NUM * ADC_CHANNELS);
	while (1)
	{
		for (int i = 0; i < ADC_CHANNELS; i++)
		{
			SEGGER_RTT_printf(0,"getADC_CH[%d] = %d\r\n", i, getADC_CH(i));
		}
		HAL_Delay(1000);
	}
}

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

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

相关文章

动态规划原理及算法题(1)

课程规划会分为四个阶段进行&#xff1a; 1.题目解析 2.讲解算法原理(动态规划的原理) 3.编写代码 4.空间优化 1. 第 N 个泰波那契数&#xff08;easy&#xff09; 泰波那契数相当于斐波那契数的孪生兄弟&#xff0c;是它的加强版。 1.题目解析 2.讲解算法原理 如果用动态规…

Java中的一些名词概念

**函数式接口:** 概念&#xff1a;一个接口中的抽象方法只有一个&#xff0c;那么这个接口就是一个函数式接口。形参: 形参变量是**功能函数里的变量**&#xff0c;只有<u>在被调用的时候才分配内存单元</u>&#xff0c;<u>调用结束后立即释放</u>。…

Unity使用Git及GitHub进行项目管理

git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…

Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Ubuntu20.04编译安卓aosp 15源码编译到模拟器运行

背景&#xff1a; aosp15也开始悄悄在各个手机厂商开始酝酿了&#xff0c;感叹时间很快&#xff0c;今天也准备针对aosp15进行一下源码环境的搭建&#xff0c;整体aosp15的搭建和13/14其实没啥大的差别&#xff0c;只不过在lunch目标这个地方确实很大不同&#xff0c;还有就是…

HCIP-HarmonyOS Application Developer 习题(十四)

&#xff08;多选&#xff09;1、HarmonyOs为应用提供丰富的Al(Artificial Intelligence)能力&#xff0c;支持开箱即用。下列哪些是它拥有的AI能力? A、通用文字识别 B、词性标注 C、实体识别 D、语音播报 答案&#xff1a;ABCD 分析&#xff1a; AI能力简介二维码生成根据开…

工业级三防平板在工厂极端环境下保障稳定运行

在现代工业环境中&#xff0c;尤其是在工厂车间&#xff0c;设备和技术的稳定性直接关系到生产效率与产品质量。然而&#xff0c;极端的工作条件常常给电子设备的使用带来了不小的挑战。为此&#xff0c;市场上出现了一种专为工业应用设计大尺寸手持三防平板电脑。这种设备以其…

2024年十大前沿图像分割模型汇总:工作机制、优点和缺点介绍

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

antd vue 输入框高亮设置关键字

<highlight-textareaplaceholder"请输入主诉"type"textarea"v-model"formModel.mainSuit":highlightKey"schema.componentProps.highlightKey"></highlight-textarea> 参考链接原生input&#xff0c;textarea demo地址 …

【前端】如何制作一个自己的网站(11)

接上文。 除了前面的颜色样式外&#xff0c;字体样式和文本样式也是网页设计中的重要组成部分。 合适的字体和文本排版&#xff0c;不仅可以使页面更加美观&#xff0c;也可以提升用户体验。接下来&#xff0c;我们先来看看CSS如何设置字体样式。 字体样式 同时设置了字体样…

经典算法整理(Go语言实现)

经典算法系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 第一章 回溯算法 第二章 贪心算法 第三章 动态规划 第四章 单调栈 第五章 图论 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可…

机器学习课程学习周报十七

机器学习课程学习周报十七 文章目录 机器学习课程学习周报十七摘要Abstract一、机器学习部分1. 变分推断/推理1.1 证据下界1.2 q ( z ) {q(z)} q(z)的选取 2. VAE2.1 Auto-Encoder的简单回顾2.2 为什么提出VAE2.3 VAE的数学原理 3. Diffusion Model的数学原理3.1 Training算法…

React(五) 受控组件和非受控组件; 获取表单元素的值。高阶组件(重点),Portals; Fragment组件;严格模式StrictMode

文章目录 一、受控组件1. 什么是受控组件2. 收集input框内容3. 收集checkBox的值4. 下拉框select总结 二、非受控组件三、高阶组件1. 高阶组件的概念 (回顾高阶函数)2. 高阶组件应用&#xff1a;注入props(1) 高阶组件给---函数式组件注入props(2) 高阶组件给---类组件注入prop…

开源的存储引擎--cantian

cantian 上次稼先社会活动之后&#xff0c;在北京签售的时候见到了三位参天的核心人物。我有感于他们的热情、务实和坦诚&#xff0c;我觉得还应该在深入的做一些事情。至少可以安装体验一下&#xff0c;做做推广。毕竟现在务实的产品不多了&#xff0c;很多都是浮躁的宣传。为…

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…

如何安装MySql

一.卸载MySql 1.1安装版 进入“控制面板”&#xff0c;将有关“mysql”的一切都删除&#xff0c;再到“C:\ProgramData”中&#xff0c;将“mysql”文件夹删除。 1.2压缩版 先在cmd中停止mysql服务 net stop mysql8 再删除解压“mysql”文件夹即可 二.安装MySql 2.2安装版…

RabbitMQ进阶_可靠性

文章目录 一、 发送者的可靠性1.1、 生产者重试机制1.2、 生产者确认机制1.2.1、确认机制理论1.2.2、确认机制实现1.2.2.1、定义ReturnCallback1.2.2.2、定义ConfirmCallback 二、 MQ的可靠性2.1、 数据持久化2.1.1、 交换机持久化2.1.2、 队列持久化2.1.3、 消息持久化 2.2、 …

端点物联网学习资源合集

端点物联网 学习资源合集 导航 1. 物联网实战--入门篇 文章链接 简介&#xff1a;物联网是一个包罗万象的行业和方向&#xff0c;知识碎片严重&#xff0c;本系列文章通过 边学边用 的思想&#xff0c;逐步建立学习者的信心和兴趣&#xff0c;从而进行更深入透彻的学习和探索…

IDEA如何用maven打包(界面和命令两种方式)

前言 我们在使用IDEA开发时&#xff0c;如果是springboot项目的话&#xff0c;一般是用maven来管理我们的依赖的。然后&#xff0c;当我们开发完成之后&#xff0c;就需要打包部署了。 那么&#xff0c;我们应该如何打包呢&#xff1f; 如何打包&#xff08;jar包&#xff09…

scrapy案例——链家租房数据的爬取

案例需求&#xff1a; 1.使用scrapy爬虫技术爬取链家租房网站&#xff08;成都租房信息_成都出租房源|房屋出租价格【成都贝壳租房】 &#xff09;的数据&#xff08;包括标题、价格和链接&#xff09; 2.利用XPath进行数据解析 3.保存为本地json文件 分析&#xff1a; 请…