LM3S9B96 ADC+uDMA 采样率与传输数量问题



使用硬件平台DK_LM3S9B96,软件平台IAR 6.40

我想要以200~300Hz的采样率对PE5口输入的模拟信号进行采样:

//Set sample rate

SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); 
 ADCReferenceSet(ADC0_BASE,ADC_REF_INT); 
ADCHardwareOversampleConfigure(ADC0_BASE,64);
ADCSoftwareOversampleConfigure(ADC0_BASE,0,8);

这时得到的采样率为125K/64/8≈244Hz?对不对?

采用处理器触发,并进行如下配置:

MAP_uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT,
                                                             UDMA_SIZE_32 | UDMA_SRC_INC_NONE |
                                                                UDMA_DST_INC_32 | UDMA_ARB_1024);

每触发一次传输1024个数据.

但是实验显示:

调用一次 ADCProcessorTrigger(ADC0_BASE, 0) 函数,传输1024个数据,但 data[1] 到 data[1023] 都是相同的.

原因是不是uDMA 通道读取 ADC_O_SSFIFO0过于频繁,1024个数据并未采样结束?导致相同数据进行了多次传输? 

如果将UDMA_ARB_1024改成UDMA_ARB_1,并以一定时间间隔调用

  MAP_ADCProcessorTrigger(ADC0_BASE, 0)函数,则可以得到正确的采样结果,但这样uDMA功能完全得不到发挥啊?

那么我应该怎么做才能每触发一次就能传输1024个数据,并且保证我想要的采样率?

谢谢!

  • 楼主只调用一次ADCProcessorTrigger(ADC0_BASE, 0) 函数只能触发一次采样序列0的采集。建议楼主使用定时器触发ADC,而不要使用软件触发,这样就可以自动的连续触发采样序列的采样了。

    而uDMA的arbitration size设置成8,,也能够自动完成采样数据的传输。这样当ADC采样序列0完成后会触发一次uDMA传输,将8个items的数据通过uDMA传到目的地址。

    但是1024个数据比较多,ADC没有这么长的FIFO,所以最多是8个数据采集到了再触发一次uDMA传输。建议楼主通过多次uDMA传输来达到1024个数据的数量。

    至于采样率,楼主在代码中使用的ADCHardwareOversampleConfigure(ADC0_BASE,64);是过采样平均的功能,可以认为是对采样率的分频,至于语句ADCSoftwareOversampleConfigure(ADC0_BASE,0,8);是软件过采样,需要调用相应的API函数获得采样值。所以建议楼主使用硬件过采样,然后设置定时器触发的时间间隔来达到想要的采样率。

  • 谢谢

    改为定时器触发ADC

    乒乓模式uDMA传输了

  • 能不能发点adc dma的例程啊???