MSP430F2232使用ADC进行系统电池电压监测

MSP22x2内部10位ADC用来进行系统电压检测。使用内部1.5V参考源,P2.0作为电池电压检测口。外部使用3M:1M分压电路。电压门限选定为2.45V和2.75V,对应的ADC的值为418和468。ADC满量程为1023,对应1.5电压。
ADC10采集函数:

u16 hal_ADC_measure(void)
{
  //-----------开ADC电压测量-------------------------------------------------
  // ,开启ADC10,允许中断,开启内部参考,V(REF+)=1.5v,V(R+) = V(REF+) and V(R-) = V(SS)
  ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
  ADC10AE0 |= 0x01;                       // P2.0 模拟信号输入使能
  ADC10CTL0 &= ~ENC;                    //ENC=0,修改A/D控制寄存器
  ADC10CTL0 |= ENC + ADC10SC;   //启动AD转换器
  //延时,等待ADC转换完成
//	    Set_TimeA1_ON(10);
//	    __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit等待AD转换完成
//	    Set_TimeA1_OFF();
  delay_10us(30); //300us延时
  //-----------------关闭ADC模块及IO处理---------------------------------------------------
  ADC10CTL0 &= 0XFFFD;                    //ENC=0,修改A/D控制寄存器
  ADC10CTL0 &= 0x0000;
  ADC10AE0 &= 0xfe;                         // P2.0 模拟信号输入禁止

  return ADC10MEM;
}

电压检测函数为:

void app_battary_voltage_detect(u16 CallTimes)
{
//	static u8 TimeCnt = 0;	      //检测时间计数
  static u8 VolThr275Cnt = 0;   //2.75v门限计数器,低于该值计数
  static u8 VolThr245Cnt = 0;   //2.45v门限计数器,低于该值计数

  u16 VoltageValue = 0;

//	  TimeCnt++;
//
//		if(TimeCnt >= CallTimes)
//		{
//			TimeCnt = 0;

    VoltageValue = hal_ADC_measure();

    if(VoltageValue <= V245_VREF_V15)     //电压低于2.45v
    {
      if (VolThr245Cnt < TIMES_CNT_BATTERY_LOW)
      {
        VolThr245Cnt++;
      }
      VolThr275Cnt = 0;
    }
    else if(VoltageValue <= V275_VREF_V15)//电压低于2.75v
    {
      if (VolThr275Cnt < TIMES_CNT_BATTERY_LOW)       {         VolThr275Cnt++;       }       VolThr245Cnt = 0;     }     else                                  //电压高于2.75v     {       VolThr245Cnt = 0;       VolThr275Cnt = 0;     }     if(VolThr245Cnt >= TIMES_CNT_BATTERY_LOW)       //连续5次低于2.45v,200s*5 = 1000s
    {
      g_uBatteryState = BATTERY_LOW;
    }
    else if (VolThr275Cnt >= TIMES_CNT_BATTERY_LOW) //连续5次低于2.75v
    {
      g_uBatteryState = BATTERY_WARNING;
    }
    else
    {
      g_uBatteryState = BATTERY_OK;
    }
//	  }
}

今天在使用电压检测函数时还发现一个问题:如果连续多次调用该函数,当电压为低时只有第一次ADC采集到的值是真实的。例如,Vcc为2.2V,连续调用检测函数10次后得到的结果为电压正常,如果两次调用之间延迟100ms,则采集的结果是正确的。
猜测可能的原因是在关闭ADC后立即再次开启ADC可能ADC采集端口的电平出现异常。其实如果是要多次采集,应该是采集完成后再关闭ADC,而不会向这里反复开关ADC。

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/msp430f2232%e4%bd%bf%e7%94%a8adc%e8%bf%9b%e8%a1%8c%e7%b3%bb%e7%bb%9f%e7%94%b5%e6%b1%a0%e7%94%b5%e5%8e%8b%e7%9b%91%e6%b5%8b/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名