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

[复制链接]
 楼主| shuai37zhang 发表于 2013-7-1 13:44 | 显示全部楼层 |阅读模式
  1. F3里面有4路ADC,现在使用ADC1的通道7和ADC2的通道8,采集两路信号,发现同时工作时候采集的数据不对。疑问:
  2. 1、各路ADC能够同时工作?
  3. 2、如果只用ADC1和ADC2同时工作,并且每路ADC只用一个通道,为何会出现两路ADC的结果都不对?
  4. 3、如果采用快速交替模式采集,ADC1的结果正确,ADC2结果存在偏差,这个原因是什么?
  5. 4、能否提供类似功能的代码参考?
  1.   /* ADC Dual mode configuration */     
  2.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;                                                                    
  3.   ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;   
  4.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;            
  5.   ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;                  
  6.   ADC_CommonInitStructure.ADC_TwoSamplingDelay =0;         
  7.   
  8.   ADC_CommonInit(ADC1, &ADC_CommonInitStructure);

  9.   /* */  
  10.   ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
  11.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  12.   ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
  13.   ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
  14.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  15.   ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
  16.   ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;  
  17.   ADC_InitStructure.ADC_NbrOfRegChannel = 1;
  18.   ADC_Init(ADC1, &ADC_InitStructure);
  19.   ADC_Init(ADC2, &ADC_InitStructure);
  20.   
  21.   /* ADC1 regular channel7 configuration */
  22.   ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1Cycles5);
  23.   /* ADC2 regular channel8 configuration */
  24.   ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);

  25.   /* Configures the ADC DMA */
  26.   ADC_DMAConfig(ADC1,ADC_DMAMode_Circular);//ADC_DMAMode_Circular
  27.         ADC_DMAConfig(ADC2, ADC_DMAMode_Circular);
  28.   /* Enable the ADC DMA */
  29.   ADC_DMACmd(ADC1, ENABLE);
  30.         ADC_DMACmd(ADC2, ENABLE);
  31.    
  32.   /* Enable ADC1 and ADC2 */
  33.   ADC_Cmd(ADC1, ENABLE);
  34.   ADC_Cmd(ADC2, ENABLE);
  35.   
  36.   /* wait for ADC1 ADRDY */
  37.   while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));

  38.   /* wait for ADC2 ADRDY */
  39.   while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));
  40.   
  41.   /* Enable the DMA channel */
  42.   DMA_Cmd(DMA1_Channel1, ENABLE);

  43.   /* Start ADC1 Software Conversion */
  44.   ADC_StartConversion(ADC1);
  1. void ADC_DMA_Configuration(void)
  2. {
  3.   /* Enable DMA1/DMA2 clock */
  4.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  5. //        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  6.   /* DMA configuration */
  7.   /* DMA1 Channel1 Init Test */
  8.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_CDR_ADDRESS;
  9.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCDualConvertedValue;
  10.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  11.   DMA_InitStructure.DMA_BufferSize = 1;
  12.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  13.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  14.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  15.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  16.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  17.   DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  18.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  19.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  20. }


 楼主| 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);
笨笨de幸福_ 发表于 2013-7-1 21:38 | 显示全部楼层
我有ADC 3个通道同时采集数据的调试代码
给我联系方式 可以给你
 楼主| shuai37zhang 发表于 2013-7-2 08:40 | 显示全部楼层
笨笨de幸福_ 发表于 2013-7-1 21:38
我有ADC 3个通道同时采集数据的调试代码
给我联系方式 可以给你

谢谢哈,953606650@qq.com
 楼主| 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只有一个通道工作
笨笨de幸福_ 发表于 2013-7-2 13:43 | 显示全部楼层
好吧 我看错了  我用的是一个ADC的不同通道
笨笨de幸福_ 发表于 2013-7-2 13:46 | 显示全部楼层
shuai37zhang 发表于 2013-7-2 08:41
这个应该还是1吧,每路ADC只有一个通道工作

那个1应该是采样的顺序吧
trumpxp 发表于 2013-7-2 19:30 | 显示全部楼层
不是很了解      楼主   帮你顶一个    呼唤版主   看看版主能不能解决这个问题  
trumpxp 发表于 2013-7-2 19:31 | 显示全部楼层
应该有高手能够解决这个问题
596142041 发表于 2013-7-2 19:49 | 显示全部楼层
ADC_DMACmd(ADC2, ENABLE);不对吧!
ADC_DMACmd  ( ADC_TypeDef *  ADCx,   FunctionalState  NewState  ) ADCx只能是ADC1或者ADC3,
 楼主| shuai37zhang 发表于 2013-7-4 16:47 | 显示全部楼层
596142041 发表于 2013-7-2 19:49
ADC_DMACmd(ADC2, ENABLE);不对吧!
ADC_DMACmd  ( ADC_TypeDef *  ADCx,   FunctionalState  NewState  )  ...

嗯,要完整看完参考手册。只是英文的看得头大……但是还是得看
谢谢
 楼主| shuai37zhang 发表于 2013-7-4 16:49 | 显示全部楼层
问题已经解决,发现当采样时间太短时候会出现转换结果不对。最后不读最低0位数据(只读高11:1),结果比较稳定。
zeluo 发表于 2013-7-4 18:53 | 显示全部楼层
问题解决了就好    楼主   顶一个   有时间   需要好好看看    顶一个   
hxb20122012 发表于 2013-7-4 21:49 | 显示全部楼层
参考官方例程,ADC要先配置好,后面才启动DMA传输。
hxb20122012 发表于 2013-7-4 21:50 | 显示全部楼层
默认初始化函数要记得调用。
595818431 发表于 2013-10-8 23:45 | 显示全部楼层
请问朋友你解决了吗?我现在正为ADC交替采样发愁···往点拨一二
lovedfrien 发表于 2015-7-1 17:48 | 显示全部楼层
shuai37zhang 发表于 2013-7-2 08:40
谢谢哈,953606650@qq.com

37188578,兄弟发一份给我吧,最近也在搞这个
mm7989680 发表于 2016-8-10 22:34 | 显示全部楼层
留着后面参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

389

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部