ADC多通道转换的时候数据错位的解决方法
ADC多通道转换的时候数据错位的解决方法
一)问题描述:
在测试ADC 采集两路及以上ADC的信号时,几路轮流采样,打印数据的时候发现数据错位。改用循环采集和DMA传输,采集完一次再次开启DMA时对应的数据也会发生错位。
(二)配置和使用
实际工程均是参考EVT例程编写,将例程里面里面采集一路ADC改为采集两路。
相关配置
ADC配置
ADC的DMA配置
相关程序流程:
- ADC单次采样无DMA:
轮流调用采样函数,并打印输出。
- 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的时候数据就是对齐通道的了。