STM32的ADC模式及其应用例程介绍

STM32的ADC模式及其应用例程介绍


  • 📍ST官方相关应用笔记介绍资料:https://www.stmcu.com.cn/Designresource/detail/application_note/705947
  • 📌相关例程资源包:STSW-STM32028https://www.st.com/zh/embedded-software/stsw-stm32028.html

✨官方所给的例程是基于标准库下的工程。对于HAl STM32CubeMX工程此功能的代码在网上最多,而基于标准库下的介绍该功能的相关配置很少,如果想学习和研究基于标准库来使用ADC功能,这是一个不错的资源例程,几乎包含了所有ADC功能实现已经应用方式。

  • 📑例程包含说明文档,涉及单路以及多路ADC通道数据获取,双ADC模式下,交替、注入转换方式等内容的介绍和使用。
  • 📋相关例程列表:
    在这里插入图片描述
  • 📐本文只抽取其中的SingleChannelContinuous单通道连续转换模式,采用DMA传输方式,进行功能测试。

所给的例程代码,已经帮我们配置了其功能代码,我们只需要做的是,添加调试串口,将对应的数据,通过串口打印出来,查看其结果是否符合预期。

  • 🚩所提供的资源案例采用的是STM32F107,个人采用的是STM32F103进行测试。

📓单通道连续转换模式

单通道连续转换模式可在常规通道转换中对单个通道进行连续不断的转换。

  • 此连续模式允许 ADC 在后台工作。因此,ADC 可在没有任何 CPU 干预的情况下连续转换通道。此外,还可以在循环模式下使用 DMA,从而降低 CPU 负载。
    注: 本应用笔记提供了一个固件示例:SingleChannelContinuous。该示例使用两种方法:
    DMA 和中断。要选择其中一种方法,只需在 main.c 文件中注释或取消注释 #define
    USE_DMA_Transfer。
  • 📝配置代码如下:
int main(void)
{/* System clocks configuration ---------------------------------------------*/RCC_Configuration();delay_init();	    	 //延时函数初始化	 /* GPIO configuration ------------------------------------------------------*/GPIO_Configuration();uart_init(115200);	 	//串口初始化printf("Hello World \r\n");
#ifndef   USE_DMA_Transfer /* NVIC configuration ------------------------------------------------------*/NVIC_Configuration();#else /* DMA1 channel1 configuration ---------------------------------------------*/DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);  /* Enable DMA1 channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);
#endif/* ADC1 configuration ------------------------------------------------------*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;//1个通道ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channels configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);  //采样时间  #ifdef   USE_DMA_Transfer   /* Enable ADC1 DMA */ADC_DMACmd(ADC1, ENABLE);
#else/* Enable ADC1 EOC interupt */ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
#endif  /* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* Enable ADC1 reset calibaration register */   ADC_ResetCalibration(ADC1);/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1));/* Start ADC1 calibaration */ADC_StartCalibration(ADC1);/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1));/* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);while (1){printf("ADC1ConvertedValue:%d \r\n",ADC1ConvertedValue);delay_ms(1000);}
}
  • 🌿此案例采用的是ADC1中的递14通道,对应的输入引脚为PC4:
    在这里插入图片描述
  • 📜调节定位器,测试输出结果
    在这里插入图片描述

📗扫描方式多通道连续转换

  • 🌿对应的例程:ScanContinuous

通道配置:

  /* ADC1 regular channel11, channel14, channel16 and channel17 configurations */ ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_41Cycles5);//PC1ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5);//内部参考电压ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_239Cycles5);//内部温度传感器ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_1Cycles5);//PC4

在这里插入图片描述

int main(void)
{/* System clocks configuration ---------------------------------------------*/RCC_Configuration();delay_init();	    	 //延时函数初始化/* GPIO configuration ------------------------------------------------------*/GPIO_Configuration();uart_init(115200);	 	//串口初始化printf("Hello World \r\n");/* DMA1 channel1 configuration ---------------------------------------------*/DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = BufferLenght;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA1 channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);/* ADC1 configuration ------------------------------------------------------*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	ADC_InitStructure.ADC_NbrOfChannel = BufferLenght;//4个转换在规则序列中 也就是转换规则序列4ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel11, channel14, channel16 and channel17 configurations */ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_41Cycles5);//PC1ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5);//内部参考电压ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_239Cycles5);//内部温度传感器ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_1Cycles5);//PC4/* Enable ADC1 DMA */ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE);/* Enable TempSensor and Vrefint channels: channel16 and Channel17 */ADC_TempSensorVrefintCmd(ENABLE);/* Enable ADC1 reset calibaration register */ADC_ResetCalibration(ADC1);/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1));/* Start ADC1 calibaration */ADC_StartCalibration(ADC1);/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1));/* Start ADC1 Software Conversion */ADC_SoftwareStartConvCmd(ADC1, ENABLE);/* Test on Channel 1 DMA1_FLAG_TC flag */while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));/* Clear Channel 1 DMA1_FLAG_TC flag */DMA_ClearFlag(DMA1_FLAG_TC1);while(1){printf("%d - %d - %d - %d \r\n", ADC1ConvertedValue[0], ADC1ConvertedValue[1],ADC1ConvertedValue[2], ADC1ConvertedValue[3]\);//PC1->[0];内部参考电压;温度; PC4->[3]delay_ms(1000);}
}
  • 📋串口打印:
    在这里插入图片描述

