飞思卡尔官方推荐KL25 ADC模块详细介绍。
首先先解释下分辨率和精确度的区别。
简单点说,“精度”是用来描述物理 量的准确程度的,而“分辨率”是用来描述刻度划分的。之前在网上看见一个例子举得很通俗:有这么一把常见的塑料尺,它的量程是10厘米,上面有100个刻度,最小能读出1毫米的有效值。那么我们就说这把尺子的分辨率是1毫米,或者量程的1%;而它的实际精度就不得而知了(算是0.1毫米吧)。当我们用火来烤一下它,并且把它拉长一段,然后再考察一下它。我们不难发现,它还有有100个刻度,它的“分辨率”还是1毫米,跟原来一样!然而,您还会认为它的精度还是原来的0.1毫米么?
分辨率是由AD的位数决定的,比如说KL25的AD是16位,以VDD的最大值3.6v那么它的分辨率就是3.6/2^16=54.9uV。而精度主要用这个值来表示:INL:Interger NonLiner——积分非线性度,他表示了ADC器件在所有的数值点上对应的模拟值,和真实值之间误差最大的那一点的误差值。也就是,输出数值偏离线性最大的距离。单位是LSB。
LSB这一术语有着特定的含义,它表示的是数字流中的最后一位,也表示组成满量程输入范围的最小单位。对于12位转换器来说,LSB的值相当于模拟信号满量程输入范围除以2^12 或 4096的商。如果用真实的数字来表示的话,对于KL25(12位模式)满量程输入范围为3.6V的情况, 12位转换器对应的LSB大小为0.88mV。它的INL典型值为正负1.0LSB(12位模式),所以在12位模式下,KL25的精度为0.88mV*1=0.88mV。
还要特别提一下基准源。基准源是测量精度的重要保证。基准的关键指标是温飘,一般ppm/K来表示。假设某基准30ppm/K,系统在20~70度之间工作,温度跨度50度,那么,会引起基准电压30*50=1500ppm的漂移,从而带来0.15%的误差。温漂越小的基准源越贵,比30ppm/K的431,七毛钱;20ppm/K的385,1块5;10ppm/K的MC1403,4块5;1ppm/K的LM399,14元;0.5ppm/K的LM199,130元
接下来贴上一张ADC的模块框图,这张图对于我们理解ADC模块很重要。我在图上加了一些注解,便于大家对各个部分有个了解。KL25的ADC模块是16位的,但是有效位数在13-14位左右。转换速率为37.037-461.467ksps(16位模式,硬件均值关闭,持续转换开启)。
1 时钟源选择
KL25的ADC模块有4个时钟源可以选择,通过设置CFG1[ADICLK]可以进行选择,分别是:
1 总线时钟:复位之后默认的选择
2 总线时钟2分频:
3 可选时钟:在K60中,可选时钟设置为OSCERCLK。但是在KL25中并没有说明。
4 异步时钟:这个时钟是由ADC模块内部的时钟源产生的(框图右上部分)。这个时钟有点奇怪,你在转换之前不打开它也是可以使用的,在每次转换开始时它会自动启动,在转换结束时会自动关闭,但是这样的话会在每次这个时钟启动的时候导致延时。所以为了避免这种情况,在初始化传输之前最好就打开它(CFG2[ADACKEN]=1)并等待5us(最坏启动情况)。
如果选择的时钟频率比较高的时候,通过设置CFG1[ADIV]可以设置到8分频。无论选择哪个时钟,都要在ADCK的频率范围2MHz-12MHz(16位模式)内。
2 参考电位选择 参考电压在两对电压对中选择:(VREFH and VREFL)和(VALTH and VALTL)。由SC2[REFSEL]来选择。参考电压正必须在Ref Voltage High的最小值和VDDA之间,参考电压负必须和VSSA相同的电位(在上图中我们也可以发现)。但是在芯片手册中并没有发现VALTH and VALTL相关的信息。
3 触发方式 硬件触发和软件触发
3.1 软件触发时 只要SC1A被写入就会触发转换。
3.2 硬件触发时 如果转换在处理时一个硬件触发过来,将会被忽略,所以当硬件触发事件在转换过程中发生时,必须要保持被置位直到当前的转换结束,接受这个事件信号来触发一个新的中断。
ADC的控制寄存器有SC1A, SC1B,虽然芯片手册上说SC1B~ SC1n,但是搜了下只有SC1A, SC1B,SC1A可以用于软件和软件触发模式,为了让ADC允许被内部外设触发连续转换,就有了SC1B的用武之地,但是仅限于硬件触发。这些SC1n寄存器有相同的字段,以"ping pong"的方法(这个方法不太清楚)来控制ADC操作(P461 Chapter 28 Analog-to-Digital Converter (ADC))。在每一个时间点,只有一个SC1n控制转换,如果你在SC1A在控控制某次ADC转换时更新了SC1A寄存器,也是可以的,但是这样的话,在软件触发模式下,如果通道值有值得话就会触发一次新的传输。如果更新的是SC1B~ SC1n的话就无所谓了,因为在软件触发模式下SC1B~ SC1n寄存器没用。
4 校准 如果设置的软件触发,设置SC3[CAL]之后校准就会自动开始。如果是硬件触发,错误标志会被置位。在校准时不要有其他写寄存器,模式切换等操作,否则会呆滞校准失败。
一般校准周期有14k个ADCK周期加上100个总线周期,具体时间取决于你所选的时钟源了。8MHz的时钟源的大概校准周期到1.7ms。为了减少这个时间,偏移,增益值等等这些校准值可以在初始化校准结束的时候存到flash中,这样在传输之前就可以从flash中恢复出来。这样的话可以减少校准减少到20个寄存器存储操作时间。
5 采样周期 采样时间和配置的关系如下图:
CFG1[ADLSMP]配置的是长/短采样,0为短采样,1为长采样。基准采样周期是4个ADCK cycles。如果是配置为短采样,那么在第一次转换时会有2个额外的周期也就是6个ADCK cycles。如果配置为长采样,CFG2[ADLSTS]配置的长采样的时间选择,如下。
CFG2[ADHSC]配置的是高速转换。0是正常模式,1是高速模式。高速模式下转换顺序改变了故每次转换都需要增加额外的2个ADCK cycles。
6 转换时间 总共所需的转换时间由下面这个公式决定:如果需要计算转换时间,只需要根据设置的参数带入公式计算就可。
下面是对每一项的说明:
SFCAdder:单个或者连续转换中第一个增加的时间。
AverageNum:就是平均采样次数因子。由SC3[AVGE]和SC3[AVGS]决定。:
BCT:Base Conversion
time,基准转换周期
LSTAdder:长采样还是短采样增加的时间(短采样就第一个周期增加2个ADCK cycles,所以忽略)
HSCAdder:高速转换增加的时间(2个ADCK cycles)
总结一下:
a 整个转换时间取决于:
b 采样时间
c 总线频率
d 转换模式(单端还是差分)
e 转换速度(正常还是高速转换)
f 转换时钟的频率fADCK
7 初始化顺序 ADC模块的初始化顺序基本如下图所示。
8 温度传感器 顺带介绍下ADC模块自带的一个温度传感器。这个温度传感器和ADC的一个输入相连。计算公式如下:
Temp就是所要测的得的温度。Vtemp就是在当前温度下的电压,Vtemp25表示在25度时的电压值,m是这个传感器的斜率。这些参数我在数据手册中截出来如下:
如上图所示,Vtemp25=719mv,m=1.715mv/°C。