ADC简介
ADC是Analog to Digital Converter的缩写,是一种将模拟信号转换为数字信号的转换器。
采样深度
指用多少位二进制数来表示一个采样点。
比如对于单片机来说,输入到单片机的模拟电压范围为:0~3.3V,现在我们要通过ADC将其表示为数字信号,如果使用的是4位ADC,就意味着二进制的0000~1111用来表示模拟信号的0~3.3V,因此二进制每一位就代表0.22V;对于8位ADC同理,具体如下:
ADC的采样深度越深,转换的结果越精细,因此采样深度是衡量ADC性能的重要指标之一。
逐次逼近型
逐次逼近型式ADC的一种最常见的类型,STM32里的ADC就属于这种类型。其工作原理类似于天平称重,我们需要不断的调整砝码的组合,来一次一次的逼近被测物体的实际质量。
如下为逼近型ADC的内部结构框图:
首先需要被转换的模拟信号(假设为2.21V电压)通过开关闭合,向电容充电;当电容充满电后,它两端的电压就相当于输入信号的电压,也就是2.21V;
然后开关断开,被充进电容的电只能继续锁在电容里(因为比较器虚断),始终维持2.21V,因此比较器的正输入端也维持在2.21V不变。
向b3比特位写1,此时为1000,电压发生器输出的电压就是1.76V,比2.21V要小;继续往b2比特位写1,此时为1100,电压发生器输出电压为2.64V,比2.21V要大,因此b2比特位为0;以此类推,最终得到4位比特位为:1010
附其他ADC类型:
ADC模块基本原理
我们将上述的逼近型ADC的内部结构框图用如下图形表示:
其中SAR就是逐次逼近型的英文缩写。
通过上文提到的模数转换过程,我们可以得到如下的基本结构:ADC将模拟信号转换为数字信号后,再把结果(二进制数)保存在结果寄存器当中,最后我们再从结果寄存器中读出数据即可。
但我们需要对不止一个模拟信号进行同时转换,比如有很多路模拟信号都被输入到单片机当中(如下图所示),难道我们需要为每一路模拟信号都提供一个ADC吗?
答案是否定的,我们对上图电路稍作变形,如下所示:可以只使用一个ADC对多路信号进行同时转换了。
注意,ADC虽然只有一个,但采样开关却有多个。首先闭合第一路模拟信号的开关,将第一路模拟信号进行模数转换并保存数据后,再读出来;然后对后面几路的进行重复的步骤,直到所有路的模拟信号都被转换完为止。
对于STM32芯片来说,它内部的单片机最多可以同时接收12路模拟信号,如下图所示:
其中前10路模拟信号通过芯片的IO引脚输入进来的,而剩下2路模拟信号来自于芯片内部,其中一路来自于芯片内部的温度计,另一路来自于参考电压;
常规序列与注入序列
ADC内部通过常规序列和注入序列来控制采样开关,而且这两种序列都有一个外部触发信号,我们通过这个外部触发信号来启动序列的执行。
例如我们想依次对AIN1、AIN4、AIN2进行模数转换,首先我们需要将这个“计划”写入序列中(两种任选一个),然后向外部触发输入一个脉冲信号。这样,序列就会执行“计划”,通道1,4,2就会被依次转换。
每输入一个外部触发信号,序列就会将“计划”执行一遍,如下图所示:
采样时间与转换时间
1、基本概念
我们已经知道,使用逐次逼近型ADC将模拟信号转换为数字信号的过程,就类似于使用天平称重。
称重的过程可分为两步:第一步,把待测物品放在天平的托盘上;第二部,通过调整砝码的组合来逼近待测物体的实际质量。
而对于ADC来说,可以把放重物所消耗的时间类比成ADC的采样时间,把调整砝码所消耗的时间,类比成ADC的转换时间。
2、ADC的时钟信号
输入到ADC的时钟信号,是通过PCLK2分频后得到的,并且对于ADC来说,其时钟频率不能大于14MHz,否则无法正常工作。
对于采样时间和转换时间,都需要表示成时钟周期的倍数的形式(为了方便后面的编程)。
例如,假设输入到ADC模块的时钟频率是14MHz, 那么可以计算出时钟周期为1/14us;再假设采样时间为0.1us、转换时间为0.9us,因此要将采样时间表示为1.5*1/14us=1.5周期、将转换时间表示为:12.5*1/14us=12.5周期。
3、两种时间的计算
- 关于转换时间:
转换时间的长短取决于采样深度,对于STM32芯片,其ADC为12位,每确定一位都要消耗一个时钟周期(因此共12个周期)。此外还要加上0.5倍的额外周期,总转换时间就固定等于12.5倍周期。
- 关于采样时间:
采样时间就是把模拟信号通过采样保持电路输入到ADC里花的时间。结合采样的过程可知,采样时间就等于电容充电时间。
且电容两端的电压只会无限接近于充电电压,两者之间总会存在误差。充电时间越长,这个误差就越小(即:采样时间越长,误差越小,结果就越精确)。
但这个时间不是越长越好,因为太长会导致时间的浪费,且ADC的精度本来就是有限的。因此我们要在精度和效率之间找一个平衡点。
我们只需要保证采样所产生的误差远小于ADC最大精度就可以了,这样就不会对最终的测量结果产生任何影响。
具体标准是:采样误差<¼*ADC分辨率,以12位ADC为例:
采样时间就是根据这个原理得来的,具体如下:
其中R_AIN为信号源内阻,其他均已在芯片内部被配置好,因此采样时间只与信号源内阻有关。
4、采样时间的档位
对于STM32单片机而言,它里面的ADC采样时间只有几个固定的档位,我们需要从这几个固定的档位里面选择一个。
采样时间的8个可选档位 | |||
1.5周期 | 7.5周期 | 13.5周期 | 28.5周期 |
41.5周期 | 55.5周期 | 71.5周期 | 239.5周期 |
实际编程时选择一个最接近的档位即可。