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

关于MSP430上的ADC10的一些疑问

$
0
0

主要是关于ADC10的一些疑问,单片机型号为MSP430F2274,使用IAR5.3环境编译

1.VREF+和VeREF+以及VREF-和VeREF的关系,他们都有对应的GPIO口,而且同级同引脚,是不是VREF是输入的,VeREF是输出的,我有点搞不清楚

2.这个问题主要感觉还是1引起的,就是ADC10采集的值经过换算后无法和实际值匹配,而且波动偶尔比较大,但是万用表示波器测出来稳定的,硬件参数如下:

单片机28脚(VREF+/VeREF+)接2.5V,单片机27脚(VREF-/VeREF-)接地,AVCC接3.3V,AVSS接GND,25脚(AD的A6)用于接到纽扣电池的输入端的1/2电压出,用于测量纽扣电池的电压,现纽扣电池用恒压源3.3V代替,结果测出来AD值是500多。

按照公司AD值应该=1024 * 1.65 / 2.5 = 675.84,怎么会相差这么多,程序如下

#include <msp430x22x4.h>

 

#define P_LED2          (1<<4)

#define P_LED2_DIR      P1DIR

#define P_LED2_OUT      P1OUT

#define LED2_ON()       P_LED2_OUT |= P_LED2

#define LED2_OFF()      P_LED2_OUT &= ~P_LED2

 

#define ADS_NUM 16

unsigned int ads_val[ADS_NUM] = {0};

unsigned int ads_cnt = 0;

unsigned int ads = 0, tmp = 0;

 

int main( void )

{

  // Stop watchdog timer to prevent time out reset

  WDTCTL = WDTPW + WDTHOLD;

  //主频为内部时钟,频率为1MHZ

  BCSCTL1 = CALBC1_1MHZ;

  DCOCTL = CALDCO_1MHZ;

  //LED配置

  LED2_OFF();

  P_LED2_DIR |= P_LED2;//LED2设为输出

 

  //定时器配置

  TBCCR0 = 32768 / 100 - 1;

  TBCTL = TBSSEL_1 + MC_1;

 

  //AD初始化

  ADC10AE0 |= (1 << 6);

  ADC10CTL0 = SREF2 | SREF1 | ADC10SHT_2 | REFBURST | ADC10ON;

  ADC10CTL1 = INCH_6;

 

  while(1)

  {

    while(!(TBCCTL1 & CCIFG));

    TBCCTL1 &= ~CCIFG;

    P_LED2_OUT ^= P_LED2;

   

    //ADC10CTL0 = SREF2 | SREF1 | ADC10SHT_2 | REFBURST | ADC10ON;

    //ADC10CTL1 = INCH_6;

    for(unsigned int i = 0; i < 60000; i++); //延时

    ADC10CTL0 |= ENC + ADC10SC;//启动AD采样

    while(ADC10CTL1 & ADC10BUSY);

    ads_val[ads_cnt++] = ADC10MEM;

    tmp += ADC10MEM;

    if(ads_cnt == ADS_NUM)

    {

      ads = tmp / ADS_NUM;

      ads_cnt = 0;

      tmp = 0;

    }

    //ADC10CTL0 = SREF2 | SREF1 | ADC10SHT_2 | REFBURST;

  }

}


Viewing all articles
Browse latest Browse all 3634

Trending Articles