ADC数据采集

在如今数字化飞速发展的时代,数据已然成为推动各领域创新的关键要素。接下来我将为大家介绍一下在电子领域至关重要的一个部分-ADC。从常见的常见的设备到高大上的工业自动化都少不了他的身影,接下来我将给大家一起来聊一聊ADC。

ADC的定义

ADC是模拟到数字转换器(Analog-to-Digital Converter)缩写,主要用于将连续传输的模拟信号转换为数字信号,便于数字系统(如中央处理器CPU、微控制器MCU等)对传输信息进行快速处理和分析。接下来我将给大家介绍一下模拟信号和数字信号的概念。 模拟信号是指那些随时间连续变化的物理量,如电压、电流、压力、速度、流量等。这些信号的幅度、频率或相位会随时间连续变化,能够在任意瞬间呈现为任意数值。如图所示:

数字信号是指是指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。 在计算机中,数字信号的大小常用有限位的二进制数表示。如图所示:

模数转换工作原理

模数转换的原理通俗来说就是将随时间连续变化的物理量通过模数转换器转换为相应离散的数字量。具体来说,ADC将来自外部环境的模拟信号(例如来自传感器的温度、压力、光强等)转换为数字形式,以便微处理器或其他数字电路可以处理和分析这些数据。ADC的输出通常是二进制数字,代表了模拟信号的离散值。在嵌入式系统中ADC通常用来进行环境数据采集,然后将采集的数据发送给单片机以便做后续的处理等。ADC模块如图所示:

根据上图我们大概介绍一下ADC数据采集以及转换的过程,由图片的最左边我们看到ADCx_IN0-ADCx_IN15这几个通道,我们将传感器通过GPIO口连接到这几个通道中,然后经过模拟多路开关,将采集到的模拟信号传输模拟数字转换器,该转寒气将转换后的数据放入对应的注入通道数据寄存器或者规则通道数据寄存器,最后将转换后的数据进行输出。通过这一个过程我们将模拟信号转换为数字信号。

但是在这里我们需要注意一下,规则通道和注入通道的不同,在这里我们先来举个例子介绍一下规则通道,这个就好比与我们去餐厅点菜,我们点了16个菜,然后将菜单给老板,老板按照菜单做,做好了端上来你吃完再给你上下一道。所以对于规则组而言我们最好搭配DMA转运,这里我们后续会继续介绍。而注入通道呢就好比我们去餐厅最多点4个菜,老板将这4个菜做好了一起给你端上来。

然后图片再往下就是STM32中ADC的硬件触发方式了,ADC的触发方式分为两种:

(1)软件触发:是指在程序执行过程中,通过一句代码来执行,进行ADC的转换。

(2)硬件触发:EXTI_15是注入组的触发,EXTI_是规则组的触发。这些触发源主要来源于定时器。

再看最上面的VREF+以及VREF-这表示ADC的参考电压,VDDA和VSSA表示ADC的供电引脚,一般情况下,VREF+接VDDA而VREF-接VSSA。 我们知道了ADC大概的转换过程,接下来我们要对ADC进行初始化配置。

ADC初始化配置

由上图我们可以看到ADC进行数据采集的时候需要配置的一些参数,接下来我们将根据此图来对ADC进行配置。 由上图我们可以看到我们首先需要配置的参数是GPIO,因此对其配置如下所示:

ini 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//用adc时需要用模拟输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

这一步主要是对GPIO进行操作,我们在配置GPIO模式的时候要注意将GPIO的模式配置为模拟输入。 我们配置完GPIO后需要对ADC进行参数配置,其配置如下所示:

ini 复制代码
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
//配置ADC的CLK
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    //选择规则组的输入通道,把GPIO接入规则组通道
   ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
//用结构体初始化ADC
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel=1;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;
ADC_Init(ADC1,&ADC_InitStructure);
//开启ADC
ADC_Cmd(ADC1,ENABLE);
//校准ADC
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1) == SET);

在对ADC进行配置的时候,我们由上面的ADC模块图可知,单片机在进行模数转换的时候模数转换器的启动需要ADC预分频器来控制,因此我们用RCC_ADCCLKConfig(uint32_t RCC_PCLK2);此函数来配置预分频器,由库函数中参数配置可以看到,预分频器可以设置为1分频,2分频,6分频,8分频,其预分频器的值可以由单片机的频率/几分频得到,再次我们使用6分频。

