请问:STM32中双ADC快速交替模式如何使用?

ubrownie   2010-1-14 21:04 楼主
最近在学习使用STM32的ADC,单ADC已经调试成功了,LCD可以显示实际波形。
看到有双ADC快速交替模式,可以提高一倍的速度,就改为该模式,用二个ADC采样同一个输入。
但是无论如何都调试不出来,只有ADC1的值,没有ADC2的值。
看了论坛几乎所有的帖子,都找不到答案。
数据手册看了n遍,关于该模式的描述很少,参考例程也没有。

ADC程序如下:
void  ADC_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;

        //DMA1 channel1 configuration
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32)ADC1_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32)&ADCConvertedValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 1;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
        //Enable DMA1 channel1
        DMA_Cmd(DMA1_Channel1, ENABLE);

        //ADC1 configuration
        ADC_InitStructure.ADC_Mode = ADC_Mode_FastInterl;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 1;
        ADC_Init(ADC1, &ADC_InitStructure);

        //ADC1 regular channel14 configuration
        ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_1Cycles5);

        //Enable ADC1 DMA
        ADC_DMACmd(ADC1, ENABLE);

        // Enable ADC1 external trigger conversion
//        ADC_ExternalTrigConvCmd(ADC1, ENABLE);

        //ADC2 configuration
        ADC_InitStructure.ADC_Mode = ADC_Mode_FastInterl;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 1;
        ADC_Init(ADC2, &ADC_InitStructure);

        //ADC2 regular channel14 configuration
        ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 1, ADC_SampleTime_1Cycles5);

        //Enable ADC2 DMA
//        ADC_DMACmd(ADC2, ENABLE);

        // Enable ADC2 external trigger conversion
        ADC_ExternalTrigConvCmd(ADC2, ENABLE);

        //Enable ADC1
        ADC_Cmd(ADC1, ENABLE);

        //Enable ADC1 reset calibaration register
        ADC_ResetCalibration(ADC1);
        //Check the end of ADC1 reset calibration register
        while(ADC_GetResetCalibrationStatus(ADC1));

        //Start ADC1 calibaration
        ADC_StartCalibration(ADC1);
        //Check the end of ADC1 calibration
        while(ADC_GetCalibrationStatus(ADC1));

        //Enable ADC2
        ADC_Cmd(ADC2, ENABLE);

        //Enable ADC2 reset calibaration register
        ADC_ResetCalibration(ADC2);
        //Check the end of ADC2 reset calibration register
        while(ADC_GetResetCalibrationStatus(ADC2));

        //Start ADC2 calibaration
        ADC_StartCalibration(ADC2);
        //Check the end of ADC2 calibration
        while(ADC_GetCalibrationStatus(ADC2));
     
        //Start ADC1 Software Conversion
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

回复评论 (13)

请香版主看看!ST的资料还是太少了。
试了很多办法,ADC2就是没有输出。
点赞  2010-1-15 10:59
                                 STM32固件库中有一个双ADC同步的例子,你稍微改一下就可以。
点赞  2010-1-15 11:12
谢谢!试过很多遍了,还是不行。
例程是ADC_Mode_RegSimult,我改为ADC_Mode_FastInterl,
其它选项一个一个修改,也没有发现ADC2起作用。
把通道改为相同的一个输入,
采用DMA传输,ADC1的DMA也使能了,ADC1/2的触发也设置了,就是没有作用。
点赞  2010-1-15 11:20
// Enable ADC2 external trigger conversion
        ADC_ExternalTrigConvCmd(ADC2, ENABLE);

这里在做什么?
点赞  2010-1-15 11:51
本来没有这条语句的,后来看有些帖子说要使能ADC2的触发源,
我没有招了,就加了这条语句试试。
去掉也应该不能读出ADC2。回去再试试。
谢谢!
点赞  2010-1-15 12:35
我用过楼主想要的模式,但没有发现楼主代码有明显的问题
贴个代码给楼主参考看看吧
STM32_ADC_RTC_2Msps.zip (346.87 KB)
点赞  2010-1-15 15:38
谢谢barboon和版主。
上述代码确实没有问题,ADC2的外部触发必须使能,否则只能采集一个数据。
昨晚仔细研究自己的代码,原来只有一个ADC1,是正常的。
现在加了ADC2,没有把ADC2的时钟使能,导致ADC2不工作。
STM32真是太复杂了,功能模块的时钟没有加上,导致模块不能工作,
这已经是好几次了,每次浪费1-2天时间,不过也好,碰到问题反而有动力仔细研究数据手册了。
估计这次把计划的2M采样率的示波器程序完成,STM32就算入门了。
现在已经使用了STM32内部的DMA、ADC、UART、I2C、SPI等模块了。
再次谢谢热心的barboon和版主!
等我把程序完成,一定发给各位网友看看。
点赞  2010-1-16 11:31
谢谢barboon和版主。
上述代码确实没有问题,ADC2的外部触发必须使能,否则只能采集一个数据。
昨晚仔细研究自己的代码,原来只有一个ADC1,是正常的。
现在加了ADC2,没有把ADC2的时钟使能,导致ADC2不工作。
STM32真是太复杂了,功能模块的时钟没有加上,导致模块不能工作,
这已经是好几次了,每次浪费1-2天时间,不过也好,碰到问题反而有动力仔细研究数据手册了。
估计这次把计划的2M采样率的示波器程序完成,STM32就算入门了。
现在已经使用了STM32内部的DMA、ADC、UART、I2C、SPI等模块了。
再次谢谢热心的barboon和版主!
等我把程序完成,一定发给各位网友看看。
点赞  2010-1-16 11:31
                                 兩個ADC對同一個頻道採樣應該是沒有意義吧?
点赞  2010-1-17 13:08
加快采样速度,从1M到2M。
目前发现ADC1和ADC2的转换结果有差别,很难解决。

请问版主:
为什么ADC1/ADC2在快速和慢速交替模式下,转换结果差别这么大?
采用稳压电源输入时,结果误差比较小。
采用LM358跟随,误差很大,估计有10%左右。
输入正弦波,采样数据一个大一个小的变化,局部不是正弦波的变化。
刚开始以为数据大小端搞错了,后来发现是通道间的误差,加了LM358跟随也没有作用。
点赞  2010-1-18 08:43
                                 ADC2调用不了DMA
点赞  2010-3-5 10:53
                                 ADC_DMACmd(ADC2, ENABLE);
点赞  2010-3-5 10:55
求楼主说一下最新情况啊,都一年啦
点赞  2011-12-29 11:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复