Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

MSP430F5438A,ADC采集的电压值不对劲

$
0
0

锂电池经过2个1M的电阻分压,P6.6引脚就接在两个电阻中间;

代码如下:

/*
ADC配置
*/
void ADC_Init(void)
{
  P6SEL |= BIT6;                                                   //选择P6.6作为输入;
//  ADC12CTL0 &= ~ADC12ENC;  
  ADC12CTL0 = ADC12SHT02 + ADC12REF2_5V + ADC12ON;
  ADC12CTL1 = ADC12SHP;                                            // 采样保持脉冲来自采样定时器  
  ADC12MCTL0= ADC12SREF_1+ADC12INCH_6;                             //选择参考电压源、现在a5通道
  REFCTL0 |= REFMSTR + REFVSEL_2;                                  //使能REF管理,内部参考电压选择2.5v、打开内部参考电压
  REFCTL0 |= REFON;                                                //内部基准源电压会导致整体功耗多将近180ua;所以这里选择关闭,每次使用ADC的时候开启,使用完之后关闭;
  __delay_cycles(75);  
  ADC12CTL0 |= ADC12ENC;                                           // ADC12使能  
}


/*
得到电池电量的值;
*/
int Get_BatValue(void)
{
  float ADC_Value[20];                      //定义一个数组用来保存直接采到的值;
  float lingshi_data,ADC_total=0;
  int reValue;
  short int i=0;
  unsigned char j=0;
  for(i=0;i<20;i++)
  {
    ADC12CTL0 |= ADC12SC;                   // 启动转换  
    while ( !(ADC12IFG & BIT0) );           // 等待转换完成  
    ADC_Value[i] = ADC12MEM0/4096.0*2.5;  
  }
  
  for(i=0;i<19;i++)
    for(j=0;j<19-i;j++)
      {
        if(ADC_Value[j]>ADC_Value[j+1])
          {
            lingshi_data = ADC_Value[j];
            ADC_Value[j]=ADC_Value[j+1];
            ADC_Value[j+1]=lingshi_data;
          }
      }
  
  for(i=5;i<15;i++)
    {
      ADC_total = ADC_total + ADC_Value[i];
    }
   ADC_total = (ADC_total/10);
   reValue = (int)ADC_total;
   return reValue;
}

发现这样采集到的电压值和用万用表测量出来的差了不少,而且一次采20个点,发现抖动的也比较厉害?

原因在哪里呢?


Viewing all articles
Browse latest Browse all 3634

Trending Articles