ADC详解

之前学习GPIO的时候,我们了解到输入模式中,除了上拉输入,下拉输入和浮空输入,还有一种模拟输入.

什么是模拟输入呢?其中的原理又是怎么样的呢?

模拟输入与测控系统

现代技术的基础是信息技术,构成信息技术的3大支柱分别是计算机技术,测控技术和通信技术.单片机在这三个领域都有涉足,特别是测控技术

单片机的测控技术离不开其测控系统. 那么什么是单片机测控系统呢?

测控,顾名思义,包括两个过程.

    • 实时采集对象的物理参量,诸如温度,压力,流量,速度,转速等.这些参量通常都是模拟量,是连续变化的物理量.
    • 这里的连续有双重含义:
      • 时间意义上的连续,量值随时间连续变化
      • 数值意义上的连续,量值本身连续变化
    • 但模拟量不能直接送给单片机,需要将模拟量转换成数字量,才能送入单片机进行存储和处理.
    • 把采集的数据经过单片机计算,比较等处理后得出结论,以对被控对象实施矫正控制.
    • 但经过单片机处理后得到的是数字量结果,而绝大多数控制执行部件所需要的是模拟量. 因此需要将数字量转换成模拟量

可见,测控系统的实现离不开数字量和模拟量之间的转换,而实现这种转换的关键,就是ADC和DAC.

ADC(Analog-to-Digital Converter)

ADC是模数转换器的英文缩写,是模拟输入通道的关键部分. 而想要清楚的了解ADC,我们还需要了解模拟输入通道

模拟输入通道

模拟输入通道的工作从采集信号开始. 由于传感器采集到的模拟信号幅值通常很小,并且连续变化的信号容易受到干扰,因此,需要对传感器采集到的原始信号进行放大,采样,保持,滤波等处理,才能送给ADC进行处理. 现在先对ADC之前的部分进行介绍

1.传感器

传感器的主要功能就是采集信号,也兼有信号转换的功能,即把采集到的非电信号转换成电信号,以便后续处理.
传感器的种类很多,常用的传感器有如下几种:

  1. 温度传感器: 将温度转换为电信号. 在各种传感器中,温度传感器用量最多,大约占到50%
  2. 光电传感器: 利用光电效应,将光信号转换为电信号. 常用的光电器件包括光敏电阻,光敏二极管,光敏三极管,光电池等
  3. 湿度传感器: 常见的有毛发湿度计,干湿球湿度计,金属氧化物湿敏元件等
  4. 流量传感器: 测量液体和气体的流量. 常用的流量传感器有速度式流量计和容积式流量计等
  5. 压力传感器: 用于大气压力测量和容器壁压力测量等
  6. 机械量传感器: 常用的机械量有拉力,压力,位移,速度,加速度,扭矩及荷重等. 而常见的机械量传感器有电阻应变片,力传感器,荷重传感器,位移传感器和转速传感器等
  7. 成分分析传感器: 用于对混合气体或混合物的成分进行自动分析
  8. ph值传感器: 用于测量水溶液的酸碱度

传感器是测控系统的起点或入口,所以传感器采集和转换信号的能力和质量,将直接影响测控系统的性能. 高质量传感器的输入和输出信号间应具有稳定且重复性好的函数关系.较好的灵敏度和精确度以及较强的抗干扰能力.

2.放大器

传感器得到的电压或者电流信号往往幅度比较小,难以直接进行模数转换,因此需要使用放大器,将得到的模拟信号进行放大处理

放大器的种类很多,但在模拟输入通道中使用的,是一种具有高放大倍数,并带有深度负反馈的直接耦合放大器,由于他可以对输入信号进行多种数学运算,所以称为运算放大器.

运算放大器具有输入阻抗高,增益大,可靠性高,价格低和使用方便等特点. 现在已经有各种专用或者通用的运算放大器可供选择

3.采样/保持电路

3.1 采样

采样是为了跟踪输入信号的变化,其实质是将一个连续变化的模拟信号,转换为时间上离散的采样信号,所以信号采样要按一定的时间间隔进行,并且采样的频率要远高于模拟信号中最高频率成分(一般为2.5倍).

