STM32的ADC详解

news2024/11/15 4:13:24

目录

一、ADC简介

二、ADC的时钟

三、ADC特性

四、ADC功能说明

五、规则通道和注入通道

1.规则通道

2.注入通道

3.区别

六、数据寄存器

1.右对齐

2.左对齐

七、转换模式

1.单次转换模式

2.续转换模式

3.扫描模式

4.区别

八、程序实现

1.需求

2.ADC初始化

3.AD采集


一、ADC简介

ADC是模拟数字转换器(Analog to Digital Converter),是一种将模拟量(如电压值、光敏电阻阻值、热敏电阻阻值等)转换为数字量的设备。

二、ADC的时钟

ADC有两个时钟方案,一个是针对数字电路的,一个是根据模拟电路的。

模拟电路的时钟:ADCCLK,所有 ADC 共用,此时钟来自于 APB2 时钟,该预分频器允许 ADC 在 fPCLK2 /2、/4、/6 或 /8 下工作。

数字接口的时钟:此时钟等效于 APB2 时钟。可以通过 RCC APB2 外设时钟使能RCC_APB2ENR为每个 ADC 使能/禁止数字接口的时钟。

三、ADC特性

STM32F4的ADC是12位逐次逼近型的模拟数字转换器,具有多达19个复用通道,可测量来自16个外部源、2个内部源通道的信号。ADC的结果存储在一个左对齐或者右对齐的16位数据寄存器中。STM32F4系列有3个ADC,这些ADC可以独立使用,也可以使用双重或者三重模式来提高采样率

ADC的主要特性包括

(1)可配置12位、10位、8位或6位分辨率

(2)在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断

(3)支持单次和连续转换模式

(4)自动将通道0转换为通道“n”的扫描模式

(5)数据被存储在16位数据寄存器中,数据对齐以保持内置数据一致性

(6)可独立设置各通道采样时间,以及外部触发器选项。

(7)STM32F4的ADC还具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或者下限。

四、ADC功能说明

VREF是ADC的的参考电压,VDDA是ADC的供电引脚,ADCx_IN0-ADCx_IN15代表16个外部通道,温度传感器、VREFINT、VBAT代表3个内部通道,然后被分出了16个规则通道和和4个注入通道。

五、规则通道和注入通道

1.规则通道

每个ADC存在16个规则通道,规则通道可以理解为就是普通的转换通道,通常我们在没有配置注入转换通道的情况下,主要使用的就是这个通道。规则通道的转换结果储存在规则数据寄存器(ADC_DR)中,所有规则通道的转换结果均共用此规则数据寄存器,因此为避免数据丢失,在每个通道转换完毕时应尽快将转换结果读出。

2.注入通道

每个ADC存在4个注入通道,注入通道可以理解为一种中断或插入的通道,它可以在规则通道转换的时候强行插入要转换的通道,注入通道可以中断规则通道的转换,并在注入通道组转换完成后,规则通道组的规则转换会从上次中断的规则转换处恢复。每个注入通道均有一个用于储存转换结果的注入数据寄存器(ADC_JDRx),所以他们的转换结果互不影响。

3.区别

 规则通道适合于需要连续、大规模数据采集的场景,而注入通道则适用于需要快速响应、单次数据采集的情况。

六、数据寄存器

数据寄存器有16位,但是最多12位有效吗,ADC_CR2 寄存器中的 ALIGN 位用于选择转换后存储的数据的对齐方式,可选择左对齐和右对齐两种方式,读数后处理的方式也不一样。

1.右对齐

2.左对齐

七、转换模式

1.单次转换模式

  • 在单次转换模式下,ADC按照设定的配置执行一次转换,然后停止转换并等待进一步的触发。
  • 这种模式适用于需要单次获取转换结果的应用场景。
  • 在单次转换模式下,无论是规则通道还是注入通道,ADC都会执行一次转换然后停止。
  • 如果选择多个通道进行转换,并且没有启动扫描模式,那么ADC只会转换选定的第一个通道。

