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.

MSP430FR5739 开发板 ADC采集问题



你好,代码如下,我用ADC序列采集A4-A0口数据,发下,第一次采集时A4口采集到的数据很小只有20-30;之后的ADC采集,A4口采集到的数据都为300左右。我感觉第一次采集到的数据有问题,但不知道问题出在哪里? 希望您能帮助解决。是不是ADC第一次采集到的数据都不准确,需要舍去。其中A4采集的是热敏电阻的电压值。

unsigned short ADC_Result[5]; /*10-bit ADC 转换结果存储*/
;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;

//系统时钟设置
CSCTL0_H = CSKEY_H; /*输入时钟保护密码*/
CSCTL1 |= DCOFSEL_3; /*DOC时钟为8MHz */
CSCTL2 = SELA_1 + SELS_3 + SELM_3; /*ACLK时钟源选择内部的VLOCLK(10KHz),SMCLK和MCLK的时钟源都选择DOC时钟*/
CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; /*ACLK,SMCLK,MCLK都未进行分频,因此ACLK为10KHz,SMCLK和MCLK为8MHz*/
CSCTL0_H = 0x01; /*时间寄存器设置完成,进行锁存保护*/

//P2.7被用作热敏电阻的电压驱动

P2OUT |= BIT7;
P2DIR |= BIT7;

//内部参考电压设置
while(REFCTL0 & REFGENBUSY); /* 判断Ref是否处于busy状态*/
REFCTL0 |= REFVSEL_0+REFON; /* 设置参考电压为1.5v,开启Ref*/


// ADC引脚配置
P1SEL0 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;
P1SEL1 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;

// ADC10参考设置
ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;/* 16ADCclk采样时间, MSC, ADC打开*/
ADC10CTL1 = ADC10SHP + ADC10CONSEQ_1; /*sampling timer, 单通道序列采集*/
ADC10CTL2 = ADC10RES; /*10-bit分辨率*/
ADC10MCTL0 = ADC10SREF_1+ADC10INCH_4; /*A0,A1,A2,A3,A4(EoS), 1.5V参考电压*/

// DMA0参数设置
DMACTL0 = DMA0TSEL__ADC10IFG; /* DMA0通道采用ADC10IFG标志位触发*/
__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0); /*DMA0 的源地址*/
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[0]); /*DMA0 的目的地址*/
DMA0SZ = 0x0005; /*进行5次转换*/

/*重复单次转换,每次转换目的地址增加,源地址默认不变,目的和源都采用字转换模式,DMA使能,DMA中断使能*/
DMA0CTL = DMADT_4 + DMADSTINCR_3 + DMAEN + DMAIE ; 

while(1)
{

while (ADC10CTL1 & BUSY); /*如果ADC忙,就等待*/
ADC10CTL0 |= ADC10ENC + ADC10SC; /*开始采集及样本转换*/
__bis_SR_register(CPUOFF + GIE);
__delay_cycles(25000);
__no_operation();
}
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=DMA_VECTOR
__interrupt void DMA0_ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(DMA_VECTOR))) DMA0_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(DMAIV,16))
{
case 0: break; // No interrupt
case 2:

// 序列转换完成进入中断,激活CPU
__bic_SR_register_on_exit(CPUOFF); // exit LPM
break; // DMA0IFG
case 4: break; // DMA1IFG
case 6: break; // DMA2IFG
case 8: break; // Reserved
case 10: break; // Reserved
case 12: break; // Reserved
case 14: break; // Reserved
case 16: break; // Reserved
default: break;
}
}

  • 软件看不出有什么问题。建议提供下电路图

  • Jent Lee 说:

    你好,代码如下,我用ADC序列采集A4-A0口数据,发下,第一次采集时A4口采集到的数据很小只有20-30;之后的ADC采集,A4口采集到的数据都为300左右。我感觉第一次采集到的数据有问题,但不知道问题出在哪里? 希望您能帮助解决。是不是ADC第一次采集到的数据都不准确,需要舍去。其中A4采集的是热敏电阻的电压值。

    unsigned short ADC_Result[5]; /*10-bit ADC 转换结果存储*/
    ;
    int main(void)
    {
    WDTCTL = WDTPW + WDTHOLD;

    //系统时钟设置
    CSCTL0_H = CSKEY_H; /*输入时钟保护密码*/
    CSCTL1 |= DCOFSEL_3; /*DOC时钟为8MHz */
    CSCTL2 = SELA_1 + SELS_3 + SELM_3; /*ACLK时钟源选择内部的VLOCLK(10KHz),SMCLK和MCLK的时钟源都选择DOC时钟*/
    CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; /*ACLK,SMCLK,MCLK都未进行分频,因此ACLK为10KHz,SMCLK和MCLK为8MHz*/
    CSCTL0_H = 0x01; /*时间寄存器设置完成,进行锁存保护*/

    //P2.7被用作热敏电阻的电压驱动

    P2OUT |= BIT7;
    P2DIR |= BIT7;

    //内部参考电压设置
    while(REFCTL0 & REFGENBUSY); /* 判断Ref是否处于busy状态*/
    REFCTL0 |= REFVSEL_0+REFON; /* 设置参考电压为1.5v,开启Ref*/


    // ADC引脚配置
    P1SEL0 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;
    P1SEL1 |= BIT0 + BIT1 + BIT2+BIT3+BIT4;

    // ADC10参考设置
    ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;/* 16ADCclk采样时间, MSC, ADC打开*/
    ADC10CTL1 = ADC10SHP + ADC10CONSEQ_1; /*sampling timer, 单通道序列采集*/
    ADC10CTL2 = ADC10RES; /*10-bit分辨率*/
    ADC10MCTL0 = ADC10SREF_1+ADC10INCH_4; /*A0,A1,A2,A3,A4(EoS), 1.5V参考电压*/

    // DMA0参数设置
    DMACTL0 = DMA0TSEL__ADC10IFG; /* DMA0通道采用ADC10IFG标志位触发*/
    __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0); /*DMA0 的源地址*/
    __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[0]); /*DMA0 的目的地址*/
    DMA0SZ = 0x0005; /*进行5次转换*/

    /*重复单次转换,每次转换目的地址增加,源地址默认不变,目的和源都采用字转换模式,DMA使能,DMA中断使能*/
    DMA0CTL = DMADT_4 + DMADSTINCR_3 + DMAEN + DMAIE ; 

    while(1)
    {

    while (ADC10CTL1 & BUSY); /*如果ADC忙,就等待*/
    ADC10CTL0 |= ADC10ENC + ADC10SC; /*开始采集及样本转换*/
    __bis_SR_register(CPUOFF + GIE);
    __delay_cycles(25000);
    __no_operation();
    }
    }

    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=DMA_VECTOR
    __interrupt void DMA0_ISR (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(DMA_VECTOR))) DMA0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
    switch(__even_in_range(DMAIV,16))
    {
    case 0: break; // No interrupt
    case 2:

    // 序列转换完成进入中断,激活CPU
    __bic_SR_register_on_exit(CPUOFF); // exit LPM
    break; // DMA0IFG
    case 4: break; // DMA1IFG
    case 6: break; // DMA2IFG
    case 8: break; // Reserved
    case 10: break; // Reserved
    case 12: break; // Reserved
    case 14: break; // Reserved
    case 16: break; // Reserved
    default: break;
    }
    }

    单通道单次采样 A4 有没有问题呢?