社区导航

 

搜索
查看: 3849|回复: 3

[原创] msp430使用ADC后如何关闭才最省电

[复制链接]

7268

TA的帖子

19

TA的资源

版主

Rank: 6Rank: 6

发表于 2014-12-3 14:58 | 显示全部楼层 |阅读模式
本帖最后由 littleshrimp 于 2014-12-3 16:05 编辑

  


   
msp430使用ADC后如何关闭才最省电
   
2014-12-3
  
最近在设计一款低功耗产品,使用MSP430单片机做主控,运行过程中需要定时检测电池电压,因为电池使用2节AA电池串联,工作电压为3V,REF内部参考使用2.5V,每隔一段时间检测一下电池电量,代码如下:
  
  
   
    float voltage;
   
    uint8_t ctl1 =    ADC10CTL1;                 //保存ADC当前的寄存器数据
   
    uint8_t ctl0 =    ADC10CTL0;                 //保存ADC当前的寄存器数据
   
    ADC10CTL1 = INCH_11;                      // AVcc/2
   
    ADC10CTL0 = SREF_1 +    ADC10SHT_2 + REF2_5V + REFON + ADC10ON;
   
    ADC10CTL0 |= ENC +    ADC10SC;               // Sampling and conversion start
   
    while (ADC10CTL1    & ADC10BUSY);               // ADC10BUSY?
   
    voltage = ADC10MEM / 1024.00 * 2.5 *2;    //计算电池电压
   
    if(voltage < 2.9)                         //如果电池电压小于2.9V视为低电压
   
    {
   
        low_batt_flag = 1;                    //设置低电压标志
   
    }
   
    else
   
    {
   
        low_batt_flag = 0;                    //清除低电压标志
   
    }
   
    ADC10CTL1 = ctl1;                         //关闭并复位ADC状态
   
    ADC10CTL0 = ctl0;                         //关闭并复位ADC状态
   
   
  
  
  
看起来很简单的原理,得到的结果却是电流保持在200uA掉不下来。
  
003EKQPqzy6O5QH2Mvdaf&amp;amp;690.png
  
在没有使用过ADC时的电流是这样:
  
003EKQPqzy6O5QH3Dp305&amp;amp;690.png
  
双试着将ADC10CTL1和ADC10CTL0设置为0结果还是一样。
  
   
    uint16_t float ;
   
    ADC10CTL1 = INCH_11;                      // AVcc/2
   
    ADC10CTL0 = SREF_1 +    ADC10SHT_2 + REF2_5V + REFON + ADC10ON;
   
    ADC10CTL0 |= ENC +    ADC10SC;               // Sampling and conversion start
   
    while (ADC10CTL1    & ADC10BUSY);            // ADC10BUSY?
   
    voltage = ADC10MEM / 1024.00 * 2.5 *2;    //计算电池电压
   
    if(voltage < 2.9)                         //如果电池电压小于2.9V视为低电压
   
    {
   
        low_batt_flag = 1;                    //设置低电压标志
   
    }
   
    else
   
    {
   
        low_batt_flag = 0;                    //清除低电压标志
   
    }
   
    ADC10CTL1 = 0;                            //关闭ADC
   
    ADC10CTL0 = 0;                            //关闭ADC
   
   
  
  
最后试着先关ADC再关REF问题解决。
  
003EKQPqzy6O5QH5NeC96&amp;amp;690.png
  
最后的代码是:
  
   
       uint16_t float ;
   
    uint8_t ctl1 =    ADC10CTL1;                 //保存ADC当前的寄存器数据
   
    uint8_t ctl0 = ADC10CTL0;                 //保存ADC当前的寄存器数据
   
    ADC10CTL1 = INCH_11;                      // AVcc/2
   
    ADC10CTL0 = SREF_1 +    ADC10SHT_2 + REF2_5V + REFON + ADC10ON;
   
    ADC10CTL0 |= ENC +    ADC10SC;               // Sampling and conversion start
   
    while (ADC10CTL1    & ADC10BUSY);               // ADC10BUSY?
   
    voltage = ADC10MEM / 1024.00 * 2.5 *2;    //计算电池电压
   
    if(voltage < 2.9)                         //如果电池电压小于2.9V视为低电压
   
    {
   
        low_batt_flag = 1;                    //设置低电压标志
   
    }
   
    else
   
    {
   
        low_batt_flag = 0;                    //清除低电压标志
   
    }
   
   
    ADC10CTL0 &= ~(ENC +    ADC10SC);           
   
   
    ADC10CTL1 = ctl1;                         //关闭并复位ADC状态
   
    ADC10CTL0 = ctl0;                         //关闭并复位ADC状态
   
   




虾扯蛋

回复

使用道具 举报

44

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-12-3 15:33 | 显示全部楼层
是不是打开内部参考电压了,关闭的时候内部参考电压也要关了,不然会耗电~~

回复

使用道具 举报

1194

TA的帖子

3

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

荣誉会员勋章

发表于 2014-12-3 16:27 | 显示全部楼层
可以RTC定时去唤醒ADC,其余时间都是低功耗模式!
construction complete!

回复

使用道具 举报

51

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-4-17 15:18 | 显示全部楼层
感谢楼主分享,正好遇到同样的问题

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-30 15:38 , Processed in 0.193813 second(s), 25 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表