STM32学习笔记【25.ADC】

STM32学习笔记【25.ADC】

文章目录

  • 前言
    • 1. ADC介绍
      • 1.1 什么是ADC?
      • 1.2 ADC工作原理(逐次逼近型)
      • 1.3 ADC特性参数
    • 2.ADC框图
    • 3. ADC的一些细节
      • 3.1 输入通道
      • 3.2 规则组/注入组
      • 3.3 转换顺序
      • 3.4 触发转换方法
      • 3.5 转换时间
      • 3.6 中断及事件
      • 3.7 校准
      • 3.8 单次转换和连续转换
      • 3.9 扫描模式
    • 4.ADC寄存器
      • 4.1 ADC状态寄存器(ADC_SR)
      • 4.2 ADC控制寄存器1(ADC_CR1)
      • 4.3 ADC控制寄存器2(ADC_CR2)
      • 4.4 ADC采样时间寄存器1(ADC_SMPR1)
      • 4.5 ADC采样时间寄存器2(ADC_SMPR2)
    • 5. ADC库函数
  • 总结

前言

本文介绍ADC(模拟/数字转换器)相关内容,它是一种12位逐次逼近型模拟数字转换器,建立模拟电路到数字电路的桥梁。


1. ADC介绍

1.1 什么是ADC?

全称:Analog-to-Digital Converter,指模拟/数字转换器。

ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。


12位ADC是一种逐次逼近型模拟数字转换器(0~4095)。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。
ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超过用户定义的高/低阈值。

ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道

1.2 ADC工作原理(逐次逼近型)

1.3 ADC特性参数

ADC的性能指标

  • 量程:能测量的电压范围
  • 分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如:8、10、12、16位等;位数越多,分辨率越高,一般来说分辨率越高,转化时间越长
  • 转换时间(采样时间):从转换开始到获得稳定的数字量输出所需要的时间称为转换时间。转换时间越长,转换结果相对越准确,但是转换速度就越慢。

ADC特性

  • 12位精度下转换速度可高达1MHz
  • 供电电压:VSSA:0V,VDDA:2.4V~3.6V
  • ADC输入范围:VREF- ≤ VIN ≤ VREF+,0~3.3V
  • ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中

2.ADC框图

参考手册156页,原图可能有点难理解,看简图

3. ADC的一些细节

3.1 输入通道

ADC说白了就是一个电压表

总共2个ADC(ADC1,ADC2),每个ADC有18个转换通道:16个外部通道、2个内部通道(温度传感器、内部参考电压)。

两个通道同时用,分时复用

3.2 规则组/注入组

规则组【16个转换】:流水线
注入组【最多4个转换】:测量过程中,有紧急的,优先处理紧急的转换。【与中断很像】

3.3 转换顺序

每个ADC规则通道只有一个数据寄存器,16个通道一起共用这个寄存器,所以需要指定规则转换通道的转换顺序。

规则通道中的转换顺序由三个寄存器控制:SQR1、SQR2、SQR3,它们都是32位寄存器。SQR寄存器控制着转换通道的数目和转换顺序,只要在对应的寄存器位SQRx中写入相应的通道,这个通道就是第x个转换。


和规则通道转换顺序的控制一样,注入通道的转换也是通过注入寄存器来控制,只不过只有一个JSQR寄存器来控制,控制关系如下:

注入序列的转换顺序是从JSQx[ 4 : 0 ](x=4-JL[1:0])开始。只有当JL=4的时候,注入通道的转换顺序才会按照JSQ1、JSQ2、JSQ3、JSQ4的顺序执行。

3.4 触发转换方法

  1. 通过向控制寄存器ADC-CR2的ADON位写1来开启ADC,再将SWSTART位置1,启动规则通道转换【软件方式】
  2. 通过外部事件(如定时器)进行转换。【硬件方式】

3.5 转换时间

ADC是挂载在APB2总线(PCLK2)上的,经过分频器得到ADC时钟(ADCCLK),最高14MHz。

转换时间=采样时间+12.5个周期

