ADC

ADC

1. ADC介绍

Analog-to-Digital Converter(模拟数字转换器),用于将模拟信号转换为数字形式,以便在数字系统中进行处理。一般传感器会把观测的物理量转换为电压值,也就是所谓的模拟信号。ADC转换器就是把模拟的物理量(电压值)转换为计算机认识的数字量。

ADC有三种常见类型:

  • 逐次逼近型(Successive Approximation)
    • 这是最常见的ADC类型之一,通过逼近法逼近模拟信号的大小
    • STM32中的ADC通常采用这种类型。
  • Sigma-Delta型
    • 通过比较信号的累积值和一个参考值,产生一个高精度的输出。
  • Flash型
    • 通过一组比较器和编码器,以高速并行方式进行转换,适用于高速应用。

image-20250420161243166

ADC建立了模拟量和数字量之间的联系。

STM32F103系列提供了3个ADC,精度为12位,每个ADC最多有16个通道和2个内部信号源。

STM32F103的ADC是一种逐次逼近型模拟数字转换器。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

2. ADC工组原理

image-20250420163840193

2.1 两个阶段

  • 采样阶段
    • ADC首先对模拟信号进行采样,即在一定时间内获取信号的瞬时值。
  • 量化阶段
    • 采样后的模拟信号通过量化器,将其转换为相应的数字形式。
    • 这个数字形式通常是二进制代码.

2.2 主要参数

image-20250420174615202

  • 参考电压(Reference Voltage)

    • ADC使用参考电压来确定模拟信号的幅度范围。
    • VDDA 模拟电源正
    • VSSA 模拟电源负
    • VREF+ 模拟参考电压正
    • VREF- 模拟参考电压负
    • 在实际电路设计中
      • 一般 VREF+ 和 VDDA 接3.3V
      • 一般VREF-和VSSA接地
      • 所以ADC的测量范围是0-3.3V
  • 通道数(Number of Channels)

    • 表示ADC能够同时处理的模拟输入通道的数量,一共18个。
      • 16个外部通道(ADCx_IN0-ADCx_IN15),对应着16个IO口
      • 内部温度传感器(测量芯片温度),通道16
      • 内部参考电压,通道17
    • 多通道ADC可以同时转换多个信号
    • 两个通道组
      • 注入通道
        • 注入通道组内的通道转换完成之后,会把转换后的结果存储到注入通道数据寄存器中。
        • 注入组允许最多4个通道
        • 注入通道数据寄存器有4个,不用担心数据被覆盖问题。
      • 规则通道
        • 规则通道组内的通道转换完成之后,会把转换后的结果存储到规则通道数据寄存器中。
        • 规则组允许最多16个通道
        • 由于规则通道寄存器寄存器只有一个,当多路要转换时,寄存器的内的值要及时取走,否则后面通道转换结果会覆盖前面的结果
        • 一般会使用DMA把数据寄存器的数据取走
      • 注入通道的转换可以打断规则通道的转换
  • 采样率(Sampling Rate)

    • 表示ADC每秒可以进行多少次采样。
    • 采样率越高,ADC能够捕获更高频率的信号。
  • 转换时间(Conversion Time)

    • 表示ADC从开始转换到完成转换所需的时间。
    • 转换时间通常由ADC的时钟频率和分辨率决定。
  • 分辨率(Resolution)

    • 表示ADC可以将模拟信号分成多少个离散级别。
    • 以数字信号的位数N来表示,一般有10位、12位、16位等
    • 12位ADC具有4096个离散级别。
  • 触发源

    • 软件触发
      • 操作控制寄存器ADC_CR2的一些相关位。
    • 硬件触发
      • 使用定时器的TRGO触发。
  • 转换方式

    • ADC_CR1寄存器SCAN:扫描模式 (Scan mode)

      • 开启扫描模式: 多通道,顺序扫描,挨个转换。
      • 关闭扫描模式: 只转换通道组中第一个通道。
    • ADC_CR2寄存器CONT:连续转换 (Continuous conversion)

      • 开启连续模式:通道组内转换一轮之后,继续转换下一轮。不会停。
      • 关闭连续模式:通道组内转换一轮之后,停止转换,等待下次启动。(单次转换)

