[求助] !!!求430读取VDD管脚上的电压值的代码!!!

helloxieyu   2015-4-21 10:12 楼主
求430读取VDD管脚上的电压值的代码,哪位大大有的,可否参考一下。
我想读取430VDD管脚上的电压值来粗略判断3.6V的锂电池的剩余电量,
不知道这种方法可行否,只要很粗略的判断(比如低电量通知)就行了。
另外,这样子是否无需改动外部任何电路?不用参考电阻或者分压电阻什么的?因为我只要读VDD管脚上的电压值。

回复评论 (12)

430耐压3.6V,锂电池充满应该是4.2V,会不会过压损坏MCU? 参考UG,ADC指南里面有关于采集1/2Vcc的说明,选择对应通道即可。 另外要选择好合适的参考电压,不然超过一定电压(比如3V)ADC就溢出了,采集到的所有数据都是3FFF(以ADC10为例) 本帖最后由 qiushenghua 于 2015-4-21 10:20 编辑
点赞  2015-4-21 10:15
引用: qiushenghua 发表于 2015-4-21 10:15
430耐压3.6V,锂电池充满应该是4.2V,会不会过压损坏MCU?
参考UG,ADC指南里面有关于采集1/2Vcc的说明,选择对应通道即可。
另外要选择好合适的参考电压,不然超过一定电压(比如3V)ADC就溢出了,采集到的所有数据都是3FFF(以ADC10为例)

你觉得楼主这方法可行性多大??测板子VCC,判断电量
点赞  2015-4-21 10:30
一般可以这样做,将ADC的基准参考设置为VDD,然后去读取内部的基准电压。因为内部基准相对是一个恒定值,这样就可以反推出VDD的电压了,这样是不需要改动电路的。

但是如果是锂电池,电压超过了3.6V,就不能直接连到VDD上,可以串联二极管降压。如果不需要精确电压,只需要一个告警门限,通常用比较器就行。
点赞  2015-4-21 10:50
引用: 数码小叶 发表于 2015-4-21 10:30
你觉得楼主这方法可行性多大??测板子VCC,判断电量

测量VCC可以测准,但是判断电量就不好说了。不同电池的电压-电量曲线是不一致的。另外,如果是MSP430还好说,如果电池上带有其他负载,那么电压还与电流有关系,就更难测准电量了。
点赞  2015-4-21 13:53
引用: qiushenghua 发表于 2015-4-21 13:53
测量VCC可以测准,但是判断电量就不好说了。不同电池的电压-电量曲线是不一致的。另外,如果是MSP430还好说,如果电池上带有其他负载,那么电压还与电流有关系,就更难测准电量了。

分析的很透彻
点赞  2015-4-21 14:58
你不想用电阻分压可能是为了节省电能,其实可以用430控制一个小电流的PMOS管子,PMOS管子的漏电流非常小,而且导通压降为零,在需要测量时打开PMOS ,不需要时关断就行了
点赞  2015-4-21 17:33
引用: dcexpert 发表于 2015-4-21 10:50
一般可以这样做,将ADC的基准参考设置为VDD,然后去读取内部的基准电压。因为内部基准相对是一个恒定值,这样就可以反推出VDD的电压了,这样是不需要改动电路的。

但是如果是锂电池,电压超过了3.6V,就不能直接连到VDD上,可以串联二极管降压。如果不需要精确电压,只需要一个告警门限,通常用比较器就行。

新技能get
点赞  2015-4-21 17:35
没做过这方面的,你可以把VDD接到AD口来读取数据,然后转换电压值吧
点赞  2015-4-21 17:37
没有那么复杂,ADC本来就有特殊通道的,Vcc/2就是一个特殊通道,选择它作为输入就行了
点赞  2015-4-21 21:01
下面这段代码摘自某个程序,使用MSP430G2452实现电源电压检测部分。

其中ADC_Interrupt为宏定义,用于判断唤醒MCU的中断源确系ADC中断,说明ADC转换完成。
需要在ADC中断服务里将MCU从低功耗工作状态中唤醒。

  1.                         //测电压
  2.                         ADC10CTL1 = INCH_11;
  3.                         ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON+ ADC10IE;
  4.                         ADC10CTL0 |= ENC + ADC10SC;
  5.                         LPM3;
  6.                         if(ADC_Interrupt)
  7.                         {
  8.                                 ADC_value = ADC10MEM;
  9.                                 ADC10CTL0 &= ~ENC;
  10.                                 if(ADC_value==0x3ff)
  11.                                 {
  12.                                         ADC10CTL0 &= ~ENC;
  13.                                         ADC10CTL1 = INCH_11;
  14.                                         ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + REF2_5V + ADC10IE;
  15.                                         ADC10CTL0 |= ENC + ADC10SC;
  16.                                         LPM3;
  17.                                         if(ADC_Interrupt)
  18.                                         {
  19.                                                 ADC_value = ADC10MEM;
  20.                                                 ADC10CTL0 &= ~ENC;
  21.                                                 Vcc=(ADC_value>>1)+(ADC_value<<1);
  22.                                         }
  23.                                 }
  24.                                 else
  25.                                 {
  26.                                         ADC_value+=ADC_value>>1;
  27.                                         Vcc=ADC_value;
  28.                                 }
  29.                         }
点赞  2015-4-21 23:41
又是“qiushenghua”大大帮忙,问题解决了,谢谢啦!
点赞  2015-4-23 10:30
但是还有问题,我手头的3.6V锂电池(非充电,一次性的),用了一段时间就没电了,连430初始化外设时连续3秒的3mA输出都顶不住,被下拉到1V以下,之后我断开锂电池负载用万用表测量3.6V锂电池是3.687V,电压还很高啊,怎么就没电了呢,
我记得这个锂电池新的时候也是差不多这个电压值的呀,如果是这样,我用测量电压的方法来判断电池大概的剩余电量的方法就行不通了。
点赞  2015-4-23 10:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复