3.2 保持

保持是为了把采样信号保持一段时间,因为其后的ADC转换需要一个时间过程,在保持期间需要维持信号的稳定,尽可能保持信号不变.

在模拟输入通道中,采样和保持电路是合在一起的,成为采样/保持电路,其电路原理如图:
采样/保持电路
图中A1是一个高增益放大器,传感器获取的模拟信号经它输入.
采样开关是一个模拟开关,启动AD转换的时候,将模拟开关闭合. 开关闭合后,输入放大器通过采样开关为保持电容快速充电,这就是AD转换的采样阶段. 随后采样开关断开,进入信号电压保持阶段. 通常把采样开关从接通到断开这一段时间称为采样时间.

跟随器A2和保持电容构成一个放电回路,但是由于A2的输入阻抗很高,所以保持电容的放电很慢,基本上可以满足维持采样信号不变的要求. 保持电压经过A2输出后就可以经过滤波器送到ADC转换器中进行转换.

4.滤波器

测控系统工作时,可能会受到环境影响,存在温度,电场和磁场等多种干扰因素, 从而造成模拟信号中混有多种频率成分的噪声信号. 严重时,干扰信号甚至可能会淹没没有用信号. 为了抑制干扰信号,提高信噪比,在模拟输入通道中还应该使用滤波器.

4.1 模拟滤波

模拟滤波由电子元器件搭建的滤波电路完成,可以分为有源和无源两种

  • 无源滤波
    • 使用无源器件(电感,电容和电阻)构成的滤波电路,其中由电感和电容构成的电路称为LC谐振电路,由电阻和电容构成的电路称为RC谐振电路.
  • 有源滤波
    • 用放大器和电容,电阻构成的滤波电路
    • 有源滤波电路不但能补充能源损耗,而且还兼有信号放大功能,其低频滤波效果更好
4.2 数字滤波

所谓数字滤波,就是通过程序对采样信号进行平滑加工,以提高其有用信号,消除或抑制干扰信号

有多种数字滤波程序,比如程序判断滤波程序,中值滤波程序,算术平均滤波程序,加权平均滤波程序,一阶滞后滤波程序,以及复合滤波程序

与模拟滤波相比,数字滤波具有众多优点,所以在现在测控系统中广泛使用数字滤波. 数字滤波不但不需要硬件设备,而且使用也很方便,只需要在程序进入数据处理或控制算法前,附加一段滤波程序即可.

最后,经过滤波处理的电信号进入AD转换器中,进行AD转换处理.

AD转换器

ADC根据原理划分,可以分成几种类型的ADC

  • 逐次逼近型
    逐次逼近型ADC

逐次逼近型(Successive Approximation)ADC 采用的是一种反馈比较型电路结构。由比较器、DAC、寄存器、时钟脉冲源和控制逻辑等组成:
其原理是,设定一个数字量,通过 DAC 得到一个对应的输出模拟电压。将这个模拟电压和输入的模拟电压信号从最高位开始顺序地相比较,如果两者不相等,则调整所取的数字量,直到两个模拟电压相等为止,最后所取的这个数字量就是所求的转换结果。其过程像用天平去称量位置重量的物体,先加大砝码,再逐次添加或换用小砝码。
逐次逼近型 ADC 的优点是速度高,功耗低,在低分辨率(12 位)下具有性价比优势;缺点是转换速率一般,电路规模中等。

  • Flash型
    Flash型ADC

Flash ADC,属于直接 ADC,能将输入的模拟电压直接转换为输出的数字量,不需要经过中间变量转换。
它由一系列电压比较器组成,每个比较器将输入信号与唯一的分压后的参考电压进行比较.比较器的输出连接编码器电路的输入,产生二进制的输出。
不仅在操作理论方面是最简单的,而且在速度方面也是最有效的 ADC 技术,仅受比较器和栅极传播延迟的限制。不幸的是,对于任何给定数量的输出位,它都是最密集的组件
Flash型 ADC 的转换速度是最快的,但缺点是需要使用很多电压比较器和大规模的代码转换电路(常见的并联比较型输出大都在 8 位以下)。

  • Σ-Δ 型
    Σ-Δ 型ADC