2.续转换模式

  • 在连续转换模式下,ADC在完成一次转换后自动开始下一次转换,无需外部触发。
  • 这种模式适用于需要持续采样的应用场景,如数据采集。
  • 在连续转换模式下,ADC会持续进行转换,直到被外部触发停止或复位。
  • 如果选择多个通道进行转换,并且启动了扫描模式,那么ADC会按照通道号的顺序对设置的多个通道进行连续转换。

3.扫描模式

  • 扫描模式是与通道选择相关的功能,而不是一个独立的转换模式。
  • 在扫描模式下,可以通过设置多个输入通道进行连续转换。
  • ADC将按照通道号的顺序对设置的多个通道进行转换,并将结果按顺序保存在对应的数据寄存器中。
  • 扫描模式通常与连续转换模式一起使用,以实现多个通道的连续采样和转换。

4.区别

  • 单次转换模式仅执行一次转换并停止。
  • 连续转换模式在完成一次转换后自动开始下一次转换,无需外部触发。
  • 扫描模式允许设置多个通道进行连续转换,并通常与连续转换模式一起使用。

八、程序实现

1.需求

我们用STM32F429的PA5来实现AD的采集,根据数据手册,我们得知PA5属于ADC1的通道5。

2.ADC初始化

设置ADC1,4分频,12位模式,右对齐等ADC基本参数。

ADC_HandleTypeDef ADC1_Handler;//ADC句柄
//初始化ADC
//ch: ADC_channels 
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{ 
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC1_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式
    ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC1_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换
    ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1 
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC1_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
    HAL_ADC_Init(&ADC1_Handler);                                 //初始化 
}

//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIOA时钟
	
    GPIO_Initure.Pin=GPIO_PIN_5;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

3.AD采集

我们用ADC1的通道5,所以传入参数ch=5,结果返回一次ADC规则组的转换结果。


//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
u16 Get_Adc(u32 ch)   
{
    ADC_ChannelConfTypeDef ADC1_ChanConf;
    
    ADC1_ChanConf.Channel=ch;                                   //通道
    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
	
    HAL_ADC_Start(&ADC1_Handler);                               //开启ADC
	
    HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
 
	return (u16)HAL_ADC_GetValue(&ADC1_Handler);	        //返回最近一次ADC1规则组的转换结果
}

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

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

相关文章

InfiniBand网络-赋能高性能计算的卓越引擎

InfiniBand:赋能高性能计算网络的卓越引擎 InfiniBand作为一种先进的内网计算平台,已成为驱动高性能计算(HPC)、人工智能(AI)以及超大规模云基础设施演进的核心力量,其展现出无可比拟的性能优势…

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本,直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件(适用于 Linux 系统)&am…

Java中SPI机制原理解析

使用SPI机制前后的代码变化 加载MySQL对JDBC的Driver接口实现 在未使用SPI机制之前,使用JDBC操作数据库的时候,一般会写如下的代码:// 通过这行代码手动加载MySql对Driver接口的实现类 Class.forName("com.mysql.jdbc.Driver") Dr…

鸿蒙开发error: failed to start ability

鸿蒙开发项目编译过后不能启动 项目在模拟器运行报: error: failed to start ability. Error while Launching ability 解决办法: 1,看了一些文章说是把module.json5配置文件中的"exported"由false改成true,没有解…

Python 实现股票指标计算——BIAS

BIAS (Bias Ratio) - 乖离率 1 公式 BIAS (当日收盘价 - N日平均收盘价) ➗ N日平均收盘价 ✖ 100% N一般取6、12、24 2 数据准备 我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下: 3 计算过程 def c…

Java 中的异常

异常:就是出现的问题。 在Java中异常被当成对象进行处理,所有的异常类都继承于Throwable类,如果Java提供的异常类并不能满足需求,用户还可以自己定义一个异常类。 下面是异常体系结构: Throwable又分成了Error和Exce…

《无所不能的JavaScript · 对象简介》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

OpenStack Yoga版安装笔记(七)glance练习补充

