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位有效分辨率

相关推荐
点灯小铭9 小时前
基于单片机的多路热电偶温度监测与报警器
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
tianyue10014 小时前
STM32G431 ADC 多个channel 采集
stm32·单片机·嵌入式硬件
清风66666615 小时前
基于单片机的水泵效率温差法测量与报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
z203483152017 小时前
定时器练习报告
单片机·嵌入式硬件
zk0017 小时前
内容分类目录
单片机·嵌入式硬件
安生生申17 小时前
STM32 ESP8266连接ONENET
c语言·stm32·单片机·嵌入式硬件·esp8266
广药门徒17 小时前
电子器件烧毁的底层逻辑与避坑指南
单片机·嵌入式硬件
点灯小铭1 天前
基于单片机的社区医院小型高压蒸汽灭菌自动控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
youcans_1 天前
【动手学STM32G4】(3)STM32G431之定时器
stm32·单片机·嵌入式硬件·定时器
悠哉悠哉愿意1 天前
【嵌入式学习笔记】AD/DA
笔记·单片机·嵌入式硬件·学习