打印
[STM32F1]

STM32 相邻AD通道电压变化影响采样结果

[复制链接]
2989|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangyong123846|  楼主 | 2014-8-14 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、问题描述
      1、配置AIN0~AIN6共7个通道为模拟输入通道,定时器TIM2定时20us周期性触发AD转换(规则转换顺序是AIN0~AIN6顺序转换),AIN0,AIN1,
       AIN2,AIN3连接电位器, 这电位器的电压经过一阶滤波后连接到各个模拟输入引脚。现象是:假定AIN1的信号没有变化(电位器没有位置没有变
       化),AIN0的电压信号的变化范围为0V~3.3V,会影响到AIN1的转换结果误差为30mV左右。但是其他通道电压变化不会影响AIN1的转换结果。

  /* DMA1 Channel1 Configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Convert_Result;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 7;                             /* ADC has  seven AIN-Channel--------*/
  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);
       
   /* Enable DMA1_Channel1 Interrupt after transfering 7 AD_convert_data---*/
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);
       
        /*Clears the DMAy Channel1's interrupt pending bits*/
        DMA_ClearITPendingBit(DMA1_IT_TC1);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);
       

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 7;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* Configures ADC1 regular channel_0 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);
       
        /* Configures ADC1 regular channel_1 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_13Cycles5);
       
        /* Configures ADC1 regular channel_2 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_13Cycles5);
       
        /* Configures ADC1 regular channel_3 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_13Cycles5);
       
        /* Configures ADC1 regular channel_4 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_13Cycles5);
       
        /* Configures ADC1 regular channel_5 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_13Cycles5);
       
        /* Configures ADC1 regular channel_6 as: first converted channel with a 1.5 cycles sample time */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_13Cycles5);
       
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 external trigger */
  ADC_ExternalTrigConvCmd(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));
沙发
Eric2013| | 2014-8-14 17:59 | 只看该作者
1. 先检查下外部硬件的干扰,这个一定要检测下,如果这个没有问题的话第二步。
2. 感觉这个可能性比较小,最一个数据采集完就进入DMA中断,进入后DMA仍然在工作,不过离下次的采集还有20us(也就是开始下一轮采集了),
   所以数据要及时读取。20us时间还是很长的。

使用特权

评论回复
板凳
mmuuss586| | 2014-8-14 19:18 | 只看该作者
RC滤波的频率可选采样频率的1.2倍左右;
换下采样顺序看下,是不是还是紧跟着AIN0的那个通道有问题;

使用特权

评论回复
地板
wangyong123846|  楼主 | 2014-8-15 08:45 | 只看该作者
Eric2013 发表于 2014-8-14 17:59
1. 先检查下外部硬件的干扰,这个一定要检测下,如果这个没有问题的话第二步。
2. 感觉这个可能性比较小, ...

没有干扰,电源也很干净,就是采样电位器的电压信号,不存在什么高速信号

使用特权

评论回复
5
pofu007| | 2014-8-15 08:46 | 只看该作者
转换7个通道,周期20us,是不是太频繁了点,你还得留点时间处理转换后的数据!

使用特权

评论回复
6
wangyong123846|  楼主 | 2014-8-15 08:48 | 只看该作者
1 、设置延长AD采样时间无任何改善
2、将定时器定时触发时间延长40us 则转换误差结果会变小8mV.
            (1)在此触发时间下,改变AD采样时间对转换结果毫无影响。

使用特权

评论回复
7
mmuuss586| | 2014-8-15 08:54 | 只看该作者
wangyong123846 发表于 2014-8-15 08:48
1 、设置延长AD采样时间无任何改善
2、将定时器定时触发时间延长40us 则转换误差结果会变小8mV.
         ...

RC滤波,电容改小点看看;

使用特权

评论回复
8
wangyong123846|  楼主 | 2014-8-15 09:17 | 只看该作者
pofu007 发表于 2014-8-15 08:46
转换7个通道,周期20us,是不是太频繁了点,你还得留点时间处理转换后的数据! ...

是有点频繁,采样时间少。数据处理的时间应该够了。但是独立AD各个通道为什么会互相影响,这让我很无力啊

使用特权

评论回复
9
risun007| | 2015-7-6 09:27 | 只看该作者
我也碰到了

使用特权

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

本版积分规则

5

主题

25

帖子

1

粉丝