3. 逐次逼近型

image-20250420172011017

ADC核心组件

  • 比较器
    • 用来比较电压大小
    • 有两个输入端
      • +输入端
      • -输入端
    • 有一个输出端
      • 若 + > - 输出高电平
      • 若 + < - 输出低电平
  • 8位寄存器
    • 用来存放比较结果
    • 从左往右置位
    • 高电平为1,低电平为0
  • 8位DA转换器
    • 根据参考电压把寄存器的值换算成模拟电压
    • 转换后的电压接入到比较器的 – 端,与 + 端的待测电压进行比较
  • 逻辑控制电路
    • 输入高电平,说明待测电压大
    • 输入低电平,说明待测电压小
  • 输出部分
    • 根据8位寄存器的值,输出最终转换后的结果

3.1 转换过程分析

假设参考标准电压为255V,ADC的分辨率为8位。

  1. 8位寄存器最高位置1 0x80

  2. 传递给DA转换器,得到电压位 0x80=128V

  3. 比较器进行比较 33V < 128V,输出低电平

  4. 逻辑控制电路刚才的位置0,下一位置1 0x40

  5. 0x40 = 64V

  6. 比较器进行比较 33V < 64V,输出低电平

  7. 逻辑控制电路刚才的位置0,下一位置1 0x20

  8. 0x20 = 32V

  9. 比较器进行比较 33V > 32V,输出高电平

  10. 逻辑控制电路刚才的位置1保留,下一位置1 0x30

  11. 0x30 = 48V

  12. 比较器进行比较 33V < 48V,输出低电平

  13. 逻辑控制电路刚才的位置1去掉,下一位置1 0x28

  14. ….

  15. 经过逐步逼近,一直比较到最后一位:0x21=33V

  16. 最后把寄存器的值输出

4. 中断

  • 转换结束中断

数据转换结束后,可以产生中断,中断分为三种:规则通道转换结束中断注入转换通道转换结束中断模拟看门狗中断。其中转换结束中断很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以根据中断类型写相应配套的中断服务程序。

  • 模拟看门狗中断

当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由 ADC_LTR 和 ADC_HTR 设置。例如我们设置高阈值是2.5V,那么模拟电压超过 2.5V 的时候,就会产生模拟看门狗中断,反之低阈值也一样。

5. DMA 请求

规则和注入通道转换结束后,除了产生中断外,还可以产生DMA请求,把转换好的数据直接存储在内存里面。要

只有ADC1和ADC3可以产生DMA请求。

6. 数据对齐

16位的寄存器只用到了其中的12位。

可以使用高12位,数据就是左对齐。

也可以使用低12位,数据就是右对齐。

  • 右对齐:高4位补零,读取的值就是实际值。

image-20250420174212686

  • 左对齐:低4位补零,读取的值是实际值的16倍。

image-20250420174239338

7. 转换时间

ADC使用若干个ADC_CLK周期对输入电压采样。总转换时间如下计算:

TCONV = 采样时间 + 12.5个ADC周期。

当ADCCLK=14MHz,假设采样时间为1.5周期。

TCONV = 1.5 + 12.5 = 14周期 = 1μs。

8. 电压转换

模拟电压经过ADC转换后,是一个12位的数字值,如果通过串口以16进制打印出来的话,可读性比较差,那么有时候就需要把数字电压转换成模拟电压,也可以跟实际的模拟电压(用万用表测)对比,看看转换是否准确。

一般在设计原理图的时候会把ADC的输入电压范围设定在:0~3.3v,因为ADC是12位的,那么12位满量程对应的就是 3.3V,12位满量程(全部是1)对应的数字值是:2^12-1。数值 0 对应的就是0V。

如果转换后的数值为X ,X对应的模拟电压为 Y,那么会有这么一个等式成立:(2^12 -1)/ 3.3 = X / Y,所以Y =(3.3 * X )/(2^12 – 1)= 3.3 * X / 4095。