STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)

本篇文章包含的内容

  • 一、ADC 模数转换器
    • 1.1 ADC简介
    • 1.2 逐次逼近型ADC工作原理
    • 1.3 STM32中的ADC基本结构
    • 1.4 STM32中ADC的输入通道
    • 1.5 STM32中的ADC的四种工作模式

​  本次课程采用单片机型号为STM32F103C8T6。
​  课程链接:江科大自化协 STM32入门教程


  往期笔记链接:
  STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出
  STM32学习笔记(二)丨STM32程序调试丨OLED的使用
  STM32学习笔记(三)丨中断系统丨EXTI外部中断
  STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
  STM32学习笔记(五)丨TIM定时器及其应用(输出比较丨PWM驱动呼吸灯、舵机、直流电机)
  STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)
  STM32学习笔记(七)丨TIM定时器及其应用(编码器接口丨用定时器实现编码器测速)


一、ADC 模数转换器

1.1 ADC简介

  ADC(Analog-Digital Converter),意即模拟-数字转换器,简称模数转换器。ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁与ADC相对应,从数字电路到模拟电路的桥梁即DAC(Digital-Analog Convertor),数模转换器。但是STM32中没有DAC外设,所以这里仅作了解即可。

  DAC不是唯一可以实现将数字量转换为模拟量功能的外设,PWM波形同样实现了用数字量对模拟量进行编码的操作。PWM只有完全导通和完全断开两种状态,故其不存在静态功耗。所以在直流电机调速等大功率的引用场景,使用PWM来对模拟量进行编码是比使用DAC的更好的选择。目前DAC的应用场景通常在波形发生领域,例如信号发生器、音频解码芯片等。

  STM32中的ADC是一个12位的逐次逼近型的ADC,最快转换时间1us。“逐次逼近”是ADC的一种工作模式;“12位”指ADC的分辨率,12位AD值的表示范围即 0 ∼ 2 12 − 1 0\sim2^{12}-1 02121,量化值为 0 ∼ 4095 0\sim4095 04095,位数越高,量化结果约精细,对应ADC的分辨率就越高;转换时间1us对应的频率就是1MHz,这就是STM32中ADC的最快转换频率。
  STM32中的ADC的输入电压范围为 0 ∼ 3.3 V 0\sim3.3V 03.3V,对应的转换结果就是 0 ∼ 4095 0\sim4095 04095。ADC的输入电压一般要求都是要在芯片供电的正负极之间变化的。且电压和转换结果都是一一对应的线性关系。
  STM32中的ADC有18个输入通道,可以测量16个外部信号和2个内部信号源。外部的16个信号源即16个GPIO口(可能来自不同的GPIOx,具体要参考引脚定义),在引脚上直接输入模拟信号即可,不需要额外的测量电路;2个内部信号源分别是内部温度传感器和内部参考电压,温度传感器可以测量CPU的温度,内部参考电压是一个1.2V左右的内部基准电压,且这个内部基准电压是不随外部供电电压变化的。当芯片的供电电压不是准确的3.3V时,就可以通过这个内部的基准电压进行校准来得到正确的电压值。
  STM32还拥有两个增强功能:拥有规则组注入组两个转换单元。普通的AD转换流程为:先启动一次转换,之后读值,依次循环。STM32的ADC可以将要转换的通道列为一组,每一次连续转换多个值。规则组用于常规使用,注入组一般用于突发事件。
  STM32中还拥有一个模拟看门狗(AWD),可以自动监测输入电压范围。STM32的ADC一般可以用于测量光线强度、温度。这里的模拟看门狗实现的功能是:监测温度(光强),当其高于某个阈值,或低于某个阈值时,申请中断,之后可以在中断函数中执行相应的操作。

  本节课程使用的STM32F103C8T6的ADC资源为:ADC1、ADC2,10个外部输入通道,即最多只能测量10个外部引脚的模拟信号。上文中提及的16个外部信号源指这个系列最多拥有16个外部信号源。每个芯片型号对应的通道数量可以参考手册。

1.2 逐次逼近型ADC工作原理

  下图所示的即为逐次逼近型ADC的工作原理图(ADC0809)。STM32中的ADC的结构与此类似,学习下面的结构可以帮助我们理解STM32中ADC的工作原理。
STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)_第1张图片

  ADC0809是一个独立的8位逐次逼近型ADC芯片。它拥有IN0~IN7,8个输入通道,通过地址锁存器和译码器电路实现对通道的选择,且每一次转换通道选择开关只能转换一个通道的信号。ADC转换的速度非常快,从信号转换开始到结束只需要几个us的时间,如果想转换多路信号,不必设计多个ADC,只需要在每一次转换前通过多路选择开关选择要转换的通路即可。 STM32的ADC拥有18个输入通道,与这里的8个输入通道的结构相对应。
  ADC内部拥有一个DAC模块,其内部是通过加权电阻网络实现模数转换,可以将逐次逼近寄存器SAR的值转换为对应的模拟电压值,将其电压值再与待测电压相比较,比较结果控制SAR中存储的值,直到DAC输出的电压与外部通道输入的电压近似相等,DAC输入的数据就是外部电压的编码数据了。为了最快找到未知编码的电压,通常使用二分法进行查找。且使用二分法查找未知电压的编码的好处在于:每次选择比较的值( 2 n 2^{n} 2n)恰好为对应二进制数字的每一位的权数,判断过程相当于,从高位到底位依次判断为1还是为0的过程。要找到未知编码的电压,8位ADC需要判断8次,12位ADC需要判断12次。转换结束后,ADC的输入数据就是未知电压的编码,通过8位数字输出端口(D0~D7)进行输出
  结构图上方的EOC(End Of Convert)是转换结束信号。该芯片通过START端口控制转换开始,CLOCK控制ADC内部的转换工作频率。 V R E F ( + ) V_{REF(+)} VREF(+) V R E F ( − ) V_{REF(-)} VREF()是DAC的参考电压,定义数据对应的电压范围(255对应3.3V或5V)。通常芯片的工作电压正极 V c c V_{cc} Vcc V R E F ( + ) V_{REF(+)} VREF(+)相同,接在一起;通常芯片的工作电压负极 G N D GND GND V R E F ( − ) V_{REF(-)} VREF()相同,接在一起。