12.5个周期是固定的,一般我们设置PCLK2=72M,经过ADC预分频器能分频到最大的时钟只能是12M,采样周期设置为1.5个周期,算出最短的转换时间为1.17us。

72÷6 = 12
最短转换时间是14÷12 = 1.1666≈1.17us(微秒)
1us = 1M频率

3.6 中断及事件

中断事件事件标志使能控制位
规则通道转换结束EOCEOCIE
注入通道转换结束JEOCJEOCIE
设置了模拟看门狗状态位AWDAWDIE

DMA请求(只适用于规则组)
规则组每个通道转换结束后,除了可以产生中断外,还可以产生DMA请求,我们利用DMA及时把转换好的数据传输到指定的内存里,防止数据被覆盖。

3.7 校准

ADC有一个内置自校准模式。
校准可大幅减小因内部电容器组的变化而造成的准精度误差。
在校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。

通过设置ADC_CR2寄存器的CAL位启动校准。一旦校准结束,CAL位被硬件复位,可以开始正常转换。建议在上电时执行一次ADC校准。
校准阶段结束后,校准码储存在ADC_DR中。
建议在每次上电后执行一次校准。

3.8 单次转换和连续转换

单次转换:只转换一次
连续转换:转换一次之后,立马进行下一次转换

3.9 扫描模式

关闭扫描模式:只转换ADC_SQRx或ADC_JSQR选中的第一个通道
打开扫描模式:扫描所有被ADC_SQRx或ADC_JSQR选中的所有通道

4.ADC寄存器

4.1 ADC状态寄存器(ADC_SR)


关注:

  1. EOC位:转换结束位 (End of conversion)
    流水线上所有通道转换完成后,EOC位置1

4.2 ADC控制寄存器1(ADC_CR1)


关注:

  1. 位8:SCAN位——扫描模式(Scan mode)

4.3 ADC控制寄存器2(ADC_CR2)


所有位都需要关注

  1. TSVREFE:温度传感器和VREFINT使能
  2. SWSTART:开始转换规则通道【常用规则组】
  3. JSWSTART:开始转换注入通道
  4. EXTTRIG:规则通道的外部触发转换模式
  5. EXTSEL[2:0]:选择启动规则通道组转换的外部事件——常用SWSTART,软件触发模式
  6. JEXTTRIG:注入通道的外部触发转换模式
  7. JEXTSEL[2:0]:选择启动注入通道组转换的外部事件
  8. ALIGN:数据对齐
  9. DMA:直接存储器访问模式
  10. RSTCAL:复位校准
  11. CAL:A/D校准
  12. CONT:连续转换
  13. ADON:开/关A/D转换器

4.4 ADC采样时间寄存器1(ADC_SMPR1)

每个通道进行配置
通道10~17

4.5 ADC采样时间寄存器2(ADC_SMPR2)

对通道0~9进行配置

后面几个寄存器:【见参考手册】

  1. ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x=1…4)
    4个通道

  2. ADC看门狗高阀值寄存器(ADC_HTR)
    【做了解】

  3. ADC看门狗低阀值寄存器(ADC_LRT)

  4. ADC规则序列寄存器1(ADC_SQR1)

  5. ADC规则序列寄存器2(ADC_SQR2)

  6. ADC规则序列寄存器3(ADC_SQR3)

  7. ADC注入序列寄存器(ADC_JSQR)

  8. ADC 注入数据寄存器x (ADC_JDRx) (x= 1…4)

  9. ADC规则数据寄存器(ADC_DR)
    最后顺序不一样

5. ADC库函数

// ADC工作参数配置

HAL_ADC_Init()

// 校准

HAL_ADCEx_Calibration_Start()

// Msp初始化

HAL_ADC_MspInit()

// 通道配置

HAL_ADC_ConfigChannel()

// 开始干活

HAL_ADC_Start()

// 通过DMA搬运出来

HAL_ADC_Start_DMA()

// 阻塞方式

HAL_ADC_PollForConversion()HAL_ADC_GetValue()

总结

ADC是12位模拟数字转换器,重点了解其工作原理和框图,了解寄存器和一些库函数,为后续三个ADC通道采集实验做准备。