各位好:
我现在在用MSP430F5172做一款控制器,使用的板子为自己设计的电路板,编译器采用IAR5.30在XP的操作系统上面,
板子XT1的晶振为8M,目前在调试中对于ADC10多通道多次采样这块有点不是很明白,想问问是不是在多通道时先对高通道进行一次AD转换,然后再是低通道,直到A0吗?那这个多次采样在多通道中怎么实现?还有就是ADC10的ADC转换结果就一个ADC10MEM0,怎样区分是哪个通道的采样结果,难道只能根据自己软件设置标志位区分吗?希望大家能多多给予帮助,非常感谢!
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做一款控制器,使用的板子为自己设计的电路板,编译器采用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
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次采样吗(看寄存器说是传输一个字或者字节)?谢谢!
说实话,我用了G2553一年多了,一一直对于ADC10的多通道重复采样没有用明白,一直不知道什么时候读ADC10的转换结果的值,他说的是自动存在一个规定好的内存里面,那么这个内存改怎么规定,他的大小和采样次数有什么联系(例如我先选择ADC0---ADC3,4个通道进行序列的ADC转换,希望每个通道采样10,然后去平均值,改选择多大的内存和采样次数呢?),希望TI的工程师们给个可靠的历程看看;再就是他每次什么时候进中断,是转换一个通道结束后进中断,还以这一个序列转换结束后再进通道呢?