这些细节在STM32F4的原厂参考手册中没有说明,只是很简短的列了一下。
我是查看ST前几天刚发布的接口库才最后弄明白的,不敢独享!
1、STM32F4有3个独立的ADC单元,性能强劲,可以独立使用,也可以联合使用它们。
联合使用在参考手册中叫Interleave模式,最大的目的是加倍提升采样速度。
2、采样速度大幅提高以后,就需要使用DMA来配合提取采样结果,从而发挥STM32F4
ADC模块的最大效能。
3、ADC模块使用DMA有4种模式可选,默认模式和模式1没有什么特别之处。
最有意思的是模式2和模式3:
模式2可以选择多达3个ADC模块工作于Interleave模式,ADC速度从单一模块的
24Msps暴涨为72Msps,而且还是12-bit的分辨率!唯一的要求是每完成2次转换,
允许DMA一次性取走2个采样值。
模式3跟模式2类同,但要求ADC模块的采样率为8-bit或6-bit,由于转换时间要比
12-bit时短,所以速度更快,适用于速度要求更快,但精度要求较低的场合。
比如用2个ADC模块很容易就可以做到6Msps的速率,而且2次的结果可以存为halfword,
经由DMA取走,耗用内存也比模式2来的少。
剩下的那一个ADC模块也不用闲着,可以工作于其他设定(比如:高精度)的模式。
假设你你的ADC_value[2000],如果DMA工作于单次方式,那么装满2000个数据后DMA就停止工作了,除非你重置DMA的CNDTR寄存器。
如果工作于循环方式,DMA在填充ADC_value[1999]后,又回到ADC_value[0]重新开始填充,周而复始。
程序中使用ADC1采样一个外部输入,一个内部参考电压的
电压,其中出现了两通道的数据错位问题,即有时数组第
一个数与该数组第二个数据交换了,在网上找了很久=都
没神马结果,最后只能将ADC的连续转换模式设置成单次转换
即ADC_Init(ADC1, ADC_ConversionMode_Continuous, ADC_Resolution_12Bit, ADC_Prescaler_1);改成
ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1);
在每次一组数据传 输完成产生一次DMA中断的时候再启动下
一次adc转换。这样数据才不至于错位。
最后,如果读者有一些在adc连续转换模式解决数据错位的办法,请指教
EALLOW;
GpioCtrlRegsGPAMUX1bitGPIO0 = 1; // GPIO0 = ePWM1A
GpioCtrlRegsGPAMUX1bitGPIO1 = 1; // GPIO0 = ePWM1B
GpioCtrlRegsGPAMUX1bitGPIO2 = 1; // GPIO0 = ePWM2A
GpioCtrlRegsGPAMUX1bitGPIO3 = 1; // GPIO0 = ePWM2B
以上就是关于STM32F4 ADC模块使用不同DMA模式的区别和对比全部的内容,包括:STM32F4 ADC模块使用不同DMA模式的区别和对比、STM32F103采用ADC+DMA传输,ADC值正确,DMA传输后12位AD的前四位丢掉了、求助,关于STM8L051F3芯片,多路ADC采集DMA传输遇到的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)