|
这篇文章将来测评AT32A403A的ADC、DMA。
首先,在hardware文件夹中新建ADC.c等C文件及其对应的h头文件。
第二步,通过WorkBench配置AT32A403A的硬件ADC,选择ADC1,这里我选择测三个电压:PA5外部电压、内部温度传感器、内部参照电压。采用的模式是序列模式,就是依次采样电压通道。具体参数看下图
这里需要注意几个点:
1、如果你想循环采样设置的电压通道,可以将反复模式开启。因为其一次触发后可以反复循环采样,不需要反复触发再采样,这样方便一些。ADC的触发方式有好多种,这里我就选择软件触发,简单一些。
2、然后你要采样几通道,就选择几个普通组通道数目,然后设置这几个电压通道的转换顺序和采样时间。
3、通常来说基本会把单片机的主频设定在最高频,也就是200MHz,这是这样就会出现一个问题,根据下面的时钟配置,ADC的时钟如果2分频,那么频率将会超过50M,这不符合最高28M的规定,但如果4分频,那么频率只有25M,达不到最高采样时钟,这就比较难受,或者可以将主频设置成112M,这样可以实现28M,但这就属于得不偿失了。所以它的采样率常用配置的话最高也就1、78MSPS。
第三步,配置ADC的DMA,这里我们通过DMA来将转换后的数据从外设转移到某一数组中,也就是外设到内存。至于为什么要用DMA来传输数据而不是用一个函数来读取呢,一是我发现所有的例程都是DMA来传输的,很奇怪,二来是我查看了给的库函数,发现没有读取序列模式下ADC的数据的库函数,其中第一个库函数不支持多个通道的情况。(注:也可能是我没注意到)
DMA的配置比较简单,数据宽度因为是12位,所以是半字,因为包含3个通道的数据,所以存放这3个数据的数组的内存地址是要递增的,外设地址则不需要。
这里也需要注意几个点:
WB生成的初始化代码是将①DMA的初始化;②DMA的外设和内存基址、数据个数设置;③DMA通道使能(main函数里)分开了,这里建议合在一起,免得搞乱,就像下图这样。
最后配置好所有所需函数,先初始化DMA,再初始化ADC。通过printf函数来打印PA5的ADC值、内部温度传感器的温度(电压)和内部基准电压。其中内部温度传感器的温度与电压的关系由数据手册提供,近似成线性关系。
这是串口打印结果,其中内部基准电压约为1.2V,符合1.16-1.24V的电压范围。内部温度约为40摄氏度,当然了,这温度肯定不是很准确,仅供参考嘛。