单片机是10位ADC,是能用软件扩成12位结果的。
方法其实很简单,但却是伪12位的结果。
下面通过实例进行扩位演算,看看伪12位结果,在使用上的局限性。
10位二进制数的扩位和缩位
二进制数位的扩位和缩位,为保证结果能在全域范围被表示,使用最高位对齐、左右移位的方法进行扩位或缩位。
是以损失最低位得到扩缩结果,因为最低位的数值表达绝对值是最小的。
对于扩位,扩位几位,二进制数就左移几位,数位扩展以后,实际精度为原有数位的精度,精度没有任何提升。
对于缩位,缩位几位,二进制数就右移几位,数位缩减以后,实际精度为现有数位的精度,精度反而下降。
实例:下图是用最高位对齐、左右移位的方法进行扩位和缩位的演算
从上图中的实例,可看出,10位扩位成12位后,最小计数值变成了二进制的‘100’,是伪12位分辨率,实际分辨率不变,最低2位是无法通过计算,补上实际数值的。
从上图中的实例,可看出,10位缩位成8位后,最小计数值依然是二进制的‘1’,但是最大技术值缩小了4倍,实际分辨率降低,原来的最低2丢弃了。
正所谓“巧妇难为无米之炊”对于ADC而言,硬件决定了最高精度,软件是无法通过计算弥补缺失的精度的。因为,任何数学计算,只能从高精度降到低精度,而无法从低精度升高到高精度。
数位丢失了,是无法凭空臆造出来。因此在系统设计时,对精度的预估,只能高不能低,因为高了,可以降低,低了无法提高。
如何真正解决单片机ADC不足的问题
很多时候,处于成本、设计、专利、源码等原因。
所使用的单片机,可能只有10位精度的ADC,但是系统要求12位精度的ADC结果来参与计算,实现软件接口的通用性。
如果实际产品可以接收10位精度的ADC,仅仅只是软件接口需要12位精度数值,就可以通过高位对齐左移扩位的方式来实现。
如果实际产品必须要求12位精度的ADC,那么就只有通过片外增加独立的高精度ADC,比如下图的这个ADC芯片。
片外增加的独立ADC精度可能高于12位。
那么就可以通过高位对齐右移缩位的方式来实现。
这样降低精度的计算,仍然可以保持精度为12位,完全不会丧失系统对ADC的精度要求,甚至还有在未来提高精度的可能性。