7.1江科大STM32学习之ADC模数转换器(理论)

1.什么是ADC

可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

另外,使用DAC就可以将数字变量转化为模拟电压。上一节我们还学到了一个数字-模拟的桥梁:PWM。我们使用PWM来控制led的亮度,电机的速度,这就是DADC的功能。同时,PWM只有完全导通和完全断开两种状态。在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量是比DADC更好的选择。并且PWM电路更加简单,更加常用。所以可以看出PWM还是挤占了DADC的很多应用空间。目前DADC的应用主要是在波形生成这些领域。信号发生器、音频解码芯片等这些领域。PWM还是不好替代的。

12位逐次逼近型ADC,1us转换时间

这里就涉及到ADC这两个关键参数了:

第一个:分辨率,即一般用多少位来表示,十二位AD值,它的表示范围就是0~2^12-1,就是量化结果的范围是0~4095,位数越高,量化结果就越精细,对应分辨率就越高。

第二个:转换时间,就是转换频率。AD转换是需要花一小段时间的。这里1us就表示从AD转换开始到产生结果,需要花1us的时间。对应AD转换的频率就是1MHz,这个就是STM32ADC的最快转换频率。如果需要转换一个频率非常高的信号,就要考虑一下这个转换频率是不是够用。如果信号频率比较低,这个最大1MHz的转换频率也完全够用了。

输入电压范围:0~3.3V,转换结果范围:0~4095

0V对应零,3.3V对应4095,中间都是一一对应的线性关系

18个输入通道,可测量16个外部和2个内部信号源

外部信号源就是十六个GPIO口,在引脚上直接接模拟信号就行了,不需要任何额外的电路,引脚就直接能测电压。

两个内部信号源是内部温度传感器和内部参考电压。

内部参考电压是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的。所以如果芯片的供电不是标准的3.3V,测量外部引脚的电压可能就不对,这时就可以读取这个基准电压进行校准,通过线性关系计算,这样就能得到正确的电压值了

规则通道虽然最多有16个通道但是寄存器只有一个所以一般和DMA一起16个通道内的数据一个一个搬运到寄存器内,而不是一次就将16通道内的数据直接丢给数据寄存器会导致前15通道内数据丢失

注入通道区别就是四个通道对应四个数据寄存器就可以使之直接进入通道

51内ad的话一般就是单通道单寄存器启动一次转换读一些值,然后再启动再读值这样的流程,而不是像16个通道数据预存,所以就会数据处理慢一点

模拟看门狗自动监测输入电压范围

模拟看门狗可以监测指定的某些通道。当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,就可以在中断函数里执行相应的操作。这样就不用不断的手动读值,再用if进行判断了。

模数转换器作用:

模数转换器就是执行逐次比较的过程。转换结果会直接放在这个数据寄存器里通过的二分法查找依次比较

我们其实是将DAC的8位数据从左往右,就是将第一位置1,第二位置1......这样开始和未知电压进行对比。那么比如首先把DAC的2.5V,即1000 0000(也即128)和未知电压进行对比,如果未知量比这个数小,那么我们把第一位置0,第二位置1,即0100 0000(表示64,也即1.25V),如果未知量比这个数大,那么这个1就保留,再把第三个置1,即0110 0000(表示96,也即(1.25+2.5)/2)再比较......依次判断8位,最终这8位数据取出来就是表示我们的未知电压。

2.ADC内部结构

a.外部电源结构

一般情况下Vref+和Vdda已经连在一起了

Vref-和Vssa连在一起

分频方式:因为其中最大为14MHZ,所以72/6=12,所以一般选用6,8分频得到ADCCLK——CLOCK(ADC时钟)



b.ADC与外部通道对应关系

本芯片只有两个ADC

因为本STM32只有10个通道所以就有10个引脚与其相对应(ADC外部通道最多为16个)

ADC12_IN代表ADC1 ADC2对应通道引脚是相同的,引脚相同不代表ADC2就没用,因为ADC有双ADC模式使ADC1,ADC2一起工作,可以组成同步模式亦或者交叉模式等等模式

比如交叉模式,ADC1和ADC2交叉的对一个通道进行采样,这样就可以进一步提高采样率。就像打拳一样,左手打一拳,右手打一拳,左手打一拳,右手打一拳,快速交叉的打拳,打击的频率肯定就比一个拳头打的快。当然还有其它的模式,这里就不再细说了。

当然ADC1ADC2也是可以分开使用的可以分别对不同的引脚进行采样。

c.触发方式:就是START信号

1.硬件触发方式:大多是定时器触发以及外部中断引脚也可以触发

因为adc要频繁进入中断,并且在中断里只完成了简单工作的情况,一般都会有硬件的支持

比如这里就可以给TIM3定一个一毫秒的时间。并且把TIM3的更新事件选择为TRGO输出。然后在ADC这里选择开始触发信号为TIM3的TRGO。这样TIM3的更新事件就能通过硬件自动触发ADC转换了。

整个过程不需要进中断,节省了中断资源,这就是这里定时器触发的作用。

3.规则组四个模式转换

a.单次转换,非扫描模式

就是在序列1的位置指定转换通道,然后触发ADC转换序列1内的通道2,进行模数转换,过一段时间后转换完成,转换结构放到数据寄存器里面,同时给EOC标志位置1,通过判断EOC是否为1,来确定转换是否结束,从而从数据寄存器内读取结果,因为是单次所以如果要再启动一次那就要再次触发ADC转换

b.连续转换非扫描模式

