在ADC多通道采样时遇到了一个问题,费了半天劲才找到原因。在此将分析过程记录下来。
这是STM8S003单片机5个通道ADC采样程序,在主函数中依次读取各个通道的ADC采样值。首先单独测试一下每个通道的值。
每个通道单独测试采样值 ch2 = 623, ch3 = 0,ch4 = 2,ch5 = 1023, ch6 = 408。
下面开始多通道采样,ch2和ch3同时采样。
采样结果正常。
ch2、ch3、ch4同时采样。
采样结果正常。
ch2、ch3、ch4、ch5同时采样。
采样结果不正常,和上面的采样结果比较,好像采样值被整体下移了一位。
在试试所有通道同时采样
采样的值还是不正常,感觉采样值互相错位了。
3个通道同时采样时采样结果都是正常的,但是4个通道和5个通道同时采样时,采样结果就不正常。采样结果整体被移动了一个通道。
就是这个采样结果偏差的问题,折腾了好久,后来查阅ADC采样原理资料后,感觉是ADC内部电路的原因。
先看一个ADC专用采样芯片内部电路。
当发送通道地址后,ADC会紧跟着输出一个转换结果,但是这个转换结果不是当前设置通道的值,而是上一个通道的值。当前通道的值在下一次设置通道地址的时候才会输出,也就是说通道设置和采样结果输出,要延迟一拍。那程序中刚才出现的采样结果好像错位了一个通道,是不是也是这个原因引起的?
将程序修改为,每个通道采样两次,取第二次的值。将切换通道后的第一次采样值丢掉。
程序修改后采样的值,好像正确了,每个通道的值都可以对应上。也就是说ADC通道切换后,第一次采样值是上一个通道的值,如果需要采样当前通道值,就需要继续采样一次。
也就是说STM8S003单片机,在多通道采样时,采样通道小于等于3个以内时,通道切换中采样值不会延迟。当同时采样通道大于3个时,通道切换中采样值会有延迟,需要将第一次采样到的值扔掉,第二次采样的值才可以使用。
关于采样源码详见 STM8学习笔记---ADC多通道采样 这篇文章。