打印

STM32多通道ADC采样

[复制链接]
7380|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chentongxiong|  楼主 | 2011-8-4 19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用多通道采样DMA传输的时候怎么只有一个通道的数据之正确的
这是为什么呢?大虾指点一下
程序:
  #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
  /* ADCCLK = PCLK2/2 */
  RCC_ADCCLKConfig(RCC_PCLK2_Div2);
#else
  /* ADCCLK = PCLK2/4 */
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
#endif
  /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);     //复位DMA通道1
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;   //定义 DMA通道外设基地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;  //定义DMA通道存储器地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   //指定外设为源地址
  DMA_InitStructure.DMA_BufferSize = 3000;     //定义DMA缓冲区大小1
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //当前外设寄存器地址不变
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    // 当前存储器地址
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //定义外设数据宽度16位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA通道操作模式位环形缓冲模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;   //DMA通道优先级高
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止DMA通道存储器到存储器传输
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);    //初始化DMA通道1
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1
  
  /* ADC1 configuration ------------------------------------------------------*/
  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 =3;  //通道数量
  ADC_Init(ADC1, &ADC_InitStructure);
  /* ADC1 regular channel14 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);  //通道管脚及采样率
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 2, ADC_SampleTime_239Cycles5);  //通道管脚及采样率
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_239Cycles5);  //通道管脚及采样率
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
  /* Enable ADC1 reset calibration register */   
  ADC_ResetCalibration(ADC1);  ////复位校准寄存器
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));  //检测校准复位寄存器是否复位完成
  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);   //启动校准
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));   //检测校准寄存器是否完成
     
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //允许软件触发转换
  while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  /* Clear Channel 1 DMA_FLAG_TC flag */
  DMA_ClearFlag(DMA1_FLAG_TC1);

主函数采集数据处理:
    for(i = 0 ;i < 1000 ;i++)
   {
     Channel_1 += ADCConvertedValue[3 * i + 0] ;
    Channel_2 += ADCConvertedValue[3 * i + 1] ;
  Channel_3 += ADCConvertedValue[3 * i + 2] ;
   }
   
   Channel_1=Channel_1/1000;
   Channel_2=Channel_2/1000;
   Channel_3=Channel_3/1000;

只有ADC_Channel_14猜到的数据是正确的,我用的是LCD显示的
希望那位帮解决一下,本人必将感激不敬
沙发
chentongxiong|  楼主 | 2011-8-5 16:19 | 只看该作者
搞定

使用特权

评论回复
板凳
iamlight_ren| | 2011-9-6 11:02 | 只看该作者
看程序的配置没有问题啊。是不是硬件没连好啊?

使用特权

评论回复
地板
xiang_5288| | 2011-10-9 10:42 | 只看该作者
2# chentongxiong
问题出在什么地方,能说一下吗?

使用特权

评论回复
5
xiang_5288| | 2011-10-9 15:32 | 只看该作者
时钟没有开?

使用特权

评论回复
6
suse-lj| | 2011-10-10 13:05 | 只看该作者
晕死  这么低级的

使用特权

评论回复
7
zhifanshixing| | 2013-10-24 12:55 | 只看该作者
我也遇到这个问题,你后来成功了吗?能加你qq问下吗

使用特权

评论回复
8
putron09| | 2015-3-5 14:28 | 只看该作者
可以参考下

使用特权

评论回复
9
chentongxiong|  楼主 | 2015-4-26 12:25 | 只看该作者
各位是在不好意思,那是以前的问题现在才给大家回复,深感抱歉,由于之前用的是开发板,很多IO口都连接到其他设备上面,那时没怎么仔细看就直接随便用IO口,后面检查是由于IO口复用才解决这个问题,所以问题很简单,定义另外未被复用的IO口作为ADC采样PIN脚就可以了,现在才给大家回复实在是不好意思。

使用特权

评论回复
10
tototm| | 2015-5-7 08:37 | 只看该作者
参考了下,的确不错,很实用

使用特权

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

本版积分规则

5

主题

196

帖子

3

粉丝