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的时候数据就是对齐通道的了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值