全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 模拟技术 >

PFS122 AD调试心得-小电流检测方法分享

时间:2023-09-06 18:21

人气:

作者:admin

标签: pfs  输入电压  寄存器  系统 

导读:最近调试122检测小电流,有一种遇到鬼打墙的状态,就是看到寄存器的值在数据转移时改动了。...

最近调试122检测小电流,有一种遇到鬼打墙的状态,就是看到寄存器的值在数据转移时改动了。要不是亲眼见,还真不会相信。在ADC中写入了这么一小段:

AD_Start=1;//Skip first ADC, can delete by your select

while(!AD_DONE)

ad_temp$1 = adcrh;

ad_temp$0 = adcrl;

你说要是有问题,你在检测内部1.2V时也有问题,那也更容易查找问题吧。可是在转换以内部1.2V为一路输入电压时又没有问题,而且这个程序,在以前的调试好象也问题。

7e44a608-4c9d-11ee-a25d-92fbcf53809c.png

可是一到转换另外一路小电压的时候,就出现问题了。看吧调试窗口里的数据明明提示ADCRH的值为0x01,ADCRL的值为0x17. 在转移到ad_temp 时,变成了ad_temp$1的值为00x03,ad_temp$0为0x17还是正常的。这个问题,以前也弄出来过,可能是后来把系统时钟改低了,系统时钟跑1mips,当时又正常了,所以就没有怀疑程序的问题了。

后来没有明白问题出在哪里,多弄了一次判断,不想等再读一次,想想虽然操作可笑,但也是一种方法:

AD_Start=1;//Skip first ADC, can delete by your select

while(!AD_DONE)

ad_temp$1 = adcrh;

ad_temp$0 = adcrl;

if(ad_temp$1 != adcrh) ad_temp$1 = adcrh;

ad_temp = ad_temp >> 4;

ad16 += ad_temp ;

这样一改,结果是对了,但是还是没有明白问题出在哪里?

后来想到可能系统时钟跑太快了,读数有问题,所以就在while(!AD_DONE)后面加了两个nop;这样也正常了。后来终于想明白。数据转移出错,确实和系统时钟跑得快有关系,所以在频率较低时,上面的程序不会出问题。其实真正的问题就是出在“while(!AD_DONE)”这里,这里少了一个“;”,编译器没有提示错误,本来也是可以不提示错误的,编译器不知道你等待的时候具体是需要干嘛。因为有“;”时,在等待AD转换完的时间里,编译器会自动增加一条nop指令,而没有“;”时,在等待的时间里是一直在读AD转化的高位,等AD结束后,马上是读取AD转换的低位。所以在等待的过程中,读取的高位,是一个还没有转化完。而低位则是转换结束后的数据,所以读起来不会错了。加上NOP后,再等待的时间强制是执行空指令了,结束完还会执行一个空指令再取高位,所以都不会有问题了。

7eac8250-4c9d-11ee-a25d-92fbcf53809c.png







审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信