ADC多通道转换的时候数据错位的解决方法

发布时间 2023-08-28 15:03:36作者: WCH_CH32

ADC多通道转换的时候数据错位的解决方法

一)问题描述:

在测试ADC 采集两路及以上ADC的信号时,几路轮流采样,打印数据的时候发现数据错位。改用循环采集和DMA传输,采集完一次再次开启DMA时对应的数据也会发生错位。

(二)配置和使用

实际工程均是参考EVT例程编写,将例程里面里面采集一路ADC改为采集两路。

相关配置

ADC配置

​​​​

ADC的DMA配置

相关程序流程:

  1. ADC单次采样无DMA:

轮流调用采样函数,并打印输出。

  1. ADC+DMA采样

开启ADC转换,并且开启DMA传输。

启动ADC的DMA传输。

DMA传输完成后触发中断,进入该中断函数,并打印数据。

(三)出现问题

经过上述两种过程,ADC采集的两个通道的数据通过串口输出在串口助手种。

里面的数据分布应该每次都是:CH0,CH1,CH0,CH1,CH0.CH1 ..... 这样交替分布的。

但是实际情况却并不是这样,两者数据会随机错位。

(四)解决方法

对于无DMA的程序,将ADC初始化函数中的“ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;”改为“ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;”即可。

对于循环采集+DMA形式的程序,在DMA接收完成中断中增加“ADC_CMD(ADCx, DISABLE)”。即可。

(五)问题分析

笔者的配置是:ADC循环转换,DMA单次传输(传输指定的数据量,触发中断会就不再启动DMA传输了)。

对于两种情况因为ADC时循环转换的,采样结束后虽然都没有再次触发ADC,但是实际上ADC仍然在转换,当处理完数据后再次启动采样的时候这个时候的ADC数据具体对于哪一个通道其实是随机的,但是程序还是会把缓存中的数据取出来,这样数据就错位了。

对于单次采样无DMA的程序只要把ADC循环转换功能关闭即可;对于DMA+ADC采样形式需要再增加一句ADC_Cmd(ADCx, DISABLE);关闭ADC,这样在下次启动ADC的时候数据就是对齐通道的了。