打印

stm32f407 ADC多通道DMA方式误差大

[复制链接]
2174|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DHZFSYJ|  楼主 | 2020-7-6 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32F407分别采集3个通道,通道1采集3v电压,通道2为内部温度,通道3为Vrefint。三个通道都做了20次平均,但是误差还是很大,是什么原因呢,请大神指点一二。

使用特权

评论回复
评论
zuoanhuafeng 2020-7-9 10:33 回复TA
你的采样频率多大,多长时间触发一次?我现在也用F407,ADC1采集8路,ADC2采集8路,定时器100KHz去触发采样,DMA传输,没有这么大误差。我只测试了一个通道,采集3.3v的供电,理论是4095,实际也只有个位数摆动。 

相关帖子

沙发
DHZFSYJ|  楼主 | 2020-7-6 17:01 | 只看该作者
[img][/img]

354635f02e78e71dec.png (19.08 KB )

354635f02e78e71dec.png

使用特权

评论回复
板凳
DHZFSYJ|  楼主 | 2020-7-7 09:05 | 只看该作者
ADC1_CH5:采集的是3v电压(通过万用表测量的)
ADC1_TEM:通过内置温度采集芯片温度,应该率高于环境温度
ADC1_BAT:采集内置Vrefint,典型值为1.21V
每个通道都进行了50次平均,实际测试结果如下图,误差很大是什么原因呢?
[img]

[/img]

使用特权

评论回复
地板
DHZFSYJ|  楼主 | 2020-7-7 15:08 | 只看该作者
使用ADC轮询的方式,不使用连续采集,精度较高
[img]

[/img]

使用特权

评论回复
5
m564522634| | 2020-7-7 16:39 | 只看该作者
DMA 只不过是一个传输的问题,还影响不到你的精度

使用特权

评论回复
6
DHZFSYJ|  楼主 | 2020-7-8 09:57 | 只看该作者
本帖最后由 DHZFSYJ 于 2020-7-8 09:59 编辑

使用单通道ADC DMA采集3v电压,50次平均之后约为2.7v,没有找到测量不准确的原因。配置界面如下图:
[img]


[/img]
/*
  * [url=home.php?mod=space&uid=247401]@brief[/url]  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue, 50);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
               
                if( adc_dma_ok ==1 )
                {
                        adc_dma_ok = 0;        
                        ADC_Value = 0;
                        for(i = 0; i < 50; i++)
                        {
                                ADC_Value += ADC_ConvertedValue;
                        }
                        ADC_Value = ADC_Value / 50;
                        ADC_Volt = ADC_Value * 3.3f / 4096;
                        //printf("ADC Value %d\r\n",ADC_Value);
                        printf("vol %f\r\n", ADC_Volt);
                        printf("------------------------\r\n");
                        HAL_Delay(5000);
                        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue, 50);
                }
        }
  /* USER CODE END 3 */
}


中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
  HAL_ADC_Stop(&hadc1);
        adc_dma_ok = 1;
        i++;
}


使用特权

评论回复
7
DHZFSYJ|  楼主 | 2020-7-8 10:04 | 只看该作者
测试结果如下:只有第一次的测量结果3679,非常接近3.0v,其余的采样结果均为2.7v左右,所以平均后的结果为2.7v左右。找了两天没有找到原因,希望有经验的前辈点拨下思路
[img]

[/img]

使用特权

评论回复
8
zyj9490| | 2020-7-8 11:55 | 只看该作者
取样时间拉长,通道间的串扰吧。

使用特权

评论回复
9
steelen| | 2020-7-8 17:51 | 只看该作者
开关电容式的ADC,注意输入阻抗

使用特权

评论回复
10
shcnxjy| | 2020-7-8 17:58 | 只看该作者
从7楼数据看,有递减趋势,符合输入阻抗不匹配导致ADC采样建立时间不足带来影响的规律

使用特权

评论回复
11
shcnxjy| | 2020-7-8 17:59 | 只看该作者
可以参考一下这个文档

如何在STM32微控制器中获得最佳ADC精度 CD00211314_ZHV3.pdf

825.11 KB, 阅读权限: 10

使用特权

评论回复
12
XZL| | 2020-7-9 11:58 | 只看该作者
ADC的输入阻抗比较小,通过模拟开关切换时,输入电压会被拉低,导致采样结果偏低。

使用特权

评论回复
13
DHZFSYJ|  楼主 | 2020-7-9 16:41 | 只看该作者
shcnxjy 发表于 2020-7-8 17:58
从7楼数据看,有递减趋势,符合输入阻抗不匹配导致ADC采样建立时间不足带来影响的规律 ...

谢谢前辈~

使用特权

评论回复
14
DHZFSYJ|  楼主 | 2020-7-9 16:41 | 只看该作者
XZL 发表于 2020-7-9 11:58
ADC的输入阻抗比较小,通过模拟开关切换时,输入电压会被拉低,导致采样结果偏低。 ...

谢谢前辈~

使用特权

评论回复
15
DHZFSYJ|  楼主 | 2020-7-9 16:44 | 只看该作者
谢谢前辈们,这方面的问题之前都没有关注到。

使用特权

评论回复
16
suifengkm| | 2020-10-12 09:21 | 只看该作者
遇到同样问题。。单次转换采集上万次以上统计。。ADC值抖动不超过2.。。。。。一旦开启DMA基本上抖动在0-20之间。。。。

使用特权

评论回复
17
sjh00213| | 2020-10-12 16:20 | 只看该作者
F407的片子以前也遇到过DMA读取AD不准,后来改用ADC查询读取。103系列的没有这个问题

使用特权

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

本版积分规则

18

主题

55

帖子

1

粉丝