文章目录
ADC简介
- ADC(Analog-Digital Convert)模拟-数字转换器
- ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁;
- 12位逐次逼近型ADC,1us转换时间;
位数对应的是分辨率,位数越高,量化结果越精细,对应分辨率越高;转换时间对应转换频率,1us表示从AD转换开始,到产生结果需要花1us的时间,对应转换频率为1MHz
- 输入电压范围:0~3.3V,转换结果范围:0 ~4095(2的12次方-1);
- 18个输入通道,可测量16个外部和2个内部信号源;
外部信号源就是16个GPIO口,在引脚上直接接模拟信号就行,引脚能直接测电压;
内部信号源就是内部温度传感器和内部参考电压,温度传感器可以测量CPU的温度,内部参考电压是一个1.2V左右的基准电压,不随外部供电电压变化而变化;
- 规则组和注入组两个转换单元;
- 模拟看门狗自动监测输入电压范围;
模拟看门狗可以监测某些指定通道,当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,我们就可以在中断函数里执行相应的操作;
可以测量光线强度、温度等值,而且如果光线强度、温度等高于某个阈值、低于某个阈值,执行一些操作,此时高于阈值或低于阈值的判断,就可以用模拟看门狗来执行;
- STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道; (即10个外部信号源)
逐次逼近型ADC
- 地址锁存和译码的作用就是,我们想选择哪个通道,就把通道号放在ADDA、ADDB、ADDC三个脚上,然后给一个锁存信号,上面通道选择开关就可以自动拨好了;所以我们可以用一个AD转换器加多路选择实现多路转换;
- 电压比较器可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小,两个输入端一个是待测的电压,另一个是DAC的电压输出端,在比较器中用二分法比较直到DAC输出电压和外部通道输入电压近似相等,由此DAC输入数据就是外部电压编码数据;(电压调节过程就是由逐次逼近寄存器SAR来用二分法进行的)
- DAC编码的电压通过右边输出,8位就8根线,12位就12根线;
- EOC转换结束信号;
- START开始转换信号;
- CLOCK是ADC时钟;
- 一般来讲参考电压正极和VCC一样,参考电压负极和GND一样;
STM32 ADC
基本框图
- 对于普通ADC,多路开关一般都是只选中一个,即选中某个通道、开始转换、等待转换完成、取出结果;而规则通道组可以一次性最多选中16个通道,注入通道组可以一次性最多选中4个通道,就像可以指定一个菜单,把想要的菜都写上去,老板按照菜单的顺序都做好了一次性递给你,而普通的就是只能点一个菜做一个菜的区别;
对于规则组转换来说,因为规则通道数据寄存器中只能存放一个数据,后续数据会把前面数据挤掉,所以一般配合DMA实现,DMA可以在有一个数据后把数据转运到其他地方去,防止数据被覆盖;
对于注入组而言,由于有4个数据寄存器,所以没有数据覆盖的问题,可以一次性输入4个数据;
- **触发ADC开始转换的信号有软件触发和硬件触发两种。**软件触发就是手动调用一条代码即可运行,硬件触发来自触发源,触发源主要是来自于定时器,有定时器的各个通道,还有TGRO定时器主模式的输出,还有外部引脚来触发中断EXTI;
- ADCCLK是ADC的时钟,用于驱动内部逐次比较的时钟,来自于ADC预分频器,而ADC预分频器来源于RCC,即APB2预分频器72MHz通过ADC预分频器进行分频,得到ADCCLK,但是要注意ADC预分频器只能选择6分频和8分频;
- 模拟看门狗可以设定一个阈值高限和一个阈值低限,启动了模拟看门狗并指定看门通道之后,看门狗就会关注该通道,一旦超过这个阈值范围,就会在上面申请一个模拟看门狗的中断,最后通向NVIC;
- 对于注入组和规则组,转换完成后也会有一个转换完成信号,EOC是规则组和注入组的完成信号,JEOC是注入组的完成信号,这两个信号会在状态寄存器置一个标志位,我们读取这个标志位就可以得知是不是转换结束,同时这两个标志位也可以通向NVIC申请中断;
ADC基本结构
输入通道
该表是ADC通道和引脚复用的关系
转换模式
单次转换,非扫描模式
在非扫描模式下,菜单只有第一个序列1的位置有效,此时菜单同时选中一组的方式退化为简单的选中一个的方式;
连续转换,非扫描模式
在一次转换后不会停止,而是立刻开始下一轮的转换,然后一直持续下去,这样只需最开始触发一次,之后就可以一直转换;
该模式的好处就是开始转换后不需要等待一段时间,也不用判断是否结束,要读AD值时直接从数据寄存器取即可;
单次转换,扫描模式
这个模式也是单次转换,所以每触发一次,转换结束后就会停下来,下次转换就得再触发才能开始;扫描列表就可以使用菜单模式;
连续转换,扫描模式
在上一个模式的基础上,一次转换完成后,立刻开始下一次的转换;
触发控制
来自引脚或定时器的信号,具体是引脚还是定时器,需要用AFIO重映射来确定;
数据对齐
ADC是12位的,转换结果是一个12位的数据,但数据寄存器是16位的,所以存在一个数据对齐的问题;
右对齐数据大小不变,左对齐相当于把数据乘以16;
转换时间
- AD转换的步骤:采样、保持、量化、编码;
量化编码就是逐次比较的过程,采样保持就是输入电压不断变化时,收集一小段电压后断开开关,使得在量化编码期间电压始终保持不变; - STM32 ADC的总转换时间为:
TCON=采样时间+12.5个ADC周期
采样时间就是采样保持电路打开关闭开关的时间,采样保持信号越大,越能避免一些毛刺信号的干扰,12.5个ADC周期是量化编码花费的时间,ADC周期就是从ADC分频器过来的ADCCLK,最大为14MHz;
校准
- ADC的内置自校准模式可以减小因内部电容器组的变化而造成的准精度误差;
- 建议在每次上电后执行一次校准;
- 启动校准前,ADC必须处于关电状态超过至少两个ADC时钟周期;
硬件电路
代码
代码思路
- 开启RCC时钟,包括ADC和GPIO时钟,以及 ASDCCLK分频器;
- 配置GPIO,模式为模拟输入模式;AIN模式下GPIO口无效,断开GPIO,防止GPIO的输入输出对模拟电压造成干扰,AIN是ADC的专属模式
- 配置多路开关,把左边通道接入右边的规则组列表里面;
- 配置ADC转换器;
- 开关控制,开启ADC_Cmd函数;
- 对ADC进行校准;
库函数
- RCC_ADCCLKConfig用来配置ADCCLK分频器;
- ADC_ITConfig中断输出控制;
- 下面四个函数就是控制校准的,在ADC初始化完成后依次调用即可;
- ADC_SoftwareStartConvCmd用于软件触发,用于给SWSTART位置1,以开始转换;;
- ADC_GetSoftwareStartConvStatus用于获取CR2的SWSTART一位,用于返回SWSTART的状态(一般不用);
- ADC_GetFlagStatus获取标志位状态,判断EOC标志位是不是置1;
- ADC_RegularChannelConfig配置多路开关,给规则组序列的每个位置填写指定的通道,即填写点菜菜单的过程;
- ADC_ExternalTrigConvCmd用于是否允许外部触发转换;
- ADC_GetConversionValue用于获取AD转换的数据寄存器,读取转换结果;
- 下面的函数中带有Injected就是注入组的意思,即对注入组进行配置;
- ADC_AnalogWatchdogCmd是否启动模拟看门狗;
- ADC_AnalogWatchdogThresholdsConfig配置高低阈值;
- ADC_AnalogWatchdogSingleChannelConfig配置看门通道;
- ADC_TempSensorVrefintCmd用来开启内部的两个通道;
- 最后四个:获取标志位状态、清除标志位、获取中断状态、清除中断挂起位;
AD单通道
接线图
代码
AD多通道
接线图
代码
总结
本节内容对应手册的11章模拟/数字转换(ADC)