因为是非扫描模式于是整个序列也只是用第一个序列,与上面不同的是他在一次转换完不会停止,而是立刻开启下一轮转换然后一直持续下去,所以只要一开始触发一次就可以一直转换了,因此就不用手动触发,或者用if判断语句触发

c.单次触发扫描模式

这种模式就是触发一次可以

可以在这个菜单里点菜。比如第一个菜是通道二,第二个菜是通道五等等。这点每个位置是通道几,可以任意指定,并且也是可以重复的。

然后初始化结构体里还会有个参数,就是通道数目。因为有十六个位置,可以不用完,只用前几个,就需要再给一个通道数目的参数,告诉它有几个通道。

比如这里指定通道数目为七,它就只看前七个位置。然后每次触发之后,它就依次对这前七个位置进行AD转换转换,结果都放在数据寄存器里。这里为了防止数据被覆盖,就需要用DMA,及时将数据挪走。

七个通道转换完成之后,产生EOC信号转换结束,然后再触发下一次,就又开始新能的转换。这就是单次转换扫描模式的工作流程。

d.连续转换扫描模式

它就是在上一个模式的基础上变了一点,就是一次转换完成后,立刻开始下一次的转换。

间断模式

当然,在扫描模式的情况下,还可以有一种模式叫间断模式

它的作用是在扫描的过程中,每隔几个转换就暂停一次。需要再次触发才能继续。大家了解一下就可以了,暂时不需要掌握

4.触发控制

在这个表里有来自定时器的信号,还有这个来自引脚或定时器的信号,这个具体是引脚还是定时器需要用AFIO重映射来确定。最后是软件控制位,也就是我们之前说的软件触发。

这些触发信号怎么选择?

可以通过设置右边这个寄存器来完成。使用库函数的话,直接给个参数就行了,这就是触发控制。

5.数据对齐

由于ADC得出是12位的而寄存器是16位的就会产生一个数据对齐问题

右对齐就是把寄存器内数据往右移动左边空位补零

我们一般使用的都是第一种右对齐。这样读取这个十六位寄存器,直接就是转换结果。如果选择左对齐直接读的话,得到的数据会比实际的大。因为数据左对齐,实际上就是把数据左移了四次。二进制有个特点,就是数据左移一次,就等效于把这个数据乘二。这里左移了四次,就相当于把结果乘十六了。所以直接读的话会比实际值大十六倍。

6.转换时间

因为一般AD转换都很快,如果不需要非常高速的转换频率,转换时间就可以忽略。

为什么需要采样保持?

这是因为我们的AD转换,就是后面的量化编码是需要一小段时间的。如果在这一小段时间里,输入的电压还在不断变化,就没法定位输入电压到底是在哪,所以在量化编码之前,我们需要设置一个采样开关。先打开采样开关,收集一下外部的电压,比如可以用一个小容量的电容存储一下这个电压存储好了之后,断开采样开关,再进行后面的AD转换。这样在量化编码的期间,电压始终持不变。这样才能精确的定位未知电压的位置,这就是采样保持电路。

采样保持的过程需要闭合采样开关,过一段时间再断开。这里就会产生一个采样时间。

采样时间是采样保持花费的时间这个可以在程序中进行配置。

采样时间越大越能避免一些毛刺信号的干扰。不过转换时间也会相应延长。

ADCCLKmax=14MHZ

这就是最快1us时间的来源。如果采样周期再长一些,它就达不到1us了。另外也可以把ADC CLK的时钟设置超过14MHz。这样ADC就是在超频,转换时间可以比1us还短,不过这样稳定性又没法保证了。

t=T/f=14MHZ/14周期=1us

7.校准

这个看上去挺复杂的,但是我们不需要理解。这个校准过程是固定的,我们只需要在ADC初始化的最后加几条代码就行了。至于怎么计算,怎么校准的,我们不需要管,所以这个了解一下就行。

8.硬件电路

当滑动端往上滑时,电压增大,往下滑时,电压减小。另外注意一下电阻的阻值不要给太小,因为这个电阻两端也是直接跨接在电源正负极的,如果阻值太小,这个电阻就会比较费电,再小就有可能发热冒烟了,一般至少要接千欧级的电阻,比如这里接的是10k的电阻,这是电位器产生可调电压的电路。

一般来说光敏电阻、热敏电阻、红外接头管、麦克风等等都可以等效为一个可变电阻,那电阻阻值没法直接测量,所以这里就可以通过和一个固定电阻串联分压来得到一个反应电阻值电压的电路。

这里传感器阻值变小时,下拉作用变强,输出端电压就下降。传感器阻值变大时,下拉作用变弱,输出端受上拉电阻的作用,电压就会升高。

上面的固定电阻一般可以选择和传感器阻值相近的电阻,这样可以得到一个位于中间电压区域比较好的输出。但这里传感器和固定电阻的位置也可以换过来。这样的话,输出电压的极性就翻过来了,这就是这个分压方法来输出传感器阻值的电路。

之前传感器模块的介绍那里,传感器也是使用分压的方法来进行输出的。

这是一个简单的电压转换电路,比如想测一个零到五伏的VIN电压,但是ADC只能接收零到3.3V的电压,就可以搭建一个这样的简易转换电路,在这里还是使用电阻进行分压。上面阻值17k,下面阻值33k加一起是50k。所以根据分压公式,中间的电压就是VIN/50k*33k。最后得到的电压范围就是0到3.3V,就可以进入ADC转换了。这就是这个简单的电压转换电路

参考资料《stm32学习笔记

参考资料《单片机学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值