Σ-Δ 调制型 ADC 的原理与Flash型与逐次逼近型 ADC 不同,它不是将采样信号的绝对值进行量化编码,而是将两次相邻采样值之差(增量)进行量化与编码的。
它由线性电压积分器、1位输出量化器、1位输入 DAC 和一个求和电路组成。经过量化器处理输出的数字信号 V0,经过 DAC 转换为模拟信号VF,并负反馈至输入端的求和电路,与输入信号 v1 相减,得到差值 vD。积分器对 vD 作线性积分,输出电压 vINT 至量化器,由量化器量化为1位的数字量输出。由于采用1位输出的量化器,所以在连续工作的状态下,输出信号 V0 是由0和1组成的数据流。
Σ-Δ 调制型 ADC 的优点是可以容易地做到高分辨率测量;缺点是转换速率低、电路规模大。

  • 积分型

输出二进制代码形式

ADC输出的数字量有二进制和BCD两种代码形式,从而形成两种类型芯片,即二进制码AD转换芯片和BCD码AD转换芯片.

  • 二进制码AD转换芯片
    • 输出的是二进制代码,其位数可以分为8,10,12,14,16,20,24等
  • BCD码AD转换芯片
    • 输出的是多位BCD码,这类转换芯片的典型应用是在数字电压表中,输出的BCD码可以直接送到LED或LCD进行显示
    • 常见的位数有三位半,四位半和五位半等

关于BCD码的半位,以三位半ADC为例进行说明.
所谓三位半,实际上是4组BCD码(每组4位共16位二进制数),分别位十进制的千位,百位,十位和个位. 但其中对应百位,十位和个位的BCD码都用来表示数字,即能表示0~9共十个数字; 而对应千位的BCD码中,只用其最低为二进制数表示数字,其值只能为0或1,而剩余三个高位用来表示数值的正负或被测参量的欠量程和过量程等标志,故有半位之称. 这样一来,三位半AD转换芯片的输出数据的绝对值最大为1999

ADC分辨率

分辨率是转换器都被转换量变化敏感程度的描述, 或者说转换器对被转换量变化的分辨能力, 也可以说输入量有多大的变化量转换器输出端才能做出反应.
对于ADC而言,被转换量是电压,所以分辨率是对输入电压信号变化的分辨能力, 即输入电压有多大的变化量才能使输出量改变一个二进制数单位, 因此ADC的分辨率为电压值

对于n位的ADC,其分辨率为满量程输入电压与2n之比,或满量程电压的1/2n
例如,输入电压满量程为10V的12位ADC,由于10V的1/212 为2.4mV,所以这个ADC的分辨率为2.4mV

可见,位数不但影响转换器的接口,而且与分辨率有直接关系.
ADC位数越多,分辨率的值越小,分辨能力越强,转换器对输入量变化的敏感程度越高
所以选择ADC时,要把位数放在重要的位置

ADC的控制信号

AD转换芯片中有一些控制信号,包括时钟信号,转换启动信号和转换结束信号等,接口连接时要对这些信号进行处理.

时钟信号

AD转换需要时钟信号配合.
有些AD转换芯片内部设有时钟电路. 这类芯片无需时钟信号引入,因此没有时钟信号引脚,接口和应用时无需考虑时钟信号问题
而有些AD转换芯片内部没有时钟电路,所需时钟信号由外界提供,因此芯片上有时钟信号引脚. 由这类芯片组成系统时,要注意时钟信号的提供问题.

转换启动信号

转换启动信号由CPU提供,不同型号的AD转换芯片对转换启动信号的要求不尽相同.

  • 有的要求脉冲信号启动
    • 对此可通过执行一条数据传送指令产生 WR ‾ \overline{\text{WR}} WR信号作为启动信号;
  • 有的芯片要求电平信号启动,并且在整个转换过程中电平要一直保持
    • 可使用一个D触发器产生启动信号

转换结束与数据读取

