目录
1 ADC介绍
1.1 模拟信号&数字信号
1.2 模数转换ADC
1.3 ADC分类
2 STM32 ADC
2.1 功能框图
2.1.1 ADC电源和参考电压
2.1.2 输入通道
2.1.3 通道和转换顺序
2.1.4 触发源
2.1.5 转换时间
2.1.6 数据寄存器
2.1.7 模拟看门狗
模拟信号是用连续变化的数值来表示要说明的信息,在时间上是连续的,如果用数值表示需要一系列无限个数值,并且要表示精确可能需要小数点后很多位数
数字信号是用有限个“0”和“1”的代码来表示信息中某一个字符,当很多字符组合起来时,才能表达完整的信息
模拟数据是由传感器采集得到连续变化的值,例如温度、压力,以及目前在电话、无线电和电视广播中的声音和图像
数字数据则是模拟数据经量化后得到的离散的值,例如在计算机中用二进制代码表示的字符、图形、音频与视频数据
ADC常见的量化指标:
1、分辨率:指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与的比值,又称为精度,通常以数字信号的位数来表示。比如12位的ADC,那么它的分辨率就是,即4096,如若你的模拟量是温度,测温范围是0~100度,那么你就可以把100度分成4096份,当温度有100/4096度的变化时,都可以测量出来
2、ADC的参考电压:将模拟电压值转换为数字值的电压基准,由于数字信号本身不具有实际意义,仅仅表示一个相对大小,故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小,即模数转换器可进行转换的电压范围:0~REF(引脚输入的参考电压),输出的数字量则表示输入信号相对于参考信号的大小
总结:ADC是测量0~(参考电压)模拟量电压的器件,所以一般通过传感器把其他(温度、湿度、电流、压力等)转换为模拟量电压信号,然后使用AD转换,得到转换结果后可以反推出原始模拟量信息
根据A/D转换器的速度和精度,大致可以分为三类:
1、高速低(或中等)精度A/D转换器,具体的结构有全并行、两步型、插值折叠型和流水线型,此类A/D转换速度快,但是精度不高,消耗功耗大,占用的芯片面积也很大,主要用于视频处理、通信、高速数字测量仪器和雷达等领域
2、中速中精度A/D转换器,这一类型的A/D转换器是以速度来换取精度,如逐次逼近型A/D转换器,这一类A/D转换器的数据输出通常是串行的,它们的转换速度在几十kHz到几百kHz之间,精度也比高速A/D转换器高,主要用于传感器、自动控制、音频处理等领域
3、中速或低速高精度A/D转换器,此类A/D转换器速度不快,但精度很高(16~24位),如∑-A/D转换器,该类型A/D转换器主要用于音频、通信、地球物理测量、测试仪、自动控制等领域
STM32F407内部集成3个最高有12位的ADC(ADC1、ADC2、ADC3),它们是逐次逼近型模数转换器
主要特性:
可配置的转换精度:6位、8位、10位、12位
转换电压范围:0~(一般接到3.3V电源,不能超过STM32芯片电源电压)
19个转换通道:16个外部通道(IO引脚)+3个内部通道(温度传感器、内部电压参考、电池供电监测)
采样时间可配置
扫描方向可配置
多种转换模式:单次、连续
数据存放对齐方式可配置:左对齐、右对齐
启动转换方式可配置:软件触发、硬件触发
可设置上下门限的模拟看门狗
DMA功能
在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
名称 |
信号类型 |
备注 |
VREF+ |
正模拟参考电压输入 |
ADC高/正参考电压, 1.8V ≤ VREF+ ≤ VDDA |
VDDA |
模拟电源输入 |
模拟电源电压等于VDD, 2.4V ≤ VDDA ≤ VDD(3.6V) 1.8V ≤ VDDA ≤ VDD(3.6V) |
VREF- |
负模拟参考电压输入 |
ADC低/负参考电压, VREF- = VSSA |
VSSA |
模拟电源接地输入 |
模拟电源接地电压等于VSS |
可通过将ADC_CR2寄存器中的ADON位置1来为ADC供电,首次将ADON位置1时,会将ADC从掉电模式中唤醒
SWSTART或JSWSSTART位置1时,启动AD转换
可通过将ADON位清零来停止转换并使ADC进入掉电模式,在此模式下,ADC几乎不耗电
ADC1 |
ADC2 |
ADC3 |
|
通道0 |
PA0 |
PA0 |
PA0 |
通道1 |
PA1 |
PA1 |
PA1 |
通道2 |
PA2 |
PA2 |
PA2 |
通道3 |
PA3 |
PA3 |
PA3 |
通道4 |
PA4 |
PA4 |
PF6 |
通道5 |
PA5 |
PA5 |
PF7 |
通道6 |
PA6 |
PA6 |
PF8 |
通道7 |
PA7 |
PA7 |
PF9 |
通道8 |
PB0 |
PB0 |
PF10 |
通道9 |
PB1 |
PB1 |
PF3 |
通道10 |
PC0 |
PC0 |
PC0 |
通道11 |
PC1 |
PC1 |
PC1 |
通道12 |
PC2 |
PC2 |
PC2 |
通道13 |
PC3 |
PC3 |
PC3 |
通道14 |
PC4 |
PC4 |
PF4 |
通道15 |
PC5 |
PC5 |
PF5 |
通道16 |
连接到内部温度传感器 |
连接内部VSS |
连接内部VSS |
通道17 |
连接到Vref_int |
连接内部VSS |
连接内部VSS |
通道18 |
连接到VBAT |
连接内部VSS |
连接内部VSS |
共16条复用通道,可以将转换分为两组:规则转换和注入转换,每个组包含一个转换序列,该序列可以按任意顺序在任意通道上完成
规则通道:即规规矩矩按照顺序来转换
注入通道:注入可以理解为插队,当规则转换中有注入通道插队,那么得先转换注入通道,再接着转换规则通道
规则序列:规则序列寄存器有3个,分别是SQR3、SQR2、SQR1
三个寄存器控制着16个通道的转换顺序
若使通道16第一个转换,则在SQ1[4:0]写16即可;若使通道1第八个转换,则在SQ8[4:0]写1即可;
具体使用多少个通道,由SQR1的位L[3:0]决定,最多16个通道
寄存器 |
寄存器位 |
功能 |
取值 |
SQR3 |
SQ1[4:0] |
设置第1个转换的通道 |
通道0~18 |
SQ2[4:0] |
设置第2个转换的通道 |
通道0~18 |
|
SQ3[4:0] |
设置第3个转换的通道 |
通道0~18 |
|
SQ4[4:0] |
设置第4个转换的通道 |
通道0~18 |
|
SQ5[4:0] |
设置第5个转换的通道 |
通道0~18 |
|
SQ6[4:0] |
设置第6个转换的通道 |
通道0~18 |
|
SQR2 |
SQ7[4:0] |
设置第7个转换的通道 |
通道0~18 |
SQ8[4:0] |
设置第8个转换的通道 |
通道0~18 |
|
SQ9[4:0] |
设置第9个转换的通道 |
通道0~18 |
|
SQ10[4:0] |
设置第10个转换的通道 |
通道0~18 |
|
SQ11[4:0] |
设置第11个转换的通道 |
通道0~18 |
|
SQ12[4:0] |
设置第12个转换的通道 |
通道0~18 |
|
SQR1 |
SQ13[4:0] |
设置第13个转换的通道 |
通道0~18 |
SQ14[4:0] |
设置第14个转换的通道 |
通道0~18 |
|
SQ15[4:0] |
设置第15个转换的通道 |
通道0~18 |
|
SQ16[4:0] |
设置第16个转换的通道 |
通道0~18 |
|
L[3:0] |
需要转换多少个通道 |
1~16 |
注入序列:注入序列寄存器JSQR只有一个,最多支持4个通道,具体由JSQR的JL[2:0]决定
寄存器 |
寄存器位 |
功能 |
取值 |
JSQR |
JSQR1[4:0] |
设置第1个转换的通道 |
通道0~18 |
JSQR2[4:0] |
设置第2个转换的通道 |
通道0~18 |
|
JSQR3[4:0] |
设置第3个转换的通道 |
通道0~18 |
|
JSQR4[4:0] |
设置第4个转换的通道 |
通道0~18 |
|
JL[1:0] |
需要转换多少个通道 |
1~4 |
单次转换模式:单次转换模式下,ADC执行一次转换,CONT位为0时,可通过以下方式启动:
1、将ADC_CR2寄存器中的SWSTART位置1(仅适用于规则通道)
2、将JSWSTART位置1(适用于注入通道)
3、外部触发(适用于规则通道或注入通道)
完成所选通道转换之后:
若转换了规则通道,则:
1、转换数据存储在16位ADC_DR寄存器中
2、EOC(转换结束)标志置1
3、EOCIE位置1时将产生中断
若转换了注入通道,则:
1、转换数据存储在16位ADC_JDR1寄存器中
2、JEOC(注入转换结束)标志置1
3、JEOCIE位置1时将产生中断
然后,ADC停止
连续循环转换模式:在连续转换模式下,ADC结束一个转换后立即启动一个新的转换,CONT位置1时,可通过外部触发或将ADC_CR2寄存器中的SWSTRT位置1来启动此模式(仅适用于规则通道)
每次转换之后:
若转换了规则通道组,则:
1、上次转换的数据存储在16位ADC_DR寄存器中
2、EOC(转换结束)标志置1
3、EOCIE位置1时将产生中断
ADC转换可以由控制寄存器ADC_CR2的位ADON来启动,也可以由外部事件的触发来启动转换
使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换
使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发
触发源的选择由ADC_CR2的EXTSE[3:0]和JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源,JEXTSEL[3:0]用于选择注入通道的触发源,选择好触发源后,控制ADC_CR2的EXTTRIG和JEXTTRIG这两位来激活触发源
若使能了外部触发事件,还可以通过设置ADC控制寄存器2,即ADC_CR2的EXTEN[1:0]和JEXTEN[1:0]来控制触发极性,可以有四种状态:禁止触发检测、上升沿检测、下降沿检测以及上升沿和下降沿均检测
ADC时钟:ADC的时钟来源于ADC预分频器,是由PCLK2(APB2、84MHz)经过ADC预分频器得到,最大为36MHz,通常设置为21MHz,分频因子由ADC通用寄存器ADC_CCR的ADCPRE[1:0]设置,可设置的分频系数有2、4、6、8
采样时间:ADC需要若干个ADC_CLK周期完成对输入的电压进行采样,采样的周期可通过ADC采样时间寄存器ADC_SMPR1和ADC_SMPR2的SMP[2:0]位设置,ADC_SMPR2控制的是通道0~9,ADC_SMPR1控制的通道是10~18,每个通道可以分别设置成不同的时间进行采样,其中采样的周期最小是3个,想要通过设置达到最快的采样,就设置周期为3个,周期等于1/ADC_CLK
当ADC转换完成后,根据转换组的不同,规则组的数据放在ADC_DR寄存器,注入组的数据放在JDRx寄存器,如果使用双重或三重模式那规则组数据是存放在通用寄存器ADC_CDR中的
如下图数据以两种方式对齐,根据ADC_CR2寄存器中的ALIGN位来选择,注入通道组的转换数据将减去ADC_JOFRx寄存器中写入的用户自定义偏移量,因此结果可以是一个负值,SEXT位表示扩展的符号值
对于规则组中的通道,不会减去任何偏移量,因此只有十二个位有效
如果 ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1,这些阈值在ADC_HTR和ADC_LTR的16位寄存器的12个最低有效位中进行编程,可以使用ADC_CR1寄存器中的AWDIE位使能中断
阈值与ADC-CR2寄存器中的ALIGN位的所选对齐方式无关,在对齐之前,会将模拟电压与阈值上限和下限进行比较