- ADC介绍
ADC指的是模拟数字转换器,把模拟信号转换成数字信号。在STM32 MCU上,它有多达19个通道。可测量16个外部和3个内部信号源(从外部GPIO口连接的16通道模拟输入(这是使用了GPIO的模拟功能,如果选择普通GPIO作为ADC信号源的输入,则需要选择GPIO的MODER配置为模拟输入的模式),1通道内部温度传感(VSENSE)输入,1通道的内部参考电压(VREFINT)输入,1通道的外部电池VBAT供电引脚输入)。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐的方式存储在16位数据寄存器中。一般来说对ADC的配置不是很难。只要按照参考手册进行配置就可以了。但是我们采集的数据如何输出为我们想要量化的值就比较难以理解了。在下面的标题3就会详细讲解这一部分。 - ADC 时钟
具有双时钟域构架,ADC时钟(ADC_ CLK)独立于APB时钟(PCLK)。ADC_CLK可由两种可能的时钟源产生。可由RCC寄存器的选择来产生。
选项一:专用的14MHZ内部振荡器
选项二:PCLK时钟/2或/4/(最大不能超过14MHZ的ADC_CLK)
选项1的优势是ADC一直具有最佳的ADC时钟频率(14MHZ)无论HCLK/PCLK时钟方案是如何选择的。 - 重点来了!就是比如我接入一个电池,要测出这个电池电压的大小,怎么操作?
请见下图,并详细的了解一下连接的电池与寄存器中如何存储我们的电压数据:
首先必须弄明白我们的目的是通过GPIO口接入一个电池,采集电池电压的模拟信号量的大小。其中VCC代表我们连接的电池(电压的大小)。如果我们连接的电池电压比GPIO口的参考电压大,就不能直接连接 GPIO 口,否则会烧坏MCU. 这要怎么办呢?可以直接连接两个电阻进行分压,如上图所示GPIO口连接的是R8和R6的中间,使接入GPIO口的电压小于 GPIO 口的参考电压最大值3.3v. 如上图,R8接的是10k, R6接的是39k。V(Voltage)的最大电压是参考电压V(reference)3.3v. 则VCC的电压最大值是:VCC/(R6+R8)=V(Voltage)/R8. 则VCC=V(Voltage)* (R6+R8)/R8=3.3* (39+10)/10=16.17v. 则VCC可以连接的电压范围是0~16.17v.
我们接入VCC电池,首先要算出VCC的值。VCC经过两个电阻分压,使的进入GPIO口的电压数据范围在0~3.3v之内。假设进入GPIO口的电压是V(Voltage),这里有一点要提前弄清楚,必须在开始时设置GPIO的MODER寄存器的模式为模拟输入模式,是模拟输入哦。模拟输入的采样数据是存放在GPIO的ADC->DR寄存器里面,我们要的V(Voltage)就是存放在ADC->DR寄存器里。
看到上面的一段,你一定以为电压值可以直接从ADC->DR中读取出来就可以了,这就大错特错了。存放在ADC->DR的值并不是V(Voltage),如果V(Voltage)的值是1.5v。难道ADC->DR还能存小