👉🏻仅对资源例程中2个例程进行了有效性验证,其他例程没有做烧录测试和功能验证。

📚例程资源(包含中文说明文档)

  • 🔖如需下载未修改过的原例程资源请前往官方下载。
  • 🌿该资源例程修改匹配的是stm32f103芯片。
链接:https://pan.baidu.com/s/1-k9UvL2lSLI2ZlxyoT-FWg 
提取码:7kot

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序使用第三方组件wxParse加载富文本html

微信小程序使用第三方组件wxParse加载富文本html 微信小程序微信小程序加载富文本html微信小程序富文本第三方组件wxParsewxParse富文本html wxParse简介 wxParse 是一个微信小程序富文本解析组件,支持支持Html及markdown转wxml。 wxParse gitHub地址&#xff1…

ARM中断实验

#ifndef __KEY_H__ #define __KEY_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_gic.h"//对RCC/GPIO/EXTI章节的初始化 void hal_key1_exti_init();//对GIC的初始…

Css基础:盒子模型

1.盒子模型的构成: 边框 外边距 内边距 实际内容 2.table表格的单元格之间的线太粗需要border-collapse:collapse;合并一下边框宽度 3.内边距 padding 4.外边距 margin 块元素水平居中的做法,margin:0 auto; 行内元素和行内块元素 水平居中做…

Pyqt5+PyQt-Fluent-Widgets+Pycharm环境安装

文章目录 1. Pyqt5环境安装2. Pycharm配置QtDesigner3. PyQt-Fluent-Widgets插件安装4. 在QtDesigner中使用PyQt-Fluent-Widgets 1. Pyqt5环境安装 使用miniconda创建一个新环境作为pyqt5的开发。这里使用的python3.8版本,网上说太高的python3.10版本无法同时安装py…

Linux 共享内存

概念: 在Linux系统中,共享内存是一种用于进程间通信的机制,它允许多个进程共享同一块内存区域。 Linux 共享内存的作用和目的: Linux共享内存的主要目的是在不同的进程之间实现高效的数据交换和共享。它可以用于以下几个方面&…

Excel如何在运算中过滤重复数据?

来百度APP畅享高清图片 问题:两个对比表格内的数据实际是有重复的但是不是完全重复,比如a-b 和b-a 只是顺序换了但是条件格式就无法筛选了,只能筛选出a-b a-b 的相同数据。 需求:要筛选出a-b a-b b-a的重复数据,或者把…

7月7日发布?OPPO A78 4G手机跑分库曝光

据报道,OPPO计划在7月7日发布A78 4G手机。在正式发布之前,该手机已经在GeekBench跑分库中出现。根据GeekBench 6.1版本,A78 4G单核成绩为411分,多核成绩为1263分。 跑分页面显示 OPPO A78 4G 型号为 CPH2565,主板代号为…

如何提高力扣(Leetcode)的解题能力?

如何提高力扣(Leetcode)的解题能力? 力扣(Leetcode)是一个在线编程平台,提供了各种算法和数据结构的题目,让程序员可以练习和提高自己的编程技能。很多人都把力扣(Leetcode&#xf…

Mybatis-plus——增删改查相关+id生成策略+多数据操作(删除)+逻辑删除+乐观锁+代码生成器

项目文件总览 Dao层中 domain层中 测试类中含有三个测试方法,分别对应,插入删除和修改 id生成策略 针对不同的场景使用不同的id,用到提供的一个注解TableId 在实体类中使用Tablefiled注解时可以看见有如下的多种策略 使用第一个AUTO策略 运行插入方法得…

vue清除地址栏参数(可以单个,可以多个)

需求 vue跳转新页面后,清除url里面的参数,就是上一个页面带过来的参数,只用一次 mounted () {this.$nextTick(() > {let url this.getnewurl()window.history.replaceState(null, null, url);})},methods: { //根据参数名去清除&#xf…

ModaHub魔搭社区:阿里云CTO周靖人:魔搭社区将成为中国最大的“大模型自由市场”

7月7日消息,阿里云CTO周靖人在上海世界人工智能大会上宣布了阿里云的发展计划。 他表示,阿里云将致力于推动中国大模型生态的繁荣,并为大模型创业公司提供全方位的支持。阿里云魔搭社区已经聚集了180万AI开发者和900多个优质AI模型&#xff0…

Unity3d的智力拼图小游戏

Unity3d的智力拼图小游戏 项目地址:https://download.csdn.net/download/Highning0007/88015674