打印

ADC1用DMA传输,数据有规律的错位

[复制链接]
3689|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
motor666|  楼主 | 2012-4-22 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 motor666 于 2012-4-22 09:01 编辑

我使用4个ADC通道做练习,ADC_Channel_8、9、14和15,转换和中断都正常,就是数据的排列顺序总是向后错位一个,即:顺序中的第二个通道被放在数据的第一位,第三个通道被放在数据的第二位,第四个通道被放在数据的第三位,而第一个通道的数据被放在了第四位。
再解释的具体点:定义变量ADCConvertedValue[4]存放四个通道的采样数据,采样顺序1、2、3、4分别对应ADC_Channel_8、9、14和15,理论上应该ADCConvertedValue[0]=ADC_Channel_8的数据,
ADCConvertedValue[1]=ADC_Channel_9的数据,
ADCConvertedValue[2]=ADC_Channel_14的数据,
ADCConvertedValue[3]=ADC_Channel_15的数据,
可是实际情况是
ADCConvertedValue[0]=ADC_Channel_9的数据,
ADCConvertedValue[1]=ADC_Channel_14的数据,
ADCConvertedValue[2]=ADC_Channel_15的数据,
ADCConvertedValue[3]=ADC_Channel_8的数据,
版主能不能给指导一下,已经好几天没有进展了,ADC和DMA的配置程序贴出来,其它程序我想不应该有问题,就不贴了。

void ADC_Configuration(void)
{
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    // 转换模式,为独立转换            
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    // 连续转换
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不用外部触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 4;          //  指定有多少个通道会被转换,1~16
  ADC_Init(ADC1, &ADC_InitStructure);
  
  
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); //PB0
  ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5); //PB1
  
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 3, ADC_SampleTime_55Cycles5); //PC4
     //                     转换通道14   采样顺序    周期
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 4, ADC_SampleTime_55Cycles5); //PC5
  //                                           第二个采样   
  
  ADC_DMACmd(ADC1, ENABLE);
  ADC_Cmd(ADC1, ENABLE);
  ADC_ResetCalibration(ADC1); //重置校验寄存器
  while(ADC_GetResetCalibrationStatus(ADC1));  //等待重置校验成功
  ADC_StartCalibration(ADC1);       //开始ADC校验      
  while(ADC_GetCalibrationStatus(ADC1)); //等待ADC校验好

  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发开始转换
}

void DMA_Configuration(void)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE); // 使能DMA时钟
  
  DMA_DeInit(DMA1_Channel1);                      // 复位值
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 指定到ADC1上
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue; // 目的地地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 方向 片内外设作源头
  DMA_InitStructure.DMA_BufferSize = 4;         // 填充4个数,
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外设地址不增加
  
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;     
  DMA_InitStructure.DMA_PeripheralDataSize =  DMA_PeripheralDataSize_HalfWord;  DMA_InitStructure.DMA_MemoryDataSize =   DMA_MemoryDataSize_HalfWord;  
  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);
  //DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);  // 使能传输完成中断
  DMA_Cmd(DMA1_Channel1, ENABLE);
  DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);   
}
沙发
airwill| | 2012-4-22 09:12 | 只看该作者
关于这个 ADC 错位问题已经有很多人反映过了, 没有好的办法, 绕行吧, 用其他的办法来 ADC 转换.

使用特权

评论回复
板凳
motor666|  楼主 | 2012-4-22 20:03 | 只看该作者
确实,我已经把论坛上所有的ADC贴子全部看过了,有几个跟我的很像,但没有解决,我指望现在有人能解决这个问题,如果不是个别现象,就应该引起重视,如果有必要,我可以把我的程序全部贴上来。

使用特权

评论回复
地板
acgean| | 2012-4-23 08:24 | 只看该作者
从大家的描述看, 这是硬件问题,你的代码没有问题。
贴出来也说明不了什么问题

使用特权

评论回复
5
motor666|  楼主 | 2012-4-23 22:06 | 只看该作者
如果真是硬件问题,就没指望了,只能STM32的设计人员才能解决。

使用特权

评论回复
6
香水城| | 2012-4-24 09:55 | 只看该作者
LZ试过ST给的例子吗? 例子有什么问题吗?

使用特权

评论回复
7
zhaoyu2005| | 2012-4-24 10:07 | 只看该作者
应该是DMA的启动时间造成的

使用特权

评论回复
8
zhaoyu2005| | 2012-4-24 10:08 | 只看该作者
在配置完ADC后并且使能ADC以后再使能DMA

使用特权

评论回复
9
zhaoyu2005| | 2012-4-24 10:09 | 只看该作者
我用了3个通道,没问题

使用特权

评论回复
10
motor666|  楼主 | 2012-4-24 10:38 | 只看该作者
我用的是微芯力科的开发板,随板子带的例子只有CH14一个通道,所以没法用ST的例子。

使用特权

评论回复
11
andyxyrong| | 2012-4-24 11:47 | 只看该作者
我用USART也出现DMA传输错位的情况,建议你在传输之前重新初始化设置DMA,反正我试了可以

使用特权

评论回复
12
yzzly| | 2012-4-24 13:53 | 只看该作者
与MCU器件无关,都是程序执行中断造成的。

使用特权

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

本版积分规则

174

主题

422

帖子

1

粉丝