结贴了,自己写的bug...
-----------
片内没有ADC,外扩了片TI的ADC081S021来测锂电池电压,想着简单搞定的事没想到折这上面了...
源电压3V3,Vin分压后进来1.5-2.1吧,按着手册拉了片选,给clk,然后取数据,诡异的是取到的数据根据输入变化反复波动:
输入电压4V时转换完毕的读数也是4V,但是降到3.9V时转出来的读数就变成3.7V了,降到3.8V时读数又恢复正常,基本上每隔0.1V左右就会出现读数不准.
倒不是读数有波动,当输入稳定不变时读数结果也基本不变,排除了电源不稳这些可能,反复刷了几遍手册都没看出来问题在哪,网上找了下该芯片的驱动,时序操作也基本一致.
实在没头绪了,哪位大佬遇到过类似现象没?
--
修改:wazowski FROM 222.128.87.*
FROM 222.128.87.*
非常二的一个bug,感觉脑子正常的人错不了这么离谱...捂着脸说吧:
基本逻辑是移位收一个UINT16的值tmpVal,返一个UINT8的有效值,有效值为P13-P5,MSB在前.
接收的时候就是循环拉clk,然后通过异或来取SDIO的值再移位.最后return (tmpVal>>5) & 0xFF;
傻缺就傻缺在tmpVal这个变量在声明时被我错给了个初值0xFF而不是0,这就导致了异或的结果是低3位全被取反了...
所以现象就是低3位000时读数111,低三位111时读数000.而恰好低3位读数在100时错误的读数结果与正确值只差一个LSB,因此现象就体现为ADC读数低3位为100时读数看上去是对的,然后在000和111的读数上偏离最大且周期波动...
然后我就走上了怀疑走线太渣有串扰->采样电压有波动->参考电压有波动->MD这鸟芯片有毛病的脑抽之旅,直到最终发现真相
【 在 ericking0 的大作中提到: 】
: 我之前也觉得这么大的非线性的误差不会是ADC本身的问题;
: 不过始终想不通什么样的操作错误能导致这种现象;
: 话说能透露一下吗?MCU采集后在软件侧出的问题?
: ...................
--
FROM 1.89.13.*