五六月份调试一个使用MSP430F2132作为主控单片机的系统,在ADC操作上遇到了些问题,现将过程分享出来,希望对初学者能有所帮助。
1. 使用ADC10模块测量电源电压,参考电压使用内部的2.5V,时钟源ADC10OSC,不分频,通道选择11,即(VCC – VSS) / 2,参考TI的示例程序,编写并调试出相关功能代码如下:
void vcccheck(void)
{
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + REF2_5V;
ADC10CTL1 = INCH_11;
ADC10CTL0 |= ENC + ADC10SC;
soft_delay_us(1000);
while(!(ADC10CTL0 & ADC10IFG))
{
__no_operation();
}
if( ADC10MEM < 614 )
{
...; //自定义处理过程
}
else
{
...; //自定义处理过程
}
ADC10CTL0 = 0; //停止ADC
}
2. 按上述程序调试,得到ADC10MEM测量值,但最后测量整个线路板的静态(LPM3)功耗时却发现比设计指标多了几百微安。怀疑是外围电路引起的,因为不敢怀疑430的功耗指标,于是用硬件和软件的方法对外围电路进行排除法测试,包括从PCB上断开单片机正电源路径,实验结果可以排除焊接及外围电路带来超标功耗的可能性。这时开始怀疑是不是自己哪里的设置不对,请教代理商的技术支持,咨询可能是什么部分引起的功耗,他们建议拿空板只焊单片机来进行区分是单片机引起还是外围电路引起的。我嫌麻烦,因为再去焊那QFN封装很麻烦,而且手头没有空板了。于是绞尽脑汁分析自己的电路,除了单片机自身功耗,以及I/O口在LPM3状态时输出高低电平或输入高电平或许是问题源头,其它地方从理论上看不可能带来额外功耗。没办法,动手吧。把外围电路断开,并按技术支持的建议,将输出都置为低电平输出或输入状态。再测试功耗,基本还是那么大!改分析程序吧,把原来休眠后的看门狗关掉,中断关掉,还是那么大,要奔溃了!打开芯片数据手册,将有被使用的功能模块的用法逐一再研读并实验,最后到了ADC10这一块了,细读ADC10CTL0寄存器的说明,突然发现可能是最后一句停止ADC没起作用,因为这个寄存器比较特殊,除了末四位,其它位能被修改是有前提条件的,即ENC=0。发现新大陆,当初编程时没太注意这一点,而且示例程序中并不说明这些。于是乎,在最后一句之前再加上一句“ADC10CTL0 &= ~ENC;”,再试,功耗一下降下去几百微安,基本接近设计指标,还原其它为了调试而修改的外围电路和I/O口状态,基本没影响,也就是说此ADC10模块在不进行转换操作时,功耗有几百微安。神哪,问题总算找到了,后悔当初不仔细研究数据手册啊!
3. 总结调试过程,除了上述寄存器的修改方法,另得到几个结论:I/O口的漏电是很小的,比如在休眠状态,即使某个I/O保持高电平输出状态来控制外部的PNP三极管处于截止状态,这样也并不影响低功耗;430单片机的低功耗指标参数是值得信赖的,除非你的单片机已经损坏了;