1.实物图如下:
左侧为电位器,用这个电位器产生0~3.3V连续变化的模拟电压信号。然后接到STM32的PA0口上,之后用STM32内部的ADC读取电压数据,显示在屏幕上。屏幕第一行显示AD转换后的原始数据,第二行是经过处理后的实际电压值。
手动拧电位器,左拧,AD值减少,电压减少;AD值最小为0,电压最小也为0V;右拧,AD值变大,电压增大;AD最大值为4095(2的12次方-1).对应电压3.3V。
GPIO只能读取引脚的电平,结果只能是高电平or低电平。使用ADC后,就可以对高低电平之间任意电压量化,最终用一个变量表示,读取变量,就能得到引脚的具体电压。所以ADC就是电压表,测GPIO的引脚电压,放在变量里。
外接光敏电阻,热敏电阻和反射红外模块,他们的AO,模拟电压输出端分别接在A1,A2,A3引脚。
遮挡光线,温度升高,手靠近有反光,光敏电阻,热敏电阻和反射红外阻值增大。
2.ADC简介
逐次逼近型ADC
独立的8位逼近型芯片。左上方的IN0~IN7为8为输入通道,通道选择开关选择一路,经过比较器。
选择哪一路,看的是左下方的地址锁存和译码。把通道号给ADDA~ADDC,ALE是锁存信号。
注:ADC0809只有八路选择开关。STM32有18路通道选择开关。
比较器的两个电压分别是,外部通道输入电压(未知),已知DAC输出电压。进行判断,如果DAC输出电压较大,调小DAC数据;如果DAC输出电压较小,增大DAC数据。直到DAC与外部通道输入电压相近。即逐渐逼近SAR(二分法)
3.ADC框图
模拟看门狗如上图,模拟看门狗-->注入通道数据寄存器和规则通道数据寄存器。若超过阈值,就申请看门狗事件传递给上方并预警,最终给NVIC的ADD中断。
以下为ADC框图中的16个引脚的具体说明:
16个外部输入引脚,两个内部输入,共18个通道。
注:选择时,较高级,一次性规则通道最多选择16个;注入通道最多选择4个。但是规则通道数据寄存器一次性只能处理一个通道的数据,需要DMA请求来将处理过的请求搬运走。
注入通道数据寄存器可以同时处理4个通道的数据。
以下为ADC框图的START(开始转换信号)具体说明:
触发ADC转换的信号有两种:1.软件触发。2.硬件触发(如上图)
不能反复的触发中断,影响系统的操作。如,需要做到:给TIM31定1ms时间,更新事件选择为TRGO输出,ADC选择开始触发信号为TIM3的TRGO。此时,TIM3的更新事件就通过硬件自动触发ADC转换。不需要触发中断了。
VREF+,VREF-是ADC的参考电压,决定ADC输入电压的范围。VDDA,VSSA是ADC的供电引脚。一般情况下,VREF+接VDDA;VREF-接VSSA。(也可能在芯片内部就已经接好)
ADCLOCK是CLOCK,是用于驱动内部逐次比较的时钟。
ADC预分频器是来自于RCC的。如下图:
注:此处的ADC是72MHz,但是ADCCLOCK最大是14MHz,所以只能选择6分频,8分频。
4.ADC基本结构图(总结/简化上图)
5.输入通道(16个外部通道):
注:ADC1,ADC2引脚基本相同,我们用的芯片没有ADC3,且没有PC0~PC5(通道10~通道15).
ADC参数中有控制转换(单次转换,连续转换),扫描模式(扫描模式还是非扫描模式).
非扫描模式:只能选择一个,只有序列一(里面可写如通道2)起作用,可选择。此时ADC对通道2进行模数转换。转换结果完成后将结果放在数据寄存器里,同时给EOC标志位置1。因此,直接判断EOC标志位,如果转换完了,就读取数据寄存器的结果。(单次转换;可反复操作,但需要等待)若想更换通道,则再启动前就改为通道2。(连续转换:可以自动转换)
注:如果是连续转换,还需要配置参数:通道数目(作用是例如规定7,只看前七个通道,其他的不看)
6.转换模式:
7.触发控制:
8.数据对齐(12位数据转16位数据):一般选择数据右对齐(直接最高位补4个0),如果选择左对齐,则数据比实际数据大了2的4次方,即16倍。
转换时间:
采样时间是采样保持花费的时间,在程序中可配置。采样时间越大,毛刺信号(不理想信号)越少。12.5个ADC周期是量化编码花费的时间。
校准:
注:此处只需要记得有校准操作和代码即可,不需要理解。
9.硬件电路:
电阻不能太小,否则会费电甚至烧损。
注:想更了解的,可翻看参考手册STM32F10XXX(中文)的第11章节,模拟/数字转换