AD转换后得到的数字量数据应及时传送给单片机进行处理,数据传送的关键是如何确认转换完成,因为只有在数据转换完成后,才能进行读取,据此,共有三种读取转换数据的控制方法

  1. 定时等待方式
    对于一个AD转换芯片来说,转换时间作为一项技术指标是已知并且固定的, 因此可以用延时的方法,等待转换结束,这就是定时等待方式. AD转换芯片完成一次转换所需要的时钟周期数是固定的,只要知道了芯片固有的或引入的时钟频率,就有计算出转换时间

例如ADC0809完成一个通道的一次转换需要128个时钟周期,假定ADC0809的时钟信号由80C51的ALE直接提供,80C51使用6MHz晶振,则ADC0809的时钟频率为1MHz,时钟周期为1μs,128个时钟周期即为128μs,即ADC0809的AD转换时间为128μs.
因此可以据此设计一个128μs的延时子程序,AD转换启动后即调用此延时子程序,延迟时间到即转换完成,接着就可以读取转换数据

  1. 查询方式
    AD转换芯片都提供表明转换完成的状态信号. 例如ADC0809的EOC信号.因此可以用查询方式,通过测试EOC的状态就可以知道转换是否完成,可否进行数据传送
  2. 中断方式
    表明转换是否完成的状态信号都可以作为中断请求信号使用, 从而可以采用中断方式进行转换数据的传送

不管使用上述哪种方式,只要确认转换完成,即可通过指令进行数据传送.

下面对STM32中的ADC进行具体分析

STM32 中ADC

STM32系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。

STM32中的ADC具体结构如图所示
STM32中ADC
结构图可以大致分为7个部分,下面分别进行讲解:

1. 电压输入范围

电压输入

ADC所能测量的电压范围就是VREF- ≤ VIN ≤ VREF+,把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为:0~3.3V。

2. 输入通道

输入通道
ADC的信号输入是通过通道实现的,信号通过通道进入单片机,单片机经过转换,将模拟信号转换成数字信号。
STM32中ADC有18个通道,其中16个是外部通道,分别为ADCx_IN0~ ADCx_IN15,这16个通道分别对应着不同的I/O口。 还有两个是内部通道,ADC1的通道一个连接着芯片内部的温度传感器,还有一个连接着Vrefint.而ADC2的通道连接到了内部的VSS.
而外部通道在转换时候又分为规则通道和注入通道两种. 其中规则通道最多16路,注入通道最多4路.

  • 规则通道
    • 规则通道顾名思义就是,最平常的通道、也是最常用的通道,平时的ADC转换都是用规则通道实现的。
  • 注入通道
    • 注入通道是相对于规则通道的,注入通道可以在规则通道转换时,强行插入转换,相当于一个“中断通道”吧。当有注入通道需要转换时,规则通道的转换会停止,优先执行注入通道的转换,当注入通道的转换执行完毕后,再回到之前规则通道进行转换。

3.转换顺序

转换顺序
了解了ADC的两种转换通道后,如果ADC只是用一个通道进行转换,那就很简单. 但是如果ADC使用多个通道进行转换,就涉及到通道的转换顺序了. 通道转换顺序又分为两种: 规则通道转换顺序和注入通道转换顺序

3.1规则通道转换顺序

规则通道中的转换顺序由三个寄存器控制:SQR1,SQR2和SQR3. 他们都是32位寄存器,控制着转换通道的数目和转换顺序. 具体做法是,在寄存器相应的SQx位中写入相应的通道,这个通道就是第x个转换的. 每个寄存器中的0-23位是控制转换顺序位. 其中SQR1的0:3控制通道数目,4:7控制第16个转换通道,依次类推

3.2注入通道转换顺序

和规则通道转换顺序的控制一样,注入通道的转换也是通过注入寄存器来控制,只不过只有一个JSQR寄存器来控制. 其中0:1位控制注入通道的数目. 2:5位控制第四个转换的注入通道.以此类推.
需要注意的是,只有当JL=4的时候,注入通道的转换顺序才会按照JSQ1、JSQ2、JSQ3、JSQ4的顺序执行。当JL<4时,注入通道的转换顺序恰恰相反,也就是执行顺序为:JSQ4、JSQ3、JSQ2、JSQ1。

