打印

STM32F3两路ADC+DMA同时工作不正常

[复制链接]
9762|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuai37zhang|  楼主 | 2013-7-1 13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
F3里面有4路ADC,现在使用ADC1的通道7和ADC2的通道8,采集两路信号,发现同时工作时候采集的数据不对。疑问:
1、各路ADC能够同时工作?
2、如果只用ADC1和ADC2同时工作,并且每路ADC只用一个通道,为何会出现两路ADC的结果都不对?
3、如果采用快速交替模式采集,ADC1的结果正确,ADC2结果存在偏差,这个原因是什么?
4、能否提供类似功能的代码参考?
  /* ADC Dual mode configuration */     
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;                                                                    
  ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;   
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;            
  ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;                  
  ADC_CommonInitStructure.ADC_TwoSamplingDelay =0;         
  
  ADC_CommonInit(ADC1, &ADC_CommonInitStructure);

  /* */  
  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;  
  ADC_InitStructure.ADC_NbrOfRegChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
  ADC_Init(ADC2, &ADC_InitStructure);
  
  /* ADC1 regular channel7 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1Cycles5);
  /* ADC2 regular channel8 configuration */
  ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);

  /* Configures the ADC DMA */
  ADC_DMAConfig(ADC1,ADC_DMAMode_Circular);//ADC_DMAMode_Circular
        ADC_DMAConfig(ADC2, ADC_DMAMode_Circular);
  /* Enable the ADC DMA */
  ADC_DMACmd(ADC1, ENABLE);
        ADC_DMACmd(ADC2, ENABLE);
   
  /* Enable ADC1 and ADC2 */
  ADC_Cmd(ADC1, ENABLE);
  ADC_Cmd(ADC2, ENABLE);
  
  /* wait for ADC1 ADRDY */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));

  /* wait for ADC2 ADRDY */
  while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));
  
  /* Enable the DMA channel */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* Start ADC1 Software Conversion */
  ADC_StartConversion(ADC1);
void ADC_DMA_Configuration(void)
{
  /* Enable DMA1/DMA2 clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  /* DMA configuration */
  /* DMA1 Channel1 Init Test */
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_CDR_ADDRESS;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCDualConvertedValue;
  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_Enable;
  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_Medium;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
}


沙发
shuai37zhang|  楼主 | 2013-7-1 13:47 | 只看该作者
如上是双ADC模式配置和DMA的配置,反复参考了F1的代码,不知道问题出在哪里,希望热心的亲们提供帮助,谢谢

使用特权

评论回复
板凳
笨笨de幸福_| | 2013-7-1 21:35 | 只看该作者
ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);
第二个参数改为2  

使用特权

评论回复
地板
笨笨de幸福_| | 2013-7-1 21:37 | 只看该作者
错了第三个
ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 2, ADC_SampleTime_1Cycles5);

使用特权

评论回复
5
笨笨de幸福_| | 2013-7-1 21:38 | 只看该作者
我有ADC 3个通道同时采集数据的调试代码
给我联系方式 可以给你

使用特权

评论回复
6
shuai37zhang|  楼主 | 2013-7-2 08:40 | 只看该作者
笨笨de幸福_ 发表于 2013-7-1 21:38
我有ADC 3个通道同时采集数据的调试代码
给我联系方式 可以给你

谢谢哈,953606650@qq.com

使用特权

评论回复
7
shuai37zhang|  楼主 | 2013-7-2 08:41 | 只看该作者
笨笨de幸福_ 发表于 2013-7-1 21:35
ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);
第二个参数改为2

这个应该还是1吧,每路ADC只有一个通道工作

使用特权

评论回复
8
笨笨de幸福_| | 2013-7-2 13:43 | 只看该作者
好吧 我看错了  我用的是一个ADC的不同通道

使用特权

评论回复
9
笨笨de幸福_| | 2013-7-2 13:46 | 只看该作者
shuai37zhang 发表于 2013-7-2 08:41
这个应该还是1吧,每路ADC只有一个通道工作

那个1应该是采样的顺序吧

使用特权

评论回复
10
trumpxp| | 2013-7-2 19:30 | 只看该作者
不是很了解      楼主   帮你顶一个    呼唤版主   看看版主能不能解决这个问题  

使用特权

评论回复
11
trumpxp| | 2013-7-2 19:31 | 只看该作者
应该有高手能够解决这个问题

使用特权

评论回复
12
596142041| | 2013-7-2 19:49 | 只看该作者
ADC_DMACmd(ADC2, ENABLE);不对吧!
ADC_DMACmd  ( ADC_TypeDef *  ADCx,   FunctionalState  NewState  ) ADCx只能是ADC1或者ADC3,

使用特权

评论回复
13
shuai37zhang|  楼主 | 2013-7-4 16:47 | 只看该作者
596142041 发表于 2013-7-2 19:49
ADC_DMACmd(ADC2, ENABLE);不对吧!
ADC_DMACmd  ( ADC_TypeDef *  ADCx,   FunctionalState  NewState  )  ...

嗯,要完整看完参考手册。只是英文的看得头大……但是还是得看
谢谢

使用特权

评论回复
14
shuai37zhang|  楼主 | 2013-7-4 16:49 | 只看该作者
问题已经解决,发现当采样时间太短时候会出现转换结果不对。最后不读最低0位数据(只读高11:1),结果比较稳定。

使用特权

评论回复
15
zeluo| | 2013-7-4 18:53 | 只看该作者
问题解决了就好    楼主   顶一个   有时间   需要好好看看    顶一个   

使用特权

评论回复
16
hxb20122012| | 2013-7-4 21:49 | 只看该作者
参考官方例程,ADC要先配置好,后面才启动DMA传输。

使用特权

评论回复
17
hxb20122012| | 2013-7-4 21:50 | 只看该作者
默认初始化函数要记得调用。

使用特权

评论回复
18
595818431| | 2013-10-8 23:45 | 只看该作者
请问朋友你解决了吗?我现在正为ADC交替采样发愁···往点拨一二

使用特权

评论回复
19
lovedfrien| | 2015-7-1 17:48 | 只看该作者
shuai37zhang 发表于 2013-7-2 08:40
谢谢哈,953606650@qq.com

37188578,兄弟发一份给我吧,最近也在搞这个

使用特权

评论回复
20
mm7989680| | 2016-8-10 22:34 | 只看该作者
留着后面参考

使用特权

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

本版积分规则

6

主题

389

帖子

1

粉丝