STM32之ADC

ADC简介

什么是ADC?

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

常见的ADC类型

|------------------|----------|--------------|
| ADC 电路类型 | 优点 | 缺点 |
| 并联比较型 | 转换速度最快 | 成本高、功耗高,分辨率低 |
| 逐次逼近型 | 结构简单,功耗低 | 转换速度较慢 |

常见ADC类型

并联比较型工作示意图

分压部分 + 比较部分 + 编码部分

优点:转换速度快 缺点:成本高、功耗高、分辨率低

逐次逼近型工作示意图

控制电路+ 数码寄存器 + D/A转换器 + 电压比较器

优点:结构简单、低功耗 缺点:转换速度较慢

特点: 分辨率和采样速度相互矛盾, 分辨率越高,采样速率越低

ADC的特性参数

|--------------|-----------------------------------------|
| 分辨率(刻度划分) | 表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等 |
| 转换时间 | 表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高 |
| 精度(物理量的精准程度) | 最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响 |
| 量化误差 | 用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差 |

STM32各系列ADC的主要特性

|------------------|------------|------------|------------|----------------|
| 主要特性 | F1 | F4 | F7 | H7 |
| ADC 类型 | 逐次逼近型 ||||
| 分辨率 | 12位 | 6/8/10/12位 | 6/8/10/12位 | 8/10/12/14/16位 |
| ADC 时钟频率 | 14MHz(max) | 36MHz(max) |||
| 采样时间 | 采样时间越长, 转换结果相对越准确, 但是转换速度就越慢 ||||
| 转换时间 | 与ADC时钟频率、分辨率和采样时间等有关 ||||
| 供电电压 | VSSA :0V,VDDA :2.4V~3.6V(全速运行) ||||
| 参考电压 | VREF-- :0V,VREF+一般为3.3V ||||
| 输入电压 | VREF--≤VIN≤VREF+ ||||

ADC工作原理

ADC框图简介(F1)

①参考电压/模拟部分电压

②输入通道

③转换序列

④触发源

⑤转换时间

⑥数据寄存器

⑦中断

ADC框图简介(F4)

①参考电压/模拟部分电压

②输入通道

③转换序列

④触发源

⑤转换时间

⑥数据寄存器

⑦中断

ADC框图简介(H7)

①VREF+电压

②ADC双时钟域架构

③输入通道

④转换序列

⑤触发源

⑥转换时间

⑦参考电压

⑧ADC核心

⑨数据寄存器

⑩中断

⑪通道预选控制信号

参考电压/模拟部分电压

模拟部分电源 参考电压

ADC供电电源:VSSA、 VDDA (2.4V≤VDDA≤3.6V )

ADC输入电压范围:VREF--≤VIN≤VREF+(即0V≤VIN≤3.3V )

输入通道 F1为例

|----------|-------------|----------|---------|----------|---------|
| ADC1 | IO | ADC2 | IO | ADC3 | IO |
| 通道0 | PA0 | 通道0 | PA0 | 通道0 | PA0 |
| 通道1 | PA1 | 通道1 | PA1 | 通道1 | PA1 |
| 通道2 | PA2 | 通道2 | PA2 | 通道2 | PA2 |
| 通道3 | PA3 | 通道3 | PA3 | 通道3 | PA3 |
| 通道4 | PA4 | 通道4 | PA4 | 通道4 | PF6 |
| 通道5 | PA5 | 通道5 | PA5 | 通道5 | PF7 |
| 通道6 | PA6 | 通道6 | PA6 | 通道6 | PF8 |
| 通道7 | PA7 | 通道7 | PA7 | 通道7 | PF9 |
| 通道8 | PB0 | 通道8 | PB0 | 通道8 | PF10 |
| 通道9 | PB1 | 通道9 | PB1 | 通道9 | 连接内部VSS |
| 通道10 | PC0 | 通道10 | PC0 | 通道10 | PC0 |
| 通道11 | PC1 | 通道11 | PC1 | 通道11 | PC1 |
| 通道12 | PC2 | 通道12 | PC2 | 通道12 | PC2 |
| 通道13 | PC3 | 通道13 | PC3 | 通道13 | PC3 |
| 通道14 | PC4 | 通道14 | PC4 | 通道14 | 连接内部VSS |
| 通道15 | PC5 | 通道15 | PC5 | 通道15 | 连接内部VSS |
| 通道16 | 连接内部温度传感器 | 通道16 | 连接内部VSS | 通道16 | 连接内部VSS |
| 通道17 | 连接内部Vrefint | 通道17 | 连接内部VSS | 通道17 | 连接内部VSS |

