ADC简介
•ADC(Analog-Digital Converter)模拟-数字转换器
•ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁(目前DAC主要应用在波形生成的领域,比如信号发生器、音频解码芯片等)
•12位($ 0-2^{12} $)逐次逼近型ADC,1us转换时间(位数越高,量化结果越精细,分辨率越高)
•输入电压范围:0-3.3V,转换结果范围:0-4095(中间都是一一对应的线性关系)
•18个输入通道,可测量16个外部(16个GPIO口)和2个内部信号源(内部温度传感器、内部参考电压)
•规则组和注入组两个转换单元
•模拟看门狗自动监测输入电压范围(高于或低于某个阈值,执行某些操作,由模拟看门狗自动执行)
•STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道(10个外部引脚)
逐次逼近型ADC

此图描述ADC的内部结构。
左侧IN0-IN7为8路输入通道,通过通道选择开关,选中一路,进行转换。
地址锁存和译码,就是把想选中的通道号,放在ADDA、ADDB、ADDC这三个引脚上,然后用ALE给锁存信号,上面的通道选择开关就自动拨好了。
ADC的转换很快,只需要几us就可以转换完成,如果想转换多路信号,不需要设计多个AD转换器,只需要一个AD转换器,然后加上一个多路选择开关,想转换哪一路,只需要选中对应的开关即可。
比较器可以比较两个电压的大小关系,输入端在左侧,一个是待测电压,一个是DAC的电压输出端(DAC是数模转换器,给它一个数据,可以输出对应的电压)DAC输出的是已知的电压,同时输入到比较器进行比较,如果DAC输出的比较大,就调小DAC数据,直到DAC输出的电压和外部通道电压近似相等,这样DAC输入的数据就是外部电压的编码数据。通过SAR完成。
通过三态锁存缓冲器进行输出,EOC是转换结束信号,START是开始信号,CLOCK为时钟。
VREF+和VREF-为DAC的参考电压。
ADC框图

左侧中间为ADC输入通道,对应16个GPIO口,IN0-IN15,还有2个内部通道,一个是温度传感器,另一个是VREFINT(内部参考电压)
到达模拟多种开关,可以指定想要选择的通道,右侧是多路开关输出,进入模数转换器,执行逐次比较的过程,转换结果放在数据寄存器中,读取寄存器,就知道AD转换结果。
对于普通的ADC,多路开关一般只选中一个,但是这里可以同时选择多个,在转换时还可以分成两个组,规则通道组和注入通道组。其中规则组一次最多选中16个通道,注入组最多选中4个通道。
对于规则组转换,最好配合DMA使用,可以防止覆盖。
左下角为触发转换的部分,开始信号。
对于STM32 ,触发ADC转换的方式有两种
1.软件触发:在程序中调用一段代码,启动转换
2.硬件触发:定时器的通道、TRGO定时器主模式输出等
VREF+和VREF-是ADC的参考电压,决定了ADC输入电压的范围。
VDDA和VSSA是ADC的供电引脚。
一般VREF+接VDDA,VREF-接VSSA。(在STM32内部已经接在一起)
ADC预分频器来自于RCC。ADCCLK最大是14MHZ,只能选择6分频、8分频,结果是12M和9M
DMA请求用于触发DMA进行数据转运。
注入通道数据寄存器(4x16位)和规则通道数据寄存器(16位),用于存放转换结果。
模拟看门狗,存放一个阈值高限和阈值低限,启用看门狗并指定通道,一旦这个通道超过阈值范围,会申请模拟看门狗中断,通向NVIC。
对于规则组和注入组,转换完成之后,也会有EOC转换完成的信号。
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 | |
| 通道10 | PC0 | PC0 | PC0 |
| 通道11 | PC1 | PC1 | PC1 |
| 通道12 | PC2 | PC2 | PC2 |
| 通道13 | PC3 | PC3 | PC3 |
| 通道14 | PC4 | PC4 | |
| 通道15 | PC5 | PC5 | |
| 通道16 | 温度传感器 | ||
| 通道17 | 内部参考电压 | ||
| ADC通道和引脚复用的关系。 |
规则组的四种转换模式
在ADC初始化的结构体中,有2个参数,转换方式和扫描方式,组成4种组合。
单次转换,非扫描模式

写入要转换的通道,只有序列1的位置有效。
在序列1的位置指定选中的通道,比如通道2,然后触发转换,ADC会对通道2进行模数转换,转换完成后放在数据寄存器里,并且EOC标志位置1。判断EOC标志位,转换完了可以在数据寄存器中读取结果。
想再次转换,需要再次触发。想换一个通道转换,在转换之前,把第一个位置通道2改为其他通道,再启动。
连续转换,非扫描模式

只有序列1的位置有效,在一次转换后不会停止,而是立刻开始下一轮,持续下去。
不需要手动转换,也不需要判断EOC值,想要读AD值的时候,直接从数据寄存器读取。
单次转换,扫描模式

单词转换,每触发一次,转换结束后会停下来。
每个位置的通道可以任意选定,且可以重复。
初始化时要给通道数目参数,比如指定通道数目为7,只转换前7个。
为了防止数据被覆盖,需要应用DMA及时把数据移走。
7个通道转换完成后,产生EOC信号,转换结束。
连续转换,扫描模式

在上一个模式的基础上,一次转换完成后,立刻开始下一次转换。
触发控制

规则组的触发源。
数据对其
数据右对齐
数据左对齐
STM32的ADC是12位的,但是数据寄存器是16位的,存在数据对其的问题。
一般使用:右对齐,就是12位的数据向右靠,高位多出补0。得到的数据和实际的一样。
左对齐,就是12位的数据向左靠,低位多出补0。得到的数据比实际的大。要除以16。可以舍弃精度。
转换时间
AD转换的步骤:采样,保持,量化,编码
STM32 ADC的总转换时间为:TCONV = 采样时间 + 12.5个ADC周期
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期:TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
校准
•ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
•建议在每次上电后执行一次校准
•启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
硬件电路





















