This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5529 adc基准电压请教

大家好,今天写了ADC12A的程序,上午还转换得好好的,下午的时候弄着弄着突然就不行了,是基准电压设置问题,基准电压默认为3.3V就没事,但是只要设置ADC12CTL2 = ADC12RES_2 ;用内部基准电压后,只要有电压输入,不管输入多小,转换的值都是4095(12位),信号电压到0的时候是正常的。不知道大家有没有遇到过这种情况,希望大家指导下。下面是我的最简AD程序

#include <msp430.h>
unsigned int AD_data = 0;
unsigned int AD_data_buf[8];
unsigned int i;
/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
    P6SEL |= BIT0 ;


    ADC12CTL2 = ADC12RES_2 ;    //我感觉问题在此


    ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT0_0 + ADC12REFON ;
    ADC12MCTL0 |= ADC12SREF_1;
    ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2+ADC12SSEL_1;

    for (i=0;i<0xFFFF;i++);

     ADC12IE = 0x01;                           // Enable ADC12IFG.0
     ADC12CTL0 |= ADC12ENC;
     _EINT();
     ADC12CTL0 |= ADC12SC;
     LPM3;
 
 return 0;
}

#pragma vector = ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
  AD_data = (ADC12MEM0_H*256)+ADC12MEM0_L;
     for(i=7;i>0;i--){
         AD_data_buf[i] = AD_data_buf[i-1];
        }
        AD_data_buf[0] = AD_data;
}

  • 你好,zhiye Lai!

    看完你的帖子之后,我认为:

    1. 基准电压中的Vref未设置,需要到REF模块中设置。

    2.中断服务程序尽量简单

    // 声明全局变量

    unsigned char ii;

    // 在主函数的开始部分初始化赋值

    ii = 0;

    #pragma vector = ADC12_VECTOR
    __interrupt void ADC12ISR(void)
    {
           AD_data_buf[ii++] = (ADC12MEM0_H*256)+ADC12MEM0_L;

           if(ii==8){

                LPM4_EXIT;   // LPM4_EXIT;可以退出所有的低功耗模式,包括LPM3

           }
    }

  • HI,Bilk Hellc

         谢谢!问题解决了,如你所说REFCTL0_L这个寄存器并没有设置好,怪我没看清楚!

          还有个问题不知道你遇到过没,就是430中断嵌套的问题,我查过资料说进入中断后关闭总中断,如果要嵌套,则需要在中断中再开总中断,我试了一次,在优先级低的中断中开了总中断,然后停了在低优先级的中断中,但是发现并没有进入高优先级中断,一直停留在低优先级的中断中,不知道是否除了要开总中断外还需要哪些条件