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

news2024/9/25 17:19:49

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);//PC1
  ADC_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个转换在规则序列中 也就是转换规则序列4
    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 regular channel11, channel14, channel16 and channel17 configurations */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_41Cycles5);//PC1
    ADC_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.coloradmin.cn/o/731535.html

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

相关文章

MySQL---表数据高效率查询(简述)

目录 前言 一、聚合查询 💖聚合函数 💖GROUP BY子句 💖HAVING 二、联合查询 💖内连接 💖外连接 💖自连接 💖子查询 💖合并查询 🎁博主介绍:博客名…

NXP文档AN13000解读-基于S32K116的无感BLDC六步换相控制策略(预定位/开环启动/反电动势过零点检测)

目录 六步换相控制 单极性PWM 反电动势过零点检测技术 反电动势的测量 总线电流的测量 电机状态切换 Alignment Start-up Run 算法用到的各模块 各模块间的连接 ADC触发顺序 芯片的初始化 时钟配置与电源管理 FTM Trigger MUX Control (TRGMUX) PDB ADC LPS…

【Git原理与使用】-- 多人协作

目录 多人协作一(多人同一分支) 开发者一(Linux) 开发者二(Windous) master合并 远端上的合并 本地上的合并 总结 多人协作一(多人多分支) 开发者一(Linux&…

SQL Server数据库忘记了sa密码怎么办 亲测真的可用

我们在安装SQL Server数据库时,往往选择混合模式安装,在这里我们可以设置sa密码。混合模式安装后,我们可以通过Windows身份验证和SQL Server身份验证两种方式登陆。 如果sa密码忘记了,我们就无法用SQL Server身份验证登陆了。 那么…

【高性能、高并发】页面静态化解决方案-OpenResty

OpenResty OpenResty介绍 OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项 用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关 OpenResty通过汇聚各种设计精良的…

Python应用实例(一)外星人入侵(五)

外星人入侵(五) 1.项目回顾2.创建第一个外星人2.1 创建Alien类2.2 创建Alien实例 3.创建一群外星人3.1 确定一行可容纳多少个外星人3.2 创建一行外星人3.3 重构_create_fleet()3.4 添加行 在游戏《外星人入侵》中添加外星人。我们将首先在屏幕上边缘附近…

RHCE中级项目

一、项目需求 1、在 bbs.example.com 主机上创建 Discuz 论坛,数据库服务器使用 db.example.com 主机的 bbs 数据库实例,该实例由 MySQL数据库软件提供服务。 2、在 ntp.example.com 主机上创建 NTP 服务,该服务由 Chronyd软件提供服务&…

GoLang网络编程:HTTP服务端之底层原理与源码分析——http.HandleFunc()、http.ListenAndServe()

一、启动 http 服务 import ("net/http" ) func main() {http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("ping...ping..."))})http.ListenAndServe(":8999", nil) }在 Golang只需要几行代…

第三章 SSD存储介质:闪存 3.4

3.4 闪存数据完整性 可采用以下数据完整性的技术确保用户数据不丢失: (1)ECC纠错; (2)RAID数据恢复; (3)重读(Read Retry); &#xff…

C/C++指针从0到99(详解)

目录 一,指针的基础理解 二,指针的基本使用 三,为什么要用指针 四,指针与数组的联系 五,指针的拓展使用 1)指针数组 2)数组指针 3)函数指针 结构:返回类型 (*p)…

我国新能源汽车存量已突破1620万辆,登记数量创历史新高

根据公安部发布的最新数据,截至2023年6月底,全国的机动车数量达到4.26亿辆,其中汽车数量为3.28亿辆,新能源汽车数量为1620万辆。与此同时,机动车驾驶人口达到5.13亿人,其中汽车驾驶人口为4.75亿人。在2023年…

Zabbix监控软件 Linux外多平台监控【Windows JAVA SNMP】

在之前的博客中,已经介绍了zabbix的安装,配置,以及如何用zabbix监控Linux服务器。这篇博客则介绍zabbix监控的其他几种方式(Windows服务器 Java应用 SNMP)。 -------------------- Zabbix 监控 Windows 系统 ---------…

传统图像处理之图像美化——图像金字塔

代码实战:图像融合 我将肯巴.沃克和约翰.沃尔融合在了一起。 具体见注释。 import numpy as np import cv2 import scipy.ndimage as ndimageimg cv2.imread("1.png")img1 cv2.imread("2.png")imgcv2.resize(img,(192,192)) img1cv2.resiz…

JVM调优的相关命令

在进行JVM调试时,熟练使用Linux和Java命令是非常重要的,有利于我们快速发现问题,并进行解决。平时常用的命令有:Linux的Top、Top -Hp等;Java的Jps、Jinfo、Jstack、Jstat、Jmap、Jhat等。下面,我将逐一介绍…

【技能实训】Day01

文章目录 任务1 项目准备一、开发环境二、系统简介三、项目创建 任务2【任务2.1】菜单项设计及其测试【任务2.2】使用数组存储采集的数据【任务2.3】控制显示采集的数据 任务1 项目准备 一、开发环境 1.JDK8下载及其环境变量配置(JDK8以上版本) 2.IDE :Eclipse 或…

多边形连接器PolygonConnector

PolygonConnector将多个多边形连接在一起 PolygonConnectorTest用于测试PolygonConnector Polygon test_square; Polygon test_square_around

关于IIS安全设置http能访问https不能访问的解决方案

最近折腾IIS,发现网站的http能访问但是https不能访问。 我确认所有关于HTTPS的配置我都配置正确了,结果还是不能访问,一番折腾发现,服务器本身的防火墙和阿里云服务器的安全组规则不是一回事。改完防火墙也没有用,重要…

【前端】网页开发精讲与实战 HTML Day 1

🚀Write In Front🚀 📝个人主页:令夏二十三 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:前端 💬总结:希望你看完之后,能对你有…

OpenCV使用ellipse()函数来绘制一个椭圆

/*** void ellipse(* InputOutputArray img, // 图像* Point center, // 椭圆原心* Size axes, // 椭圆x轴长度的一半,y轴长度的一半* double angle, // 椭圆旋转角度* double startAngle, // 起始角度* double endAngle, // 终止角度* const Scalar& color, // 椭圆颜色*…

整数序列(山东大学考研机试题)

整数序列 题目链接:3717. 整数序列 - AcWing题库 /* 纯暴力 刚开始以为挺难的结果是个暴力题 */ #include<iostream> using namespace std; int main() {int n;cin>>n;int f0;for(int i1;i<n/2;i){int sum 0;for(int ji;j<n/21;j){sumj;if(sumn){f1;for(int…