4. 触发源

触发源
我们已经了解了ADC的转换通道和顺序,那么ADC是如何触发转换的呢?和通信协议类似,都要规定一个起始信号才能传输信息,ADC也需要一个触发信号来实行模/数转换。这种信号可以分为两种:

  • 通过直接配置寄存器触发
    • 通过配置控制寄存器CR2的ADON位,写1时开始转换,写0时停止转换。在程序运行过程中只要调用库函数,将CR2寄存器的ADON位置设置为1就可以进行转换
  • 通过内部定时器或者外部IO触发转换
    • 可以利用内部时钟让ADC进行周期性的转换,也可以利用外部IO使ADC在需要时转换,具体的触发由控制寄存器CR2决定。

5. 转换时间

转换时间
我们已经知道了ADC的输入通道和转换顺序,并且也知道了如何触发转换.那么转换的时间该怎么确定呢?ADC每次的信号转换都需要时间,这个时间就是转换时间.而这个时间的长短,是由采样时间和输入时钟所决定的.

  • 输入时钟
    -由于ADC在STM32中是挂载在APB2总线上的,所以ADC得时钟是由PCLK2(72MHz)经过分频得到的,分频因子由 RCC 时钟配置寄存器RCC_CFGR 的位 15:14 ADCPRE[1:0]设置,可以是 2/4/6/8 分频,一般配置分频因子为8,即8分频得到ADC的输入时钟频率为9MHz。
  • 采样时间
    -采样周期是确立在输入时钟上的,配置采样周期可以确定使用多少个ADC时钟周期来对电压进行采样,采样的周期数可通过 ADC采样时间寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0]位设置,ADC_SMPR2 控制的是通道0-9.ADC_SMPR1 控制的是通道10-17。每个通道可以配置不同的采样周期,但最小的采样周期是1.5个周期,也就是说如果想最快时间采样就设置采样周期为1.5.
  • 转换时间
    • 转换时间= 采样时间 + 12.5周期
    • 12.5个周期是STM32所固定的,是处理一个模拟信号所需要的时间. 一般我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能是 12M,采样周期设置为 1.5 个周期,算出最短的转换时间为 1.17μs。

6.数据寄存器

数据寄存器
经过转换时间后,数据就已经完成转换了. 转换完成后生成的数据就放在数据寄存器中, 但数据寄存器也分为规则通道和注入通道两种

6.1 规则数据寄存器(ADC_DR)

规则数据寄存器负责存放规则通道转换的数据,通过32位寄存器ADC_DR来存放。
当使用ADC独立模式(也就是只使用一个ADC,可以使用多个通道)时,数据存放在低16位中,当使用ADC多模式时高16位存放ADC2的数据。需要注意的是ADC转换的精度是12位,而寄存器中有16个位来存放数据,所以要规定数据存放是左对齐还是右对齐。

当使用多个通道转换数据时,会产生多个转换数据,但数据寄存器只有一个,多个通道产生的数据存放在一个寄存器中会覆盖数据导致ADC转换错误,所以我们经常在一个通道转换完成之后就立刻将数据取出来,方便下一个数据存放。一般开启DMA模式将转换的数据,传输在一个数组中,程序对数组读操作就可以得到转换的结果。

6.2 注入数据寄存器(ADC_JOFRx,x=1,2,3,4)

注入通道转换的数据寄存器有4个,由于注入通道最多有4个,所以注入通道转换的数据都有固定的存放位置,不会跟规则寄存器那样产生数据覆盖的问题。 ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,数据同样分为左对齐和右对齐,具体是以哪一种方式存放,由ADC_CR2 的 11 位 ALIGN 设置。

7. 中断

中断
从图中可以看出,ADC可以产生三种中断:

  • 规则通道转换结束中断
    • 规则通道数据转换完成之后,可以产生一个中断,可以在中断函数中读取规则数据寄存器的值。这也是单通道时读取数据的一种方法。
  • 注入通道转换结束中断
    • 注入通道数据转换完成之后,可以产生一个中断,并且也可以在中断函数中读取注入数据寄存器的值,达到读取数据的作用。
  • 模拟看门狗事件
    • 当输入的模拟量(电压)不再阈值范围内就会产生看门狗事件,就是用来监视输入的模拟量是否正常。

