本帖最后由 席萌0209 于 2018-6-28 15:52 编辑
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=45785
第6章 示波器设计—双通道ADC驱动
本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现。关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用,不会发现,复杂使用就很容易踩到了。 6.1 3个ADC的快速交替采样 6.2 双通道ADC采样 6.3 拓展阅读 6.4 总结
6.1 3个ADC的快速交替采样 起初二代示波器是打算像一代示波器那样,准备做成3ADC(ADC1,ADC2和ADC3)快速交替采样,后期才改成双通道。这里将3ADC的各种奇葩问题也给大家做个说明,防止大家踩坑。 3个ADC快速交替采样的两个可选的方案及其存在的问题。
6.1.1 方案一 依然采用一代示波器那种方式,3个ADC都独立配置自己的DMA通道和相应的定时器进行触发。经过详细的测试发现,在最高采样率2.8Msps * 3 = 8.4Msps的情况下,F429的总线矩阵已经处理不过来了,导致的现象就是3个ADC中有两个已经停止工作。 下面的测试都是在我们STM32-V6开发板上面进行的,主频168MHz。 1、测试方法 直接调试状态看ADC1,2,3的三个大缓冲即可,看数据缓冲的数据是否在变化。 ADC1: ADC2: ADC3: (1)测试一 条件: 开启ADC1,ADC2和ADC3及其配套的DMA,采用定时器触发,未开启emWin(要用到LTDC,DMA2D和FMC外接的SDRAM)。 现象: 这种情况下,3个ADC可以正常工作。 (2)测试二 条件: 开启ADC1,ADC2和ADC3及其配套的DMA,采用定时器触发。仅使用ADC1,开启emWin(要用到LTDC,DMA2D和FMC外接的SDRAM)。 现象: ADC1在最高采样率2.8Msps的情况下,工作几秒钟,停止工作。 (3)测试三 条件: 开启ADC1,ADC2和ADC3及其配套的DMA,采用定时器触发。仅使用ADC2,开启emWin(要用到LTDC,DMA2D和FMC外接的SDRAM)。 现象: ADC2在最高采样率2.8Msps的情况下,停止工作。 (4)测试四 条件: 开启ADC1,ADC2和ADC3及其配套的DMA,采用定时器触发。仅使用ADC3,开启emWin(要用到LTDC,DMA2D和FMC外接的SDRAM)。 现象: ADC3在最高采样率2.8Msps的情况下,正常工作。 (5)测试五 条件: 开启ADC1,ADC2和ADC3及其配套的DMA,采用定时器触发。同时使用ADC3,ADC2和ADC1,开启emWin(要用到LTDC,DMA2D和FMC外接的SDRAM)。 现象: 每个ADC都是在最高采样率2.8Msps,刚开始ADC1还工作,过会ADC1停止工作,ADC2一直没有工作,ADC3一直在工作。 2、测试现象 ADC工作不正常时,二代示波器波形显示效果如下: 3、总结 对于STM32F429来说,如果三个ADC配合自己的DMA采用最高采样率2.8Msps * 3,且采用的定时器触发,在未使用emWin(要用到LTDC,DMA2D和FMC外接的SDRAM)时,可以正常工作,使用了的话,将会出现ADC1和ADC2不工作的情况。 可能的原因是定时器触发太快,F429总线矩阵在这种情况下已经无法正常工作。
6.1.2 方案二 采用F429自带的3个ADC快递交替采样模式,这个模式的问题最多,表现在以下三个方面: (1)这种方式不能用于定时器触发,因为这三个ADC之间的采样间隔只有5个ADC时钟周期到20个ADC时钟周期可选,这样采用定时器触发的时候就没有办法做到等间隔采样。 (2)采集出来的波形效果比较差,基本没有使用价值。 (3)这种方式的3个ADC快递交替采样外加开启emWin(使能DMA2D,LTDC和FMC驱动的SDRAM),轻轻松松就将F429的总线矩阵干趴下了,直接导致ADC不工作了。 测试条件:STM32-V6开发板,采用STM32F429支持的3个ADC快速交替采样,使能DMA,采用的软件触发。 (1)测试一 配置采样率2.1Msps。 - /****************************************************************************
- PCLK2 = HCLK / 2
- 下面选择的是2分频
- ADCCLK = PCLK2 /4 = HCLK / 4 = 168 / 4 = 42M
- 三ADC采样频率: 42 / 20 = 2.1Mbps
- *****************************************************************************/
-
- /* ADC公共部分初始化---------------------------------------------------------------*/
- ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_Interl;
- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
- ADC_CommonInit(&ADC_CommonInitStructure);
复制代码凑合还能干活,但是显示效果很差: (2)测试二 配置采样率4.2Msps,直接停止工作。 - /****************************************************************************
- PCLK2 = HCLK / 2
- 下面选择的是2分频
- ADCCLK = PCLK2 /4 = HCLK / 4 = 168 / 4 = 42M
- 三ADC采样频率: 42 / 10 = 4.2Mbps
- *****************************************************************************/
-
- /* ADC公共部分初始化---------------------------------------------------------------*/
- ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_Interl;
- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
- ADC_CommonInit(&ADC_CommonInitStructure);
复制代码显示效果直接死机: 总结 相比于三个ADC独立配置实现快速交替采样,F429自带的这种3ADC快速交替采样的显示效果极其差,基本没有利用价值,而且最重要的是这种方式轻轻松松就将F429的总线矩阵干趴下了。结果就是ADC不干活了。 再来欣赏下F429的总线矩阵长什么样子:
6.1.3 选择方案一还是方案二 最终决定继续采用方案一,将最高采样率锁定在6Msps,这样才稳定些。
|