1、练习场景说明 在OpenStack Yoga版安装笔记(五)中,glance已经在controller node虚拟机上安装完成,并且已经成功拍摄了快照。 此时,controller node虚机已经安装了keystone、keystone DB、glance、glance DB、OpenSta…

利用【MATLAB】和【Python】进行【图与网络模型】的高级应用与分析】

目录 一、图与网络的基本概念 1. 无向图与有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与连通性 5. 图的矩阵表示 MATLAB代码实例 Python代码实例 二、最短路径问题 1. 最短路径问题的定义 2. Dijkstra算法 MATLAB代码实例 Python代码实例 三、最小生…

昇思MindSpore学习总结十七 —— 基于MindSpore通过GPT实现情感分类

1、要求 2、导入了一些必要的库和模块 以便在使用MindSpore和MindNLP进行深度学习任务时能使用各种功能,比如数据集处理、模型训练、评估和回调功能。 import os # 导入操作系统相关功能的模块,如文件和目录操作import mindspore # 导入MindSpore库&a…

入门C语言只需一个星期(星期六)

点击上方"蓝字"关注我们 01、创建结构体 struct MyStructure { // 结构声明 int myNum; // 成员(int 变量) char myLetter; // 成员(char 变量)}; // 用分号结束结构创建一个名为 s1 的结构变量​struct myStru…

# Redis 入门到精通(九)-- 主从复制(1)

Redis 入门到精通(九)-- 主从复制(1) 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用? 1)单机 redis 的风险与问题 问题1.机器故障  现…

kafka服务介绍

kafka 安装使用管理 Kafka Apache Kafka 是一个开源的分布式事件流平台,主要用于实时数据传输和流处理。它最初由 LinkedIn 开发,并在 2011 年成为 Apache 基金会的顶级项目。Kafka 设计的目标是处理大规模的数据流,同时提供高吞吐量、低延迟…

C语言 通讯录管理 完整代码

这份代码,是我从网上找的。目前是能运行。我正在读。有些不懂的地方,等下再记录下来。 有些地方的命名,还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为: Perso…

C#实现数据采集系统-实现功能介绍

系统介绍 我们这里主要使用C#( .Net 6)来实现一个数据采集系统,从0到1搭建数据采集系统,从系统分析,功能拆解,到一一实现 数据采集 数据采集是企业信息化和数字化转型过程中的关键环节,它涉及到从生产设备、传感器…

Microsoft Visual C++ 2010 Express 使用

Microsoft Visual C 2010 Express 使用 Microsoft Visual C 2010 Express(简称VC 2010 Express)是一款免费的集成开发环境(IDE),专为C和C语言的开发者设计。 安装 下载|本站链接【VC2010简体中文版】的安装包并解压…

2024年新手卖家该如何做好亚马逊运营?

随着电子商务的蓬勃发展,越来越多的新手卖家选择在亚马逊这一国际电商巨头平台上开展业务。然而,想要在竞争激烈的市场中脱颖而出,新手卖家需要精心规划并执行有效的运营策略。以下是为2024年新手卖家提供的关于如何做好亚马逊运营的一些建议…

C#学习-刘铁猛

文章目录 1.委托委托的具体使用-魔板方法回调方法【好莱坞方法】:通过委托类型的参数,传入主调方法的被调用方法,主调方法可以根据自己的逻辑决定调用这个方法还是不调用这个方法。【演员只用接听电话,如果通过,导演会…

刷题笔记 739. 每日温度 (单调栈),215. 数组中的第K个最大元素(堆),347.前 K 个高频元素

739. 每日温度 (单调栈). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/daily-temperatures/description/?envTypestudy-plan-v2&envI…

Fast Planner规划算法(一)—— Fast Planner前端

本系列文章用于回顾学习记录Fast-Planner规划算法的相关内容,【本系列博客写于2023年9月,共包含四篇文章,现在进行补发第一篇,其余几篇文章将在近期补发】 一、Fast Planner前端 Fast Planner的轨迹规划部分一共分为三个模块&…