接下来就是配置ADC结构体中的参数了,在此我们对它进行一个说明: ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; 这个参数设置的ADC采样的采样模式,可选参数为 ENABLE 和 DISABLE。设置为 ENABLE 时,ADC 使能自动连续转换模式;设置为 DISABLE 时,ADC 工作在单次转换模式,转换一次后停止,需手动控制重新启动转换。在连续转换模式下,通常使用定时器触发或软件触发等方式来启动 ADC 转换。而单次转换模式下,一般通过软件触发来启动转换

ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; 这个设置的是采集到数据后,数据对齐的方式通常有 ADC_DataAlign_Right(右对齐)和 ADC_DataAlign_Left(左对齐)两种取值。

  • 右对齐 :无论 ADC 的分辨率是多少,转换结果数据都放在数据寄存器的最低有效位(LSB)开始的位置。例如,一个 12 位的 ADC,转换结果占用 12 位,右对齐时,这 12 位数据就位于数据寄存器的第 0 到第 11 位。
  • 左对齐 :转换结果数据放在数据寄存器的最高有效位(MSB)开始的位置。以 12 位 ADC 为例,左对齐时,转换结果的 12 位数据位于数据寄存器的第 19 到第 30 位(假设数据寄存器为 32 位)。

ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; 用于配置 ADC 是否使用外部触发信号来启动转换,以及选择外部触发的来源等。- 通常会涉及到是否使能外部触发功能,以及当使能时,选择哪个外部事件作为触发源。例如,在 STM32 的某些系列中,可以取值如 ADC_ExternalTrigConv_None(不使用外部触发)、ADC_ExternalTrigConv_T1_CC1(选择定时器 1 的捕获比较通道 1 作为触发源)、ADC_ExternalTrigConv_T1_TRGO(选择定时器 1 的触发输出作为触发源)等。未使用外部触发的方式为软件触发。

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; 用于指定 ADC 的工作模式,不同的模式适用于不同的应用场景和需求。 不同的微控制器或 ADC 芯片,其 ADC_Mode 参数的取值有所不同。以 STM32 为例,常见的取值包括以下几种:

  • 独立模式(ADC_Mode_Independent) :独立模式下,每个 ADC 转换器都有自己的控制寄存器、数据寄存器等资源,它们的启动、停止、通道选择等操作都是相互独立的。这种模式适用于需要多个 ADC 转换器各自独立采集不同信号的应用场景,比如在一个系统中,有多个传感器的信号需要分别由不同的 ADC 进行采集和处理,它们之间互不干扰,各自按照自己的节奏工作。
  • 扫描模式(ADC_Mode_Scan) :在扫描模式下,ADC 会按照预先设定的通道顺序,依次对多个通道进行转换。当一个通道的转换完成后,自动切换到下一个通道进行转换,直到所有指定的通道都被扫描转换一遍。这种模式可以方便地实现多通道数据的同时采集和监测,比如在数据采集系统中,需要同时采集多个传感器的信号,通过扫描模式可以一次性完成多个通道数据的采集,提高了数据采集的效率和同步性。
  • 连续转换模式(ADC_Mode_Continuous) :连续转换模式下,ADC 启动后会自动连续不断地进行转换操作,无需手动重复启动。每次转换完成后,新的转换结果会自动更新到数据寄存器中,可以实时获取最新的数据。这种模式适用于需要持续监测模拟信号变化的场景,如对温度、压力等缓慢变化的物理量进行实时监测,或者对音频信号等连续变化的信号进行采集,以获取实时的数据流。
  • 单次转换模式(ADC_Mode_Single) :单次转换模式下,ADC 只进行一次转换操作,适合在某些特定时刻或事件触发时,仅需要获取一次模拟信号的采样值的情况。比如,在某些按键触发的采样场景中,当按键按下时,触发 ADC 进行一次转换,获取当前的信号状态即可,无需连续采样。

ADC_InitStructure.ADC_NbrOfChannel=1;

这行代码在 ADC(模数转换器)配置中是很重要的,用于指定在扫描模式下需要转换的通道数量。 通常与 ADC_Mode 参数配合使用。当 ADC_Mode 设置为扫描模式(如 ADC_Mode_Scan)时,ADC_NbrOfChannel 决定了扫描过程中要转换多少个通道。 例如,如果 ADC_Mode 设置为扫描模式,并且 ADC_NbrOfChannel=1,那么 ADC 启动后,会按照预先设定的通道顺序(可能是通过另一个参数指定的通道顺序)对第一个通道进行转换,转换完成后就停止扫描,不会继续对其他通道进行转换。 ADC_InitStructure.ADC_ScanConvMode=DISABLE; 用于配置 ADC 是否工作在扫描模式。

  • ENABLE :使能扫描模式,ADC 会按照预先设定的通道顺序依次对多个通道进行转换。
  • DISABLE :不使能扫描模式,ADC 只对单个通道进行转换。

通过以上我们就完成了对ADC的初始化以及配置。

相关推荐
TDengine (老段)43 分钟前
TDengine 开发指南—— UDF函数
java·大数据·数据库·物联网·数据分析·tdengine·涛思数据
学习噢学个屁1 小时前
基于STM32物联网智能鱼缸智能家居系统
c语言·stm32·单片机·嵌入式硬件·物联网·智能家居
Stanford_11061 小时前
关于大数据的基础知识(二)——国内大数据产业链分布结构
大数据·开发语言·物联网·微信小程序·微信公众平台·twitter·微信开放平台
网易独家音乐人Mike Zhou6 小时前
【无人机】MavLink通讯协议的回调解析函数及状态机
单片机·mcu·物联网·嵌入式·无人机·iot
虾球xz8 小时前
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
开发语言·c++·物联网·学习
乄夜19 小时前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
小柯博客1 天前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网
禺垣1 天前
区块链技术概述
大数据·人工智能·分布式·物联网·去中心化·区块链
小智学长 | 嵌入式1 天前
SOC-ESP32S3部分:36-适配自己的板卡
单片机·物联网·esp32