1.3 STM32中的ADC基本结构

STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)_第2张图片
  STM32中ADC的结构框图如上图所示。其“模拟至数字转换器”模块的工作模式与ADC0809在原理上完全相同。不同点有以下几点:

  1. 普通的ADC多路开关一般只选中一个,STM32的ADC可以同时选中多个通道进行转换,规则组最多同时选中16个通道,注入组一次最多可以选中4个通道。(以餐厅点菜模型为例,普通模式为每次点一个菜,做好菜后上菜;STM32可以做到每次列出一个菜单,规则组一次最多可以列16个菜,注入组一次最多可以列4个菜,做好后依次上菜)

  2. STM32中的ADC的转换结果会被存储在对应的数据寄存器中。对于规则组通道,其只有一个数据寄存器(餐桌上只能摆一个菜),后转换的数据会将之前转换的数据覆盖,之前转换的数据就会丢失。对于规则组通道,要想实现同时转换的功能,最好配合DMA来将转换后的数据及时转运,就可以保证转换的数据不会丢失了。对于注入组通道,它拥有4个数据寄存器(餐厅的VIP坐席,餐桌上一次可以摆四个菜)。对于注入组而言,就不用担心数据覆盖的问题了。一般情况下,使用规则组和DMA就可以满足大部分的使用需求。(这里只讲解规则组使用,注入组自行了解即可)

  3. 结构图的左下角为触发转换信号,对应ADC0809的START信号。STM32的触发转换信号来源有两种:软件触发和硬件触发。硬件触发信号可以来自于定时器的各个通道、定时器TRGO主模式的输出,外部中断EXTI。

      定时器可以通过主模式输出TRGO控制ADC、DAC等外设,用于通过硬件电路自动触发转换。ADC经常需要过一个固定的时间段转换一次,例如可以每隔1ms转换一次。通过定时器,每隔1ms申请一次中断,在中断函数中手动通过软件触发开启一次转换也可以实现功能,但是频繁进中断会对主程序造成一定的影响。并且在不同的中断之间,由于优先级的不同,有可能会使某些中断不能及时得到响应。如果触发ADC的中断没有及时得到响应,那么ADC的转换频率就肯定会受影响了。所以对于这种需要频繁进中断,但是在中断函数中只完成了简单工作的情况,一般都会有硬件电路的支持

  4. 在STM32中, V R E F ( + ) V_{REF(+)} VREF(+)一般和 V D D A V_{DDA} VDDA(ADC模块的正极供电引脚)接在一起, V R E F ( − ) V_{REF(-)} VREF()一般和 V S S A V_{SSA} VSSA(ADC模块的负极供电引脚)接在一起。本课程使用的芯片没有单独的 V R E F ( + ) V_{REF(+)} VREF(+) V R E F ( − ) V_{REF(-)} VREF()的引脚,它在芯片内部就已经和对应引脚连接在一起了。( V D D A V_{DDA} VDDA V S S A V_{SSA} VSSA是STM32模拟部分的电源,例如ADC、RC振荡器、锁相环等,在套件中的最小系统板中已经将 V D D A V_{DDA} VDDA与3.3V、 V S S A V_{SSA} VSSA与GND相连接了)。

  5. 这里ADC的时钟ADCCLK是来自于RCC的APB2时钟。由原理图可得,ADCCLK最大为14MHz,所以ADC预分频器只能选择6分频(得到12MHz)和8分频(得到9MHz)两个值

  6. ADC可以通过DMA请求信号触发DMA转运数据。(这部分内容会在下一小节STM32学习笔记(九)中涉及)

  7. 模拟看门狗的功能是监测指定的通道。可以设置模拟看门狗的阈值高限(12位)、阈值底限(12位)和指定“看门”的通道。只要通道的电压值超过阈值范围,模拟看门狗就会“乱叫”,申请一个模拟看门狗的中断,之后通向NVIC。

  8. 规则组和注入组在转换完成后会生成一个转换完成的信号。EOC为规则组转换完成的信号,JEOC为注入组转换完成的信号。这两个信号会在状态寄存器中置一个标志位,我们通过读取状态寄存器,就可以知道转换是否完成了。同时这两个标志位也可以通过配置通向NVIC申请中断。

STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)_第3张图片

1.4 STM32中ADC的输入通道

  
STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)_第4张图片

1.5 STM32中的ADC的四种工作模式

  


  持续更新完善中……


  原创笔记,码字不易,欢迎点赞,收藏~ 如有谬误敬请在评论区不吝告知,感激不尽!博主将持续更新有关嵌入式开发、机器学习方面的学习笔记~

你可能感兴趣的:(STM32,学习笔记,stm32,单片机,学习)