在转换完成后也可以产生DMA请求,将转换好的数据从数据寄存器中读取到内存中

电压转换

要知道,转换后的数据是一个12位的二进制数,我们需要把这个二进制数代表的模拟量(电压)用数字表示出来。比如测量的电压范围是0~3.3V,转换后的二进制数是x,因为12位ADC在转换时将电压的范围大小(也就是3.3)分为4096(2^12)份,所以转换后的二进制数x代表的真实电压的计算方法就是:
y=3.3* x / 4096

ADC的转换模式

ADC有四种转换模式:分别为单次转换非扫描模式、连续转换非扫描模式、单次转换扫描模式、连续转换扫描模式

  • 单次转换和连续转换
    • 单次转换是每触发一次,转换进行一次,转换结束,就会停止. 想要再次转换,需要再次触发
    • 连续转换是触发一次,转换开始进行,转换结束后,会立刻进入下一个转换,不需要再次触发.
  • 扫描模式和非扫描模式
    • 非扫描模式: 单通道模式,只有一个通道进行转换
    • 扫描模式: 多通道模式,一次转换能转换多个通道

扫描模式中,为了防止数据被覆盖,用DMA及时将数据挪走,所有通道转换完成之后产生EOC信号,转换结束
如果在使用扫描模式的情况下使用中断,会在最后一个通道转换完毕后才会产生中断。而连续转换,是在每次转换后,都会产生中断。

DAC(Digital-to-Analog Converter)

测控系统中一些控制对象需要模拟信号进行驱动,例如电动机,变频压缩机,音响,电视等. 于是就要把单片机输出的数字量转换位模拟量,以满足模拟控制的需要. 所以在模拟输出通道中,就要有DAC.

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
采用STM32 HAL库进行ADC控制的步骤如下: 1. 初始化ADC模块 首先,要初始化ADC模块。可以通过下面的代码实现: ```c /* ADC1 initialization */ hadc1.Instance = ADC1; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } ``` 这段代码将ADC1模块初始化为单次转换模式(即转换一次后就停止),数据对齐方式为右对齐,扫描模式为禁用。 2. 配置ADC通道 接下来,需要配置ADC通道。通过下面的代码实现: ```c /* Configure ADC Channel */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } ``` 此处将ADC1的通道0配置为默认的单个转换排名,并且采样时间为71.5个时钟周期。 3. 启动ADC转换 为了启动ADC转换,必须调用启动函数。通过下面的代码实现: ```c /* Start ADC */ if (HAL_ADC_Start(&hadc1) != HAL_OK) { Error_Handler(); } ``` 这里使用的是非阻塞模式启动会话的方式。 ADC将会开始转换,并且在转换完成后产生转换完成事件。 4. 等待ADC转换完成 在ADC转换完成之前,需要等待转换完成。可以通过轮询方式等待转换完成。例如,轮询方式可以如下所示: ```c /* Wait for conversion complete */ if (HAL_ADC_PollForConversion(&hadc1, TIMEOUT_MS) != HAL_OK) { Error_Handler(); } /* Check if the conversion is complete */ if ((HAL_ADC_GetState(&hadc1) & HAL_ADC_STATE_EOC) == HAL_ADC_STATE_EOC) { /* Get the converted value of ADC */ uint16_t adc_value = HAL_ADC_GetValue(&hadc1); } ``` 这里使用HAL库提供的函数`HAL_ADC_PollForConversion`来判断转换是否完成。该函数会阻塞,直至转换完成或者超时。一旦转换完成,就可以使用`HAL_ADC_GetValue`函数读取ADC的结果。 5. 停止ADC转换 当ADC转换完成后,需要将ADC停止,以节省功耗。可以通过下面的函数实现: ```c /* Stop ADC */ if (HAL_ADC_Stop(&hadc1) != HAL_OK) { Error_Handler(); } ``` 这段代码将ADC停止并不再产生转换完成事件。因此,在下一次启动转换之前,应该重新初始化ADC模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值