转换序列(F1为例)

A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组) 规则组最多可以有16个转换,注入组最多有4个转换

规则组和注入组执行优先级对比
规则序列和注入序列(F1为例)

|------|------------------|---------------|---------|
| 规则序列寄存器控制关系汇总 ||||
| 寄存器 | 寄存器位 | 功能 | 取值 |
| SQR3 | SQ1 [ 4 : 0 ] | 设置第1个转换的通道 | 通道0~17 |
| SQR3 | SQ2 [ 4 : 0 ] | 设置第2个转换的通道 | 通道0~17 |
| SQR3 | SQ3 [ 4 : 0 ] | 设置第3个转换的通道 | 通道0~17 |
| SQR3 | SQ4 [ 4 : 0 ] | 设置第4个转换的通道 | 通道0~17 |
| SQR3 | SQ5 [ 4 : 0 ] | 设置第5个转换的通道 | 通道0~17 |
| SQR3 | SQ6 [ 4 : 0 ] | 设置第6个转换的通道 | 通道0~17 |
| SQR2 | SQ7 [ 4 : 0 ] | 设置第7个转换的通道 | 通道0~17 |
| SQR2 | SQ8 [ 4 : 0 ] | 设置第8个转换的通道 | 通道0~17 |
| SQR2 | SQ9 [ 4 : 0 ] | 设置第9个转换的通道 | 通道0~17 |
| SQR2 | SQ10 [ 4 : 0 ] | 设置第10个转换的通道 | 通道0~17 |
| SQR2 | SQ11 [ 4 : 0 ] | 设置第11个转换的通道 | 通道0~17 |
| SQR2 | SQ12 [ 4 : 0 ] | 设置第12个转换的通道 | 通道0~17 |
| SQR1 | SQ13 [ 4 : 0 ] | 设置第13个转换的通道 | 通道0~17 |
| SQR1 | SQ14 [ 4 : 0 ] | 设置第14个转换的通道 | 通道0~17 |
| SQR1 | SQ15 [ 4 : 0 ] | 设置第15个转换的通道 | 通道0~17 |
| SQR1 | SQ16 [ 4 : 0 ] | 设置第16个转换的通道 | 通道0~17 |
| SQR1 | SQL [ 3 : 0 ] | 设置规则序列要转换的通道数 | 0~15 |

|------|------------------|---------------|---------|
| 注入序列寄存器控制关系汇总 ||||
| 寄存器 | 寄存器位 | 功能 | 取值 |
| JSQR | JSQ1 [ 4 : 0 ] | 设置第1个转换的通道 | 通道0~17 |
| JSQR | JSQ2 [ 4 : 0 ] | 设置第2个转换的通道 | 通道0~17 |
| JSQR | JSQ3 [ 4 : 0 ] | 设置第3个转换的通道 | 通道0~17 |
| JSQR | JSQ4 [ 4 : 0 ] | 设置第4个转换的通道 | 通道0~17 |
| JSQR | JL [ 1 : 0 ] | 设置注入序列要转换的通道数 | 0~3 |

注入序列的转换顺序是从JSQx[ 4 : 0 ](x=4-JL[1:0])开始

触发源(F1)

触发转换的方法有两种:

(1)ADON位触发转换(仅限F1系列)

当ADC_CR2寄存器的ADON位为1时,再单独(其他位不可以改变)给ADON位写1,只能启动规则组转换

(2)外部事件触发转换

外部事件触发转换分为:规则组外部触发和注入组外部触发
规则组外部触发使用方法: 注入组外部触发使用方法:

触发源(F4/F7)

规则组外部触发使用方法: 注入组外部触发使用方法:

触发源(H7)

规则组外部触发使用方法:

参考《STM32H7xx参考手册_V3(中文版).pdf》825页
注入组外部触发使用方法:

转换时间(F1)

(1)如何设置ADC时钟?

例程中如何设置ADC时钟?

(2)如何设置ADC转换时间?

