在产品测试的过程中,我们需要检查对A/D口外接的电容是否存在,容值是否正常。
比如 ref hi = 3.3v ref low = 0v , input = 2v, 外接电容为10nF. 应该如何做?
ADCLOCKCR,ADCALCR,ADG1SAMP 应该如何设置?为什么?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hi Ping,
抱歉回复晚了。
如果有TMS570的问题,请发在Hercules™ ARM®安全微控制器。
看了你的问题描述,不是很明白你应用是什么?能详细描述一下吗?
ADC的自检是用来检测ADC模块自身是否正常用的,不是用来检测外部信号的。
Regards,
Jay
hello Jay,
我们是通过selftest 去检查AD口外接电容是否存在。
在technical user manual 中有说到 :
"Figure 22-16 shows the self-test mode timing when the
ADREFLO is chosen as the reference voltage for the self-test mode conversion. It also assumes an
external capacitor connected to the ADC input channel."
如果只是设置“ADCALCR”进入self-test mode, 然后去读对应的ADport,返回结果和normal mode状态下相差不大,略小。(猜测是sample时间过短,放电过程刚开始)
通过设置“ADCLOCKCR”,和 “ADG1SAMP” 并进入self- test mode 然后去读对应的ADport,得到的结果会和normal mode状态下相差很大(放电过程中采样)。
我们是通过以上手段去检查对应的电容是否存在,同时可以大体确认电容值是否正常。
但是问题是,如何去合理的设置“ADCLOCKCR和“ADG1SAMP”?理论依据?
Hi Ping,
我看你的描述,觉得你这个方法似乎不是太可行。我不知道我理解的对不对,如果有不对的地方,还请指出。
首先,我们的ADC self-test 主要是通过轮流切换ADC的参考电压为ADCREFLO 和ADCREFHI 两个值来测量输入的模拟信号的值,如果得到的转换的值两次都是固定或十分接近 ADCREFLO 或是ADCREFHI的值,从而来判断它是短接到地或是短接到VDD。这个前提是值我们的芯片的ADCREFHI管脚外部接到VDD,ADCREFLO管脚接到GND。
同时我们ADC进入self-test模式,只能是通过设置ADCALCR.8的这一位置位来进入,同时通过ADCALCR.24位的配合来选定参考电压源的。我暂时还没找到关于设置ADCLOCKCR和ADG1SAMP的模式来进入self-test 模式。
关于你的检测AD口外接电容的方法,是不是想通过放电时间的长短来确定呢?主要是想通过比较同时间内比较采样值的大小来确定这个AD口是处于放电过程中,还是放点以及结束,从而判断电容是否存在?对吧。其实我有一个想法可以用来做这样的测试:
你可以利用RC振荡电路原理,利用定时器和ADC模块来测量电容充放电的时间来确定电容的值,这样会不会更准确和方便的检测出AD口的电容是否存在,以及大概的电容值呢。
谢谢
ken
您好, Ken
您说的很对。
其实我们在实际测试中是通过1)设置ADCALCR.8进入self-test mode, 2)通过设置ADCALCR.24位选择ADCREFLO,3)通过设置ADCLOCKCR和ADG1SAMP来定时(充当定时器),4)再ADC模块来测试电容在放电过程中的AD值,来判定电容是否存在,同时电容值是否在规定范围内。
1.我不确定通过设置ADCLOCKCR和ADG1SAMP是否可以起到定时器的作用。
2.如果可以,我对如何设置ADCLOCKCR和ADG1SAMP这两个寄存器不太了解。不知道它的原理是什么。我猜应该根据电容大小来计算放电时间,然后再根据放电时间,选个比较合适的,小于放电时间的时间值,并根据这个值去设定ADCLOCKCR和ADG1SAMP这两个寄存器。
不知道我的猜测是否正确?
Hi Ping,
查看了一下我们的技术手册,觉得你这个想法是不错的,但是实施起来会有点问题。
首先我们的芯片针对采样窗口时间的设置都是按 ADC group来设置的,这也就意味着我们一个group里面所有ADC的采样通道的采样窗口时间都是一致的, 你要通过采样后的AD值来判断是否有电容的,那也就是说,首先你必须给每一个ADC的电压值设定一个参考值,而且有可能因为你每个通道采样的电压源是不一样的,这个参考值也就不一样了。这个是一个比较纠结的地方。不过这只是我的想法,也许你们已经有了好的打算。
第二个问题就是,你这个电容检测是在什么情况下检测呢,是系统开始运行还是说在系统运行过程中呢。因为这牵扯到一个重新配置ADC参数的问题。
第三个就是,感觉你要实现的功能和我们的self-test的功能不是太一样。你要进行的操作,应该不需要ADC进入自检测状态来进行吧。
以上只是我的理解,有误之处还请指明。
谢谢!
ken
第一个问题,
比如我要测试AD1IN[0]端口外的电容,首先,我会先读取ADCLOCKCR和ADG1SAMP的默认值,然后设置ADCLOCKCR,ADG1SAMP,并设置ADCALCR 进入self-test 模式,ADCREFLO。通过ADC模块来测试电容在放电过程中的AD值。 最后推出self-test mode 并设置ADCLOCKCR和ADG1SAMP回默认值
第二个问题,
我们是在产品上电后测试的。产品的默认设置应该在产品刷完bootloader后就配置好了。我们在测试过程中如上所述,不会改变配置。只是为了测试需要,临时改变一下,测完会改回去的。
第三个问题,
是的,我们是借助self-test功能去做电容的check,当然同时也做了AD口的self-test。因为我们的产品是整块PCBA,上电后每个ADC口都有对应的电压,没法单独控制ADC口的电压上下电。所以只能通过这个方式来做。
我是这么理解,不知道对不对?
Hi Ping,
通过这几次沟通交流下来,你们通过设置配置在特定的采样时间内去读取AD口的采样值,然后去比较,最终得出AD口是否有电容。这个在原理上市可行的。因为我们的采样时间主要是通过ADG1SAMP[11:2]这几个位来配置的,最小是2,最大是4098, 它的单位是ADCCLK。这个ADCCLK是可以通过设置ADCLOCKCR[4:0]来配置AD模块的分频系数来得到ADCCLK的频率是多大。
但是我有几个问题:
第一, 你们的参考电压源不能选ADCREFLO,因为这个是最低电压,一般都是GND。如果你选择它的话,那你AD的测试量程就没有了,任何一个AD值得到都是最大值2^12. 你应该设置它为ADCREFHI会好一些。
第二, 因为你每个AD口的电压值不一样,那你们是不是前期得有一个类似于数据库的东西,用来比较带电容和不带电容这个AD值应该是怎么样的。这样才比较好判断是否有电容值吧。
你看这样可以吗?
谢谢
ken