打印

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

[复制链接]
15372|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gx_huang|  楼主 | 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);
}
沙发
gx_huang|  楼主 | 2010-1-15 10:59 | 只看该作者
请香版主看看!ST的资料还是太少了。
试了很多办法,ADC2就是没有输出。

使用特权

评论回复
板凳
香水城| | 2010-1-15 11:12 | 只看该作者
STM32固件库中有一个双ADC同步的例子,你稍微改一下就可以。

使用特权

评论回复
地板
gx_huang|  楼主 | 2010-1-15 11:20 | 只看该作者
谢谢!试过很多遍了,还是不行。
例程是ADC_Mode_RegSimult,我改为ADC_Mode_FastInterl,
其它选项一个一个修改,也没有发现ADC2起作用。
把通道改为相同的一个输入,
采用DMA传输,ADC1的DMA也使能了,ADC1/2的触发也设置了,就是没有作用。

使用特权

评论回复
5
香水城| | 2010-1-15 11:51 | 只看该作者
// Enable ADC2 external trigger conversion
        ADC_ExternalTrigConvCmd(ADC2, ENABLE);

这里在做什么?

使用特权

评论回复
6
gx_huang|  楼主 | 2010-1-15 12:35 | 只看该作者
本来没有这条语句的,后来看有些帖子说要使能ADC2的触发源,
我没有招了,就加了这条语句试试。
去掉也应该不能读出ADC2。回去再试试。
谢谢!

使用特权

评论回复
7
barboon| | 2010-1-15 15:38 | 只看该作者
我用过楼主想要的模式,但没有发现楼主代码有明显的问题
贴个代码给楼主参考看看吧
STM32_ADC_RTC_2Msps.zip (346.87 KB)

使用特权

评论回复
8
gx_huang|  楼主 | 2010-1-16 11:31 | 只看该作者
谢谢barboon和香主。
上述代码确实没有问题,ADC2的外部触发必须使能,否则只能采集一个数据。
昨晚仔细研究自己的代码,原来只有一个ADC1,是正常的。
现在加了ADC2,没有把ADC2的时钟使能,导致ADC2不工作。
STM32真是太复杂了,功能模块的时钟没有加上,导致模块不能工作,
这已经是好几次了,每次浪费1-2天时间,不过也好,碰到问题反而有动力仔细研究数据手册了。
估计这次把计划的2M采样率的示波器程序完成,STM32就算入门了。
现在已经使用了STM32内部的DMA、ADC、UART、I2C、SPI等模块了。
再次谢谢热心的barboon和香主!
等我把程序完成,一定发给各位网友看看。

使用特权

评论回复
9
gx_huang|  楼主 | 2010-1-16 11:31 | 只看该作者
谢谢barboon和香主。
上述代码确实没有问题,ADC2的外部触发必须使能,否则只能采集一个数据。
昨晚仔细研究自己的代码,原来只有一个ADC1,是正常的。
现在加了ADC2,没有把ADC2的时钟使能,导致ADC2不工作。
STM32真是太复杂了,功能模块的时钟没有加上,导致模块不能工作,
这已经是好几次了,每次浪费1-2天时间,不过也好,碰到问题反而有动力仔细研究数据手册了。
估计这次把计划的2M采样率的示波器程序完成,STM32就算入门了。
现在已经使用了STM32内部的DMA、ADC、UART、I2C、SPI等模块了。
再次谢谢热心的barboon和香主!
等我把程序完成,一定发给各位网友看看。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
李晓倩 + 1 www.jinjidejuren.tv/shixiong/
10
supercoolman| | 2010-1-17 13:08 | 只看该作者
兩個ADC對同一個頻道採樣應該是沒有意義吧?

使用特权

评论回复
11
gx_huang|  楼主 | 2010-1-18 08:43 | 只看该作者
加快采样速度,从1M到2M。
目前发现ADC1和ADC2的转换结果有差别,很难解决。

请问香主:
为什么ADC1/ADC2在快速和慢速交替模式下,转换结果差别这么大?
采用稳压电源输入时,结果误差比较小。
采用LM358跟随,误差很大,估计有10%左右。
输入正弦波,采样数据一个大一个小的变化,局部不是正弦波的变化。
刚开始以为数据大小端搞错了,后来发现是通道间的误差,加了LM358跟随也没有作用。

使用特权

评论回复
12
azraelgokiki| | 2010-3-5 10:53 | 只看该作者
ADC2调用不了DMA

使用特权

评论回复
13
azraelgokiki| | 2010-3-5 10:55 | 只看该作者
ADC_DMACmd(ADC2, ENABLE);

使用特权

评论回复
14
aaaxmaaa007| | 2013-2-28 17:00 | 只看该作者
gx_huang 发表于 2010-1-16 11:31
谢谢barboon和香主。
上述代码确实没有问题,ADC2的外部触发必须使能,否则只能采集一个数据。
昨晚仔细研 ...

请问楼主最后怎么解决的,谢谢

使用特权

评论回复
15
gx_huang|  楼主 | 2013-2-28 19:05 | 只看该作者
都好多年了,都忘了这事情。
不过最终完成的示波器程序应该可以使用的,当时使用过,可以测试显示波形的。
见附件,KEIL的整个工程,你自己研究了。 OST_11264.rar (820.11 KB)

使用特权

评论回复
16
aaaxmaaa007| | 2013-3-4 10:48 | 只看该作者
gx_huang 发表于 2013-2-28 19:05
都好多年了,都忘了这事情。
不过最终完成的示波器程序应该可以使用的,当时使用过,可以测试显示波形的。
...

谢谢了,我好好研究下

使用特权

评论回复
17
fxw451| | 2013-5-17 19:23 | 只看该作者
相当好,过来学习下。

使用特权

评论回复
18
wmz_ybx| | 2013-7-5 07:54 | 只看该作者
谢谢楼主,正困扰中!

使用特权

评论回复
19
kfhzy| | 2013-11-9 08:34 | 只看该作者
谢了

使用特权

评论回复
20
kaoyanfor2010| | 2014-4-1 11:48 | 只看该作者
很好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

9037

帖子

79

粉丝