AD采样是一种比较常见的功能,可以用于电池电压检测、传感器值读取、信号采集等。STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。不过在未学习DMA数据转运前,使用AD多通连续转换扫描模式进行数据采集会造成诸如以下问题:
1.在扫描模式下,启动列表且每一个单独的通道转换完成之后,不会产生任何的标志位,也不会触发中断,只有在整个列表都转换完成之后,才会产生一次EOC标志位,才能触发中断。但此时,前面通道的数据已经被覆盖丢失了。
2.AD转换是非常快的(转换一个通道通常只需要几微秒),即如果不能在此时间内成功转运数据,同样也会造成数据丢失的问题,所以在扫描模式下手动转运数据的要求比较高且比较困难。若使用间断模式,在扫描的时候,每转换一个通道就暂停一次,在手动转运数据之后,再继续触发,进行下一次通道转换。此方法仅可通过Delay延时足够长的时间,才可以保证转换完成,但效率较低。
那么是不是在没有学习DMA数据转运的情况下就不能进行AD多通道数据采集呢?
答案是能实现,而且非常简单!
我们可以使用AD单次转换、非扫描的模式来实现多通道。即只需要在每次触发转换之前,手动更改一下列表第一个位置的通道就可以了。
比如:第一次转换,先写入通道0,之后触发、等待、读值,第二次转换再把通道0改为通道1,之后触发、等待、读值。以此类推,这样在转换前,先指定通道,再进行转换,便可以轻松的实现AD多通道转换的功能了。
程序代码如下所示:
在OLED上显示AD多通道采样数据: