MSPM0L系列的ADC是一个12bit的SAR ADC,采样频率最高1.45MHz,最高可做到11.2位的实际有效位(ENOB)
MSPM0L提供了外部的VREF+/-管脚,可以使用外部的参考电压源以获得最好的ADC性能,同时参考电压还可以选择VDD电压,或者内部的1.4/2.5V参考电压,需要注意的是,当选用内部参考电压的时候,ADC的采样率最大不能超过200KHz
ADC的采样模式分为两种,主要是采样时间的区别
自动采样:有两个采样时间窗口(Sample Window)定时器可以配置不同的采样时间给到采样通道选择,
手动采样:采样时间由ADC寄存器的SC位的高电平时间决定,在这个模式下ADC不支持事件触发,只能使用软件触发采样
ADC的转换模式有单次转换,序列转换,这个两个模式都支持重复模式,也就是连续采样
序列转换MSPM0L系列最大支持4个通道的配置,每一个通道都可以单独配置参考电压源和采样时间窗口,在数据手册中,可以查到每一个通道对应的映射信息
实操例程1
下面通过一个简单的ADC单通道单次采样来看下SYSCONFIG的配置,主要配置如下
可以看到,ADC时钟用的是32MHz的ULPCLK,采样通道使用的是PA15,也就是9通道采样,
使用的是自动采样模式,采样周期用的采样窗口0的配置,125us,参考电压使用的是VDDA电压,这里用的是3.3V,使用软件触发ADC,转换结果存储在结果寄存器0中(MEMRES0)
在中断设置中,设置为结果寄存器0装载中断
在程序中,我写了一个串口发送ADC数据用的函数,用来检测ADC数据
剩下的程序比较简单,需要注意的是,ADC单次转换完成后,需要重新使能ADC才可以继续下一次转换
配套例程为ADC_UART,需要复制到SDK目录下运行
实操例程2
接下来配置一个使用DMA把ADC的转换数据搬运到指定的内存地址的程序
在ADC中使用DMA,有FIFO和非FIFO模式,主要的区别是结果存放的位置不一样,在非FIFO模式中,每个ADC通道的结果会存放在配置的结果寄存器MEMRESx中,而在FIFO模式中,结果寄存器会变成FIFO的缓冲区,MSPM0L系列最大支持4个结果寄存器,也就是最大支持4个FIFO缓冲区,这个模式下,读取结果需要从特定的FIFODAT寄存器中读取,这个寄存器会把两次转换的结果拼接在一起,所以FIFO模式下的DMA一次传输4个字节
下图是ADC传输结果数据的FIFO和非FIFO模式的总结
非FIFO的DMA读写中,SAMPCNT必须为1,也就是一次结果触发一次DMA传输,以下是非FIFO的DMA配置
而在FIFO模式的DMA读写中,由于FIFODAT寄存器是把两次结果拼接,所以在DMA的触发源需要选择MEM1的载入中断,而SAMPCNT的值根据实际需要填写
例程采用连续单次采样模式,软件触发
最后配置ADC中断为DMA传输完成中断
在程序中我设置了一个10组结果的变量用于存放结果
在使用DMA传输ADC的数据的时候需要注意,每次DMA完成传输后,需要在ADC的寄存器中重新使能DMAEN位,才可以再次触发DMA传输
配套例程为ADC_DMA
全部0条评论
快来发表一下你的评论吧 !