在产品测试的过程中,我们需要检查对A/D口外接的电容是否存在,容值是否正常。
比如 ref hi = 3.3v ref low = 0v , input = 2v, 外接电容为10nF. 应该如何做?
ADCLOCKCR,ADCALCR,ADG1SAMP 应该如何设置?为什么?
Jay:
Hi Ping,
抱歉回复晚了。
如果有TMS570的问题,请发在Hercules™ ARM®安全微控制器。
看了你的问题描述,不是很明白你应用是什么?能详细描述一下吗?
ADC的自检是用来检测ADC模块自身是否正常用的,不是用来检测外部信号的。
Regards,
Jay
Ping Zhou:
回复 Jay:
hello Jay,
我们是通过selftest 去检查AD口外接电容是否存在。
在technical user manual 中有说到 :
"Figure 22-16 shows the self-test mode timing when theADREFLO is chosen as the reference voltage for the self-test mode conversion. It also assumes anexternal 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”?理论依据?
Ken Wang:
回复 Ping Zhou:
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
Ping Zhou:
回复 Ken Wang:
您好, 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这两个寄存器。
不知道我的猜测是否正确?
Ken Wang:
回复 Ping Zhou:
Hi Ping,
查看了一下我们的技术手册,觉得你这个想法是不错的,但是实施起来会有点问题。
首先我们的芯片针对采样窗口时间的设置都是按 ADC group来设置的,这也就意味着我们一个group里面所有ADC的采样通道的采样窗口时间都是一致的, 你要通过采样后的AD值来判断是否有电容的,那也就是说,首先你必须给每一个ADC的电压值设定一个参考值,而且有可能因为你每个通道采样的电压源是不一样的,这个参考值也就不一样了。这个是一个比较纠结的地方。不过这只是我的想法,也许你们已经有了好的打算。
第二个问题就是,你这个电容检测是在什么情况下检测呢,是系统开始运行还是说在系统运行过程中呢。因为这牵扯到一个重新配置ADC参数的问题。
第三个就是,感觉你要实现的功能和我们的self-test的功能不是太一样。你要进行的操作,应该不需要ADC进入自检测状态来进行吧。
以上只是我的理解,有误之处还请指明。
谢谢!
ken
Ping Zhou:
回复 Ken Wang:
第一个问题,
比如我要测试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口的电压上下电。所以只能通过这个方式来做。
我是这么理解,不知道对不对?
Ping Zhou:
回复 Ken Wang:
你好 Ken
谢谢您的解答!
还有个疑问,就是如何计算并设置ADG1SAMP,ADCLOCKCR。
比如,AD1IN[0]外部输入电压2V(2/3.3*1024 = 620 count —10bit ADC register),外接电容为100nF. 我要自检时得到300count 左右的AD 值,我要如何计算并设置以上两个寄存器?
Ken Wang:
回复 Ping Zhou:
Hi Ping,
说实话,这种操作我们以前也没有测试过。你可以自己尝试着测测看。
在我们的datasheet上面有把AD模块的采样保持时间,转换时间和一般的延迟时间,就如类似于下图所示:
里面可以看到采样保持的时间大概是200ns左右,你可以以这个数值为基础,在其左右附近设置。
大概的时间可以这样算:t =( ADG1SAMP[11:0]+2)* 1/ VCLK* (ADCLOCKER[4:0]+1);
这个只是我个人的理解,你可以试试看。希望对你有所帮助。
谢谢
ken