STM32ADC采样
注:本篇文章所用图片均来自铁头山羊
ADC就是将模拟信号转换为数字信号的转换器,模拟信号就是时间和幅度都连续的信号,数字信号就是时间和幅度都离散的信号。例如我们某一天的温度是连续变化的,一点点升温一点点降温,但是这种信号我们的计算机(单片机)是没办法直接获取的,就像GPIO它只有高电平和低电平(0和1),是离散的,所以当我们将一个模拟信号直接作为输入端,我们计算机获取的值只有0和1没办法知道这个连续的变化。
我们可以先简单的像PWM波那样去理解二者,我们知道PWM本质上是一种数字信号,它是通过对数字信号的占空比进行调制来实现对模拟信号的近似表示。也就是通过修改占空比实现输出连续的波形。ADC是将模拟信号转换为数字信号。也就是一个逆过程,当然ADC的逆过程不是PWM而是DAC
DAC是将数字信号转换为模拟信号的器件。它根据输入的数字代码,通过内部的电路结构,如电阻网络、电容网络等,将数字量转换为与之成正比的模拟电压或电流信号。
虽然 PWM 波在一定程度上可以实现类似 DAC 的功能,即把数字信号转换为模拟信号,但 PWM 波是基于时间上的脉冲宽度调制来近似模拟信号,而 DAC 是基于精确的数字编码到模拟量的转换,二者在原理、精度和应用场景等方面存在差异,不能将 PWM 波理解为数字信号到数字信号的转换,也不能简单地将其等同于 DAC。
12位逐次逼近型ADC
什么叫做12位逐次逼近型ADC?
**12位:**12位是ADC的采样深度,采样深度就是用多少位二进制数来表示一个采样点,例如我们有一个模拟信号,它的范围是0~3.3,如果我们是4位ADC那么我们就会将这3.3分成15份(4位2进制数)每份0.22,如下图:
所以我们也就知道ADC的采样深度越深转换的结果越精细,采样深度是衡量ADC性能的重要指标之一
**逐次逼近型:**除了逐次逼近型还有下图的几种类型,这里只了解逐次逼近型:
逐次逼近也就是逐步改写位数据来接近实际值,我们可以通过下图来更好的理解:
首先这是对0~3.3V模拟信号进行ADC采样,当我们的输入值为2.21V(10x0.22V,10=1010)时,我们会先将最高位(b1)写入1也就是1.76V,之后将1.76V与2.21V进行比较发现1.76<2.21,接下来将第二高位(b2)写1,1.76+0.88=2.64>2.21,这样就将b2写为0,接着判断b3,这样逐次判断直到最接近实际值。
ADC采样时间和转换时间
一个ADC转换器有多个采样通道,也就是可以对多个模拟信号进行采样,ADC是通过轮转的方式进行多个通道采样的,那么问题就来了,我们都知道,轮转方式是依据时间来进行的这样的话我们就需要对每个通道的采样进行时间分片操作,例如我们一个ADC转换器有12个通道,那么我们每个通道都有一个自己的采样总时间,而这个采样总时间就需要我们自己进行计算,因为采样总时间需要是一个适宜的值,如果时间过大那么ADC的工作速度就会过于慢,而时间太短ADC的采样精度又会过于小,所以我们就需要均衡精度和效率来使用一个适宜的采样总时间。每个ADC采样总时间分为采样时间和转换时间,我们只需要分别计算出二者我们就可以的到采样总时间
注意:输入到ADC转换器的频率不可以超过14MHz,这是由ADC转换器的硬件特性决定的
图片中是CubeMx配置时钟树后需要对ADC时钟进行分频操作,使其时钟不大于14MHz
时钟周期:
假设输入到ADC的时钟信号为14MHz那么时钟周期=1/14MHz=1/14us,再假设采样时间=0.1us,转换时间=0.9us,但我们一般不用小数形式来表示采样时间和转换时间,我们使用时钟倍数的方式来表示,如下图
转换时间计算(调整2进制数来找到最适宜的值的时间):
如果采样深度=12,那么每次尝试找到适宜的值(更改0/1)会消耗一个时钟周期,尝试12次也就是12个时钟周期。
转换时间 = 12Cycle(尝试12次) + 0.5Cycle(额外的时间,此为固定值记下即可) = 12.5Cycle
采样时间计算:
采样时间也就是获取一个模拟信号值的时间,因为采样的过程其实是一个电容充电的过程,这是需要时间的,如果这个时间太短,那么与实际值会有较大误差,而时间过长又会浪费时间,因为不管怎样都会存在一个误差,所以我们只需要选择适宜的充电时间即可。
上图就是最优采样时间计算公式,Rain是模拟输入信号的内阻,Radc是采样保持电路的内阻,Cadc是采样保持电路的电容,N是采样深度,其中Radc和Cadc可以通过查询芯片数据手册获取,我使用的是F103Zet6,Radc=1kΩ,Cadc=12pF,N=12。c8t6与zet6不同的只有电容(Cadc),c8t6的Cadc=8pF,这里我用c8t6的来计算。
上图是进一步的推导过程,我们可以得知信号源内阻越大,采样时间越长,下图是计算过程:
上图是几个计算的例子,转换为了对应的时钟周期,而为什么一定要转换为对应周期呢?这是因为我们ADC的采样时间是没办法随意设置的,是由stm32中给出的几个对应的档位来选择最相近的值,如下图:
我们可以看到在CubeMX中的Sampling Time中有八个档位,如果我们的Rain=400Ω也就是采样时间=1.54cycle,我们就应该选择第一个档位(1.5Cycle)。
例题:最理想情况下ADC美秒最多执行多少次转换?下图是计算过程,答案是一百万次。这里就不做解释了
到这里有关于ADC的基础理论知识就结束了
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2302_77864418/article/details/147153614
|