ADC转换时间: TCONV = 采样时间 + (转换时间)12.5个周期

  1. 转换时间

    Tconversion=(分辨率位数+0.5)×TADC_CLKTconversion​=(分辨率位数+0.5)×TADC_CLK​

    • 12位模式:12.5周期(默认)
    • 10位模式 :10.5周期(需配置ADC_Resolution_10b
    • 8/6位模式:8.5/6.5周期

采样时间可通过SMPx[2:0]位设置,x=0~17

SMP = 000:1.5个ADC时钟周期

SMP = 001:7.5个ADC时钟周期

SMP = 010:13.5个ADC时钟周期

SMP = 011:28.5个ADC时钟周期

SMP = 100:41.5个ADC时钟周期

SMP = 101:55.5个ADC时钟周期

SMP = 110:71.5个ADC时钟周期

SMP = 111:239.5个ADC时钟周期
举个例子:ADC时钟频率为12MHz时,ADC最短的转换时间是多少?

TCONV = 采样时间 + 12.5个周期 = 1.5个周期 + 12.5个周期 = 14个周期 = (1/12000000)∗14 s = 1.17us

转换时间(F4/F7)

(1)如何设置ADC时钟?


例程中如何设置ADC时钟?

(2)如何设置ADC转换时间?

ADC转换时间(12位分辨率): TCONV = 采样时间 + 12个周期

采样时间可通过SMPx[2:0]位设置,x=0~18

SMP = 000:3个ADC时钟周期

SMP = 001:15个ADC时钟周期

SMP = 010:28个ADC时钟周期

SMP = 011:56个ADC时钟周期

SMP = 100:84个ADC时钟周期

SMP = 101:112个ADC时钟周期

SMP = 110:144个ADC时钟周期

SMP = 111:480个ADC时钟周期
举个例子:ADC时钟频率为21MHz时,ADC最短的转换时间是多少?

TCONV = 采样时间 + 12个周期 = 3个周期 + 12个周期 = 15个周期 = (1/21000000)∗15 s = 0.71us

转换时间(H7)

(1)如何设置ADC时钟?
(2)如何设置ADC转换时间?

ADC转换时间:TCONV = 采样时间(TSMPL) + 逐次逼近时间(TTSAR)

采样时间可通过SMPx[2:0]位设置,x=0~19

SMP = 000:1.5个ADC时钟周期

SMP = 001:2.5个ADC时钟周期

SMP = 010:8.5个ADC时钟周期

SMP = 011:16.5个ADC时钟周期

SMP = 100:32.5个ADC时钟周期

SMP = 101:64.5个ADC时钟周期

SMP = 110:387.5个ADC时钟周期

SMP = 111:810.5个ADC时钟周期

逐次逼近时间(TTSAR)和分辨率有关,RES[2:0]用于设置分辨率,如:16/14/12/10/8位

逐次逼近时间(TTSAR)和分辨率对应关系表:

举个例子:ADC时钟频率为32MHz时,分辨率为16位,ADC最短的转换时间是多少?

TCONV = TSMPL + TTSAR = (1.5 + 8.5)个ADC周期 = 10个ADC周期 = (1/32000000)∗10s = 0.31us

数据寄存器(F1)

由ADCx_CR2寄存器的ALIGN位设置数据对齐方式,可选择:右对齐或者左对齐

数据寄存器(F4/F7)

由ADCx_CR2寄存器的ALIGN位设置数据对齐方式,可选择:右对齐或者左对齐

数据寄存器(H7)

由OVSS[3:0]和LSHIFT[3:0]位域设置数据对齐方式,可选择:右对齐或者左对齐

中断

F1/F4/F7系列ADC中断事件汇总表:

|------------------------|----------|-----------|
| 中断事件 | 事件标志 | 使能控制位 |
| 规则通道转换结束 | EOC | EOCIE |
| 注入通道转换结束 | JEOC | JEOCIE |
| 设置了模拟看门狗状态位 | AWD | AWDIE |
| 溢出( F1 没有) | OVR | OVRIE |

DMA请求(只适用于规则组)

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

H7系列ADC中断类型

ADC转换模式

单次转换模式和连续转换模式

|----------------|--------|--------|
| CONT | 0 | 1 |
| 转换模式 | 单次转换模式 | 连续转换模式 |

|------------------------|--------------------------------------------------------------|---------------------------------------------------------------------|
| 转换组 / 转换模式 | 单次转换模式 ( 只触发一次转换 ) | 连续转换模式 ( 自动触发下一次转换 ) 注意:只有规则组才能触发该模式 |
| 规则组 | 转换结果被储存在ADC_DR EOC(转换结束)标志位被置1 如果设置了EOCIE位,则产生中断 然后ADC停止 | 转换结果被储存在ADC_DR EOC(转换结束)标志位被置1 如果设置了EOCIE位,则产生中断 |
| 注入组 | 转换结果被储存在ADC_DRJx JEOC(转换结束)标志位被置1 如果设置了JEOCIE位,则产生中断 然后ADC停止 | 转换结果被储存在ADC_DRJx JEOC(转换结束)标志位被置1 如果设置了JEOCIE位,则产生中断 自动注入:将JAUTO位置1 |

扫描模式

|----------------|--------|--------|
| SCAN | 0 | 1 |
| 扫描模式 | 关闭扫描模式 | 使用扫描模式 |

|-------------------------------------|-----------------------------------|
| 关闭扫描模式 | 使用扫描模式 |
| ADC只转换ADC_SQRx或ADC_JSQR选中的第一个通道进行转换 | ADC会扫描所有被ADC_SQRx或ADC_JSQR选中的所有通道 |

不同模式组合的作用

|-----------------|--------------------------------------------|
| 单次转换模式(不扫描) | 只转换一个通道,而且是一次,需等待下一次触发 |
| 单次转换模式(扫描) | ADC_SQRx 和ADC_JSQR 选中的所有通道都转换一次 |
| 连续转换模式(不扫描) | 只会转换一个通道,转换完后会自动执行下一次转换 |
| 连续转换模式(扫描) | ADC_SQRx 和ADC_JSQR 选中的所有通道都转换一次,并自动进入下一轮转换 |

举个例子:

|-----------------|----------------------------------|
| 单次转换模式(不扫描) | 使用ADC单通道,并要求进行一次转换 |
| 单次转换模式(扫描) | 使用ADC多通道,并要求所有通道都转换一次就停止 |
| 连续转换模式(不扫描) | 使用ADC单通道,并要求对该通道连续转换 |
| 连续转换模式(扫描) | 使用ADC多通道,并要求所有通道都转换一次后,自动启动下一轮转换 |

一种比较少用的模式:不连续采样模式(F1手册称为:间断模式),只适用在扫描模式下。

ADC工作模式

工作模式定义了ADC模块的全局运行方式,主要分为以下类型:

1. 独立模式(Independent Mode)
  • 特点:单个ADC独立工作,不与其他ADC交互

  • 配置方法

    c

    复制代码
    hadc.Init.ScanConvMode = DISABLE;  // 禁用扫描模式(单通道)
    hadc.Init.ContinuousConvMode = ENABLE; // 启用连续转换
  • 适用场景:单通道或简单多通道采集

2. 多ADC协同模式(Dual/Triple Mode)
模式 触发方式 典型应用
交替模式 交替触发各ADC 高速信号采集(如STM32H7)
同步规则模式 同步转换相同通道 提高信噪比(求平均值)
同步注入模式 注入组同步触发 关键信号冗余采集
  • 配置示例 (双重交替模式):

    c

    复制代码
    hadc1.Init.DualMode = ADC_DUALMODE_INTERL;
    hadc2.Init.TriggerControlledByADC = ADC_TRIGGER_CONTROLLED_BY_ADC1;
3. 过采样模式(Oversampling)
  • 原理:硬件自动累加多次采样结果,提升分辨率

  • 配置参数

    c

    复制代码
    hadc.Init.OversamplingMode = ENABLE;
    hadc.Init.Oversample.Ratio = ADC_OVERSAMPLING_RATIO_16;
    hadc.Init.Oversample.RightBitShift = ADC_RIGHTBITSHIFT_4;
  • 优势:将12位ADC提升至14-16位有效分辨率

相关推荐
曙曙学编程4 小时前
stm32——NVIC,EXIT
c语言·c++·stm32·单片机·嵌入式硬件
今日待办4 小时前
Arduino Nano33 BLESense Rev2【室内空气质量检测语音识别蓝牙调光台灯】
c语言·单片机·嵌入式硬件·mcu·语音识别·ardunio·arduinonano33
不懂机器人5 小时前
51单片机------中断系统
单片机·嵌入式硬件·51单片机
2501_921290445 小时前
嵌入式第四十六天(51单片机(通信))
单片机·嵌入式硬件·51单片机
IT阳晨。6 小时前
【STM32】时钟树和GPIO
stm32·单片机·嵌入式硬件
DS小龙哥7 小时前
基于STM32F103C8T6的智能家居健康环境监测系统
stm32·嵌入式硬件·智能家居
小白嘎嘎8 小时前
CAN总线学习
单片机·嵌入式硬件·嵌入式
STC_USB_CAN_80518 小时前
TF卡,SD卡:【Ai8051U】FatFs+SD+W25Q测试, AiCube
单片机·嵌入式硬件·51单片机
夜月yeyue9 小时前
嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)
linux·单片机·udp·嵌入式·uboot·bootloard