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.

[参考译文] MSP430FR5994:读取多个 ADC 通道

Guru**** 2378650 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1440553/msp430fr5994-reading-multiple-adc-channels

器件型号:MSP430FR5994

工具与软件:

我正在尝试从 A3和 A4输入读取处理器数据。 我可以读取 A3、但当我尝试读取 A4时、我得到相同的值。 借助调试器、我可以根据我调用函数的哪个参数正确地更改 ADC12MCTL0、所以我假设我读取结果寄存器时还有其他问题? 如果有任何帮助、将不胜感激。

uint16_t adcResult = 0x0000;

void initADC(){
    while(REFCTL0 & REFGENBUSY);            // If ref generator busy, WAIT
    REFCTL0 |= REFVSEL_2 | REFON;           // Select internal ref = 2.5V

    ADC12CTL0 = ADC12SHT0_2 | ADC12ON;
    ADC12CTL1 = ADC12SHP;                   // ADCCLK = MODOSC; sampling timer
    ADC12CTL2 |= ADC12RES_2;                // 12-bit conversion results
}

uint16_t sampleADC(ADC_Input channel){
    //select right channels from the ADC
    switch(channel){
        case ADC_CH_REG_3V3:
            ADC12MCTL0 = ADC12INCH_4 | ADC12VRSEL_1;       // A1 ADC input select; Vref=+VRef
            break;
        case ADC_CH_INA241:
            ADC12MCTL0 = ADC12INCH_3 | ADC12VRSEL_1;
            break;
    }

    while(!(REFCTL0 & REFGENRDY)); //make sure reference has settled
    ADC12IER0 |= ADC12IE0;              // Enable ADC conv complete interrupt
    ADC12CTL0 |= ADC12ENC | ADC12SC;    // Enable and start sampling/conversion    

    __bis_SR_register(LPM0_bits + GIE);      // Enter LPM0 w/ interrupts

    return adcResult;
}

//**********************************************************************************************
//** ADC Interrupt routine *********************************************************************
//** Called when the corresponding ADC12MEMx memory register is loaded with a conversion result
//**********************************************************************************************
#pragma vector = ADC12_B_VECTOR
__interrupt void ADC12_ISR(void)
{
    switch(__even_in_range(ADC12IV, ADC12IV__ADC12RDYIFG))
    {
        case ADC12IV__ADC12IFG0:            // Vector 12:  ADC12MEM0 Interrupt
            adcResult = ADC12MEM0; 
            // Exit from LPM0 and continue executing main
            __bic_SR_register_on_exit(LPM0_bits);
            break;
    }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当 ADC12ENC=1时、您不能更改 ADC12INCH (或 ADC12MCTL0中的任何其它内容)[参考用户指南(SLAU367P)图34-19 --注意阴影]。

    尝试在完成 ISR 中或在进入 sampleADC ()时清除 ADC12ENC。

    [编辑:更正了拼写错误。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bruce、一个简单的解决方法。 实际上、用户指南中的内容非常清楚、我不确定是如何漏掉的。 感谢您的帮助。