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分时采样

请问一下,我用的430F2012,我想用A1和A3分别对两路模拟信号进行采样转换,然后根据所转换的对应的数据进行相关操作,有没有分时采样的简单例子? 谢谢!

  • A1和A3是不是说的通道,你就直接转换3路AD的数据,然后在把数据拿出来分别计算就可可以了。一般的是定义一个数组,把转换后的ad值放入数组,然后在分别计算。至于例子,ti的网站上的程序基本上都可以用。

  • wen Zhang1,

    msp430x20x2_adc10_10.c           ADC10, ADC10, DTC Sample A3/A2/A1, AVcc, Single Sequence, DCO


    如附件所示。

  • 抱歉,忽然发现写的文字不见了,补充如下:

    这个例子是MSP430Ware  example code中的 为依次采样A1,A2,A3 chanel, 其实就是Conversion sequence mode select选择为:Sequence-of-channels。

    希望对你有帮助!

  • 可以考虑用序列通道转换,按照速度要求高的那个通道的采样频率采样。然后采样速度要求不高的按时处理就可以了。没必要追求分时采样。

  • 你好,感谢你的回答。如果用Single Sequence,因为每次数据都是放在ADC10MEM中了,那我该如何判断现在这个ADC10MEM中的数据到底是A1通道的还是A3通道的,意思其实我是想把A1通道和A3通道的电压值都可以显示出来。

  • wen Zhang1,

    例程中使用了ADC10的DTC功能,‘ DTC transfers conversion code to RAM 200h - 206h.’ 将数据依次存到了RAM中。

  • Lina Lian,

    如果我用序列通道转换的话,是不是只能从序列由高到底,比如我需要A3,A1,那么只能从A3--A2--A1,不能直接选A3,A1?谢谢。

  • wen Zhang1,我个人觉得是可以的,就是禁止A2通道就行了。你试试吧。

    ADC10AE0 |= 0x0E;                         // P1.3,2,1 ADC10 option select

    更改这句为:

    ADC10AE0 |= 0x0A;                         // P1.3,1 ADC10 option select

  • 试过这样数据就不对了

  • #include <msp430.h>
    typedef unsigned int uint;
    uint adc_sample[2]={0};                    //存储ADC序列采样结果
    int main(void)
    {
     
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      ADC10CTL1 = INCH_3 + CONSEQ_3;            // A3/A1, single sequence
      ADC10CTL0 = ADC10SHT_3 + MSC + ADC10ON + ADC10IE;
      ADC10DTC1 = 0x02;                         // 2 conversions
      ADC10AE0 |= BIT1 +BIT3;                         // P1.3,1 ADC10 option select
      P1DIR |= BIT4 + BIT2;                            // Set P1.0 output

    for(;;)
      {
        ADC10CTL0 &= ~ENC;  
        while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
        ADC10SA = (uint)adc_sample;                        // Data buffer start
        ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit  
      }
    }

    #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    {
      __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
      if(adc_sample[0]<0x250)
          P1OUT |= BIT2;
        else
          P1OUT &= ~BIT2;
       if(adc_sample[1]<0x300)
         P1OUT |= BIT4;
       else
         P1OUT &= ~BIT4;
    }

    帮我看一下呢

  • #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    {
      __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
      if(adc_sample[1]<0x250)
          P1OUT |= BIT2;
        else
          P1OUT &= ~BIT2;
       if(adc_sample[0]<0x300)
         P1OUT |= BIT4;
       else
         P1OUT &= ~BIT4;
    }

    刚才的不对,A1通道的数据是放在adc_sample[1]里的,是这个,也不对

  • 它的例子中就是禁止了A0通道吧。请问数据不对时怎么个不对法?是A3,A1全不对了,还是怎么不对了?

    另外

    ADC10DTC1 = 0x03;                         // 3 conversions

    改成

    ADC10DTC1 = 0x02;                         //2 conversions

  • if(adc_sample[1]<0x280)
          P1OUT |= BIT2;
        else
          P1OUT &= ~BIT2;

    这个P1.2脚的信号成方波了

  • wen Zhang1,

    建议你直接将A3,A1先连接Vcc或GND,看看结果对不对,或者连接一个固定的电压,看看结果对不对。如果还不对,建议试试若是将两个通道挨在一起,例如A3,A2或者A2,A1又是什么情况?如果你方便做这些实验的话,麻烦你做做,并麻烦你将结果描述一下。

    我试着找了找相关的解释或参考,没找到。一般大家用sequence of channels mode,都是连着采多个通道的。

  • 嗯 之前直接采A1,A0结果是对的,其他试验我再试试。

  • wen Zhang1,根据user guide, Sequence-of-channels 模式下,总是从INCHx开始,逐步减到A0。 故从Ax~A0依次采样应该都不会出错的。但是没有地方提到,如果通道不连续,会怎么样。还是建议按照标准用法,从Ax~A0连续采样吧,肯定不会出错。O(∩_∩)O~

  •  if(adc_sample[1]<0x000)
          P1OUT |= BIT2;
        else
          P1OUT &= ~BIT2;

    这个0x000到0x3F4都是方波,0x3F5及以上才是稳定的高电平,‘若是将两个通道挨在一起’的话没问题。

  • 好的,谢谢你了,看来我要改板子了。-。-|||