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.

MSP430F5172 ADC10 多通道多次采样问题

Other Parts Discussed in Thread: MSP430F5172

各位好:

我现在在用MSP430F5172做一款控制器,使用的板子为自己设计的电路板,编译器采用IAR5.30在XP的操作系统上面,

板子XT1的晶振为8M,目前在调试中对于ADC10多通道多次采样这块有点不是很明白,想问问是不是在多通道时先对高通道进行一次AD转换,然后再是低通道,直到A0吗?那这个多次采样在多通道中怎么实现?还有就是ADC10的ADC转换结果就一个ADC10MEM0,怎样区分是哪个通道的采样结果,难道只能根据自己软件设置标志位区分吗?希望大家能多多给予帮助,非常感谢!

  • Hi Yezi,

      首先关于我们ADC10多通道采样转换的理解,你是对的。它是先对高通道x采样,然后再到x-1,最后知道A0通道。这个对于用户编程来说,首先你要设定ADC工作在sequence模式下,然后再去设置ADCMCTL里面去设定最高通道的值。

      在转换结果里面我们确实是只有一个ADC10MEMO寄存器,但是在ADC12里面是有多个结果寄存器的。对于多通道采样的情况,我们一般可以采用DMA的方式来直接将转换的结果传输到你需要存储的区域。用DMA的好处是,它会自动根据ADC10MEMO里面是否有数据触发每次DMA,然后根据自己设定的终端地址,来区别存储每次ADC的转换值。

    我们的430ware里面有关于这方面的例子,你可以参考一下。

    谢谢

    ken

  • 恩,我明白了,那是不是设置成SEQUENCE模式后,只需要设置你使用的最高通道,其他通道不用设置是吗?比方说我使用了三个通道,通道8,通道7,通道6,是不是就只设置8就行了,ADC10MCTL0 = ADC10SREF_1 + ADC10INCH_8;还有那个多次采样怎么在多通道中实现?

  • Hi Yezi,

      你在设置多个采样通道的过程中,有个需要注意的问题是,你需要选择好你的采样通道,特别是当你打算选用sequence模式时,因为你只能通过ADC10MCTL0设置最高通道的值。举个例子说如果你设置为通道8,它就意味着这个sequence会从A8一次轮询采样至A0。

      如果你要设置多次采样的话,你可以设置位repeat sequence模式。即如下设置:

    ADC10CTL1 =  ADC10CONSEQ_3; // repeat sequence mode

    谢谢

    ken

  • 恩,我把我程序贴出来,想知道,我如何获取ADC结果,如何在DMA中得到。而且我还是不明白这个多通道多次采样的多次体现在哪?

    void ADC_Convern(void)
    {
    P3SEL |= BIT7+BIT6+BIT5; // P3.7 ADC option select
    // Configure internal reference
    while(REFCTL0 & REFGENBUSY); // If ref generator busy, WAIT
    REFCTL0 |= REFVSEL_2+REFON; // Select internal ref = 2.5V
    // Internal Reference ON
    ADC10CTL0 |= ADC10SHT2 + ADC10ON+ADC10MSC; // Sampling and holding time(16), ADC10 on
    ADC10CTL1 = ADC10SHP + ADC10CONSEQ_3; // s/w trig, single ch/conv // MODCLK 单通道多次 SampCon信号选择定时器输出
    ADC10CTL2 |= ADC10RES; // 10-bit conversion results
    ADC10MCTL0 = ADC10SREF_1 + ADC10INCH_8; // 选择参考为Vref+,A8
    UsDelay(75);
    ADC10IE = 0x01; // Enable interrupt

    ADC10CTL0 |= ADC10ENC+ADC10SC; //使能转换 // Start sampling/conversion
    // Configure DMA0 (ADC10IFG trigger)
    DMACTL0 = DMA0TSEL_24; // ADC10IFG trigger
    __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0);
    // Source single address
    DMA0SZ = 0x02; // 2x32 conversions
    DMA0CTL = DMADT_4 + DMADSTINCR_3 + DMAEN + DMAIE;
    // Rpt, inc dest, byte access,
    // enable int after seq of convs
    }

    还有就是我硬件已经确定是使用A8A7 A6这三个通道了,ADC10的多次与DMA 的DMA0SZ有关吗  怎么配置?谢谢!

  • Hi Yezi,

     你贴出来的代码应该是我们的参考代码,里面初始化的设计基本没什么问题,关键就是你提到的DMA0SZ的设置,我们的实例程序里面设置的两通道重复采样,它设置的重复采样次数是32次,所以设置的DMA0SZ= 2*32,然后在主程序里面更新DMA的终端地址。

    因为你选择的是A8到A6三个通道,所以DMA0SZ的大小应该是等于你想设置的重复采样的次数在乘以3. 但是这边有可能会遇到的一个问题是,因为你设置的sequence 采样的最高值是A8,我担心它会一直采样到A0,然后在循环回来,这样会导致你得到的数据有误。

    你看你能不能先这样试试,就采用single sequence模式,只采一次,然后看看A8-A6的三个数值是否正确。

    谢谢

    ken

  • 我试了下,发现只有两路时数据是正确的(测试时只有一路输入信号,加到三个通道测试时就只能得到前两个通道的数据)。还有我想问下那个

    __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0);与

    __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[i*2]);

    因为得到的数据在ADC_Resul【】中,我不太明白数据在里面的顺序。

    我用两路 得到的数组值是这样的ADC_Resul【0】=0;ADC_Resul【1】=0;ADC_Resul【2】=0;ADC_Resul【3】=0;ADC_Resul【4】=807;ADC_Resul【5】=0;ADC_Resul【6】=806;ADC_Resul【7】=0;ADC_Resul【0】=807........只有数组的第一个和第二个数据为0,其他都是0与807交叉。我想知道是不是数组下标为偶数的是高通道的值,奇数位的是低通道的值?还有就是我不想要那么多的采样次数,能设置成3次采样吗(看寄存器说是传输一个字或者字节)?谢谢!

  • Hi Yezi,

      看了你的测试结果,我有一点不明白的地方就是,你现在是用三个ADC通道去采样一个输入信号是吧,那你ADC0SZ = 3* 次数,与此同时,你的DMA的终端地址也应该是将数组ADC_Result【i*3】才对,这样才能得到三次正确的值。

    如果你想控制采样的次数为3次的话,你可以采用这样的方法,使能DMA传输完中断,然后再中断里面计数,当采集了3次以后disable ADC模块就能实现了。

    不知道这样的表述,你能不能接受。希望能帮到你。

    谢谢

    ken

  • 说实话,我用了G2553一年多了,一一直对于ADC10的多通道重复采样没有用明白,一直不知道什么时候读ADC10的转换结果的值,他说的是自动存在一个规定好的内存里面,那么这个内存改怎么规定,他的大小和采样次数有什么联系(例如我先选择ADC0---ADC3,4个通道进行序列的ADC转换,希望每个通道采样10,然后去平均值,改选择多大的内存和采样次数呢?),希望TI的工程师们给个可靠的历程看看;再就是他每次什么时候进中断,是转换一个通道结束后进中断,还以这一个序列转换结束后再进通道呢?