硬件环境:AC7801x 通用开发板 ATC-LINK
软件环境:keil 5.23
ADC是我觉得做得非常好,但同时也有点复杂得模块,很多人会不太好理解ADC模块的工作模式区别。这里会逐一介绍一下。
一、ADC的通道配置
ADC总共有8种工作模式,但细究来讲,无非就是规则组,注入组的运行方式排列组合二来。那什么是规则组,什么是注入组呢?
这里你可以以优先级的方式来理解他,规则组就是普通的采样通道,而注入组就是优先级更高的采样通道。换句话说,当规则组通道和注入组通道同时需要采样转换时,因为注入组优先级更高,所以会优先转换注入组。
到这里,可能还有些人会问,那我们芯片哪些通道是规则组,哪些是注入组。这里对芯片ADC的通道配置要好好的介绍一下:
首先,我们的AC7801x总共有14路通道,其中12路外部通道,即连接到GPIO引脚的通道,还有2路芯片内部的通道(Bandgap和Tsensor)。
其次,我们规则组最多可以配置12个通道,注入组最多可以配置4个通道,这里以参考手册中的Mode3来进行介绍,可以理解为规则组最多可以配置12个通道采样序列,此处配置的规则组长度为7,采样顺序是ch9-ch8-ch12-ch1-ch5-ch4-ch7。也就是说,触发一次规则组采样,便会按这个顺序去采样这七个通道,这里ch9指的就是采样外部引脚ADC_IN9。这里我们还可以看到注入组设置的长度是3,采样通道是ch12-ch7-ch13。我们可以看到,当注入组触发采样时,可以打断规则组的采样顺序,优先采样注入组通道,完毕后再采样剩余的规则组通道。而且我们可以看到每一个通道在规则组和注入组中并非只可以设置一次。
二、ADC工作模式
上面理解了ADC的通道配置后,再来讲讲工作模式,工作模式通过MODE_BITS配置。工作模式 | MODE_BITS | 触发源 | 转换序列 | mode1 | 5’b0000x | 规则触发 | 规则组单通道单次转换 | mode2 | 5’b0100x | 规则触发 | 规则组单通道连续转换 | mode3
(注入组扫描模式) | 5’b10000
(INTERVAL=0) | 规则/注入触发 | 规则组扫描+注入组扫描模式
多通道单次转换 |
mode3
(注入组间隔模式) | 5’b10000
(INTERVAL=1) | 规则/注入触发 | 规则组扫描+注入组间隔模式
多通道单次转换 | mode4 | 5’b10001 | 规则触发+自动注入触发 | 规则组扫描+注入组扫描模式
多通道单次转换 | mode5
(注入组扫描模式) | 5’b11000
(INTERVAL=0) | 规则/注入触发 | 规则组扫描+注入组扫描模式
多通道连续转换 | mode5
(注入组间隔模式) | 5’b11000
(INTERVAL=1) | 规则/注入触发 | 规则组扫描+注入组间隔模式
多通道连续转换 | mode6 | 5’b11001 | 规则触发+自动注入触发 | 规则组扫描+注入组扫描模式
多通道连续转换 | mode7 | 5’b1x10x | 规则触发 | 规则组子组扫描模式转换 | mode8 | 5’b1x01x | 注入触发 | 注入组子组扫描模式转换 |
mode1和mode2只转换规则组中设定的第一个通道,mode1是触发一次则转换一次,mode2则是触发一次,便会一直转换
mode3应该是用的最多的了,mode3下触发一次,则按顺序扫描采样所有设置的规则组通道,注入组若设置扫描模式则和规则组一样,若设置间隔模式,则是每次触发只采样一个通道。下一次触发则采样下一个通道。
mode4是把注入组也当成了规则组,跟在规则组通道后面,触发一次规则组后,会先采样完规则组,再采样注入组。
mode5则是mode3的升级版,即规则组触发一次后会按mode3的方式循环工作。
mode6则是mode4的升级版,即按找mode4的工作方式循环工作。
mode7和mode8相对比较复杂,这里是在规则组和注入组之中,又划分出子组的概念,即前面的模式,触发一次,要么采样所有规则组,要么采样所有注入组,但mode7和mode8不是,触发一次,只会采样其中的一个子组。
三、ADC采样触发方式和数据获取
ADC的采样触发方式分为软件触发以及硬件触发,如果选择了软件触发,则软件上通过写寄存器来触发采样工作。如果选择了硬件触发,则依据你配置的硬件触发源来触发工作。
对于电机方案来说,肯定是使用了PWM延时触发采样。那除了这个,我们还可以设置定时器触发,ACMP比较触发等。
而ADC采样的数据,对于注入组来说,每个注入组通道都有对应的寄存器存储转换值。而规则组只有一个寄存器存储转换值,所以在规则组使用多个通道连续转换时,必须要使用DMA模块将转换结果及时移出。
四、例程说明
这里我们只使用一个注入组通道采样ADC_IN8通道,该通道为开发板上旋钮的AD值。我们通过软件触发的方式获取采样值,并通过串口打印出来。
通过调节旋钮,可以看到采样的AD值会发生变化:
这里用到了格式化打印函数snprintf,瞬间代码量就上去了。
Program Size: Code=4264 RO-data=300 RW-data=16 ZI-data=1792
adc.rar
(562.9 KB)
|