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.

ADC10 channel 只想設置A4 and A5

ADC10MCTL0 = ADC10INCH_5; //A0~A5
請問若只想監聽A4/A5的話該如何設置?
  • 可以尝试下面两者方法之一

    1 您使用单通道转换,在每次转换时触发一个中断,并在ISR内部切换通道并重新开始转换。

    2 继续使用ADC10MCTL0 = ADC10INCH_5; //A0~A5,要从序列中选择一个样本的话,您可以让ADC10在每次转换时触发一个中断,并且在中断处理程序中,选择仅存储ISR的第五次和第六次调用的结果。
  • 感謝回復

    那請問如果用MSP430F530x_adc10_10.c這隻範例來改該怎麼修改呢?

    #include <msp430.h>

    unsigned char ADC_Result[3]; // 8-bit ADC conversion result array

    int main(void)
    {
    WDTCTL = WDTPW | WDTHOLD; // Stop WDT

    // Configure ADC10
    ADC10CTL0 = ADC10SHT_2 | ADC10MSC | ADC10ON;// 16ADCclks, MSC, ADC ON
    ADC10CTL1 = ADC10SHP | ADC10CONSEQ_1; // sampling timer, s/w trig.,single sequence
    ADC10CTL2 &= ~ADC10RES; // 8-bit resolution
    ADC10MCTL0 = ADC10INCH_2; // A0,A1,A2(EoS), AVCC reference

    // Configure DMA0 (ADC10IFG trigger)
    DMACTL0 = DMA0TSEL_24; // ADC10IFG trigger
    __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0);
    // Source single address
    __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[0]);
    // Destination array address
    DMA0SZ = 0x03; // 3 conversions
    DMA0CTL = DMADT_4 | DMADSTINCR_3 | DMASRCBYTE | DMADSTBYTE | DMAEN | DMAIE;
    // Rpt, inc dest, byte access,
    // enable int after seq of convs
    while(1)
    {
    while (ADC10CTL1 & ADC10BUSY); // Wait if ADC10 core is active
    ADC10CTL0 |= ADC10ENC | ADC10SC; // Sampling and conversion start
    __bis_SR_register(CPUOFF | GIE); // LPM0, ADC10_ISR will force exit
    __delay_cycles(5000); // Delay between sequence convs
    __no_operation(); // BREAKPOINT; check ADC_Result
    }
    }

    #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:
    // sequence of conversions complete
    __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;
    }
    }
  • 这个例程的话是序列采样,采样A0-A2这3个通道的值,建议您使用第2种方法

    可以让ADC10在每次转换时触发一个中断,并且在中断处理程序中,选择仅存储ISR的第五次和第六次调用的结果。