今天学习了一下S32K3的ADC模块,接下来做个总结。
下表是S32K3各型号拥有的ADC模块。
下表是三个ADC模块拥有的体征:
可以看到对于ADC的通道有Precision channels,Standard channels,Special Internal channels,External channels之分,至于这些类型的通道都有什么不同,还有这个图上的信息有点问题,后面会详细说到。
表中还有一个BCTU trigger,这个就是一个硬件触发模块,可以通过配置BCTU去触发ADC转换,之后ADC转换的结果会传递到BCTU模块,一般在电力电子,电机控制应用中比较常见,后面会专抽一章来介绍BCTU。
这个指的就是一个pad可能会对应多个ADC通道,可以通过DCM寄存器中每个通道对应的GPR位来设置。下图例举了几个例子:
所以说如果配置了一些PAD复用成AI后,还得观察一下这个PAD是否为ADC通道的默认引脚,如果不是的话,还得需要配置一下DCM寄存器。
乍一看上去巨复杂,但是要是仔细稍微那么一看,其实这个ADC模块也就是个纸老虎,非常简单。
说得简单点就是当ADC接收到触发信号后,就会开始启动转换,转换完成后就会生成转换结果,DMA请求信号以及中断信号,如果使能了看门狗功能,还会输出看门狗的信号。
说得复杂细致点,步骤如下:
ADC模块最高可支持的时钟频率到达80MHz,如果选择的时钟源超过80MHz的话,那么就需要设置ADC时钟分频器系数,是最后的ADC时钟在80MHz以内。下图显示在各个时钟源区间的分频设置,其中MCR[ADCLKSEL]设置分频系数,AMSIO[17]使能高速转换模式。
在一开始就说了由4种输入通道类型,分别是Precision channels,standard channels,special internal channels,那么这4种分别代表什么呢?
从ADC工作流程来看,其实S32K3的ADC模块非常的纯粹,一旦有触发信号过来,ADC模块就开始安装原先的配置转换当前被使能的通道。所以想要实现一些复杂的转换完完全全取决于触发信号的产生。下面就来一一来看ADC模块的三大类型的触发信号,分别是标准触发,注入触发,BCTU触发。
标准触发指的就是传统意思上的ADC触发,就是由软件或者硬件来启动一次DMA转换,转换模式可以是单次转换模式和连续扫描模式,单次转换模式就是把所有使能的标准通道(由NCMR寄存器使能)转换完成后就自动停止转换,而连续扫描模式就是连续循环转换。
其中软件触发模式就是给MCR[NSTART]写1,而硬件触发就是通过TRGMUX模块来配置其他外设信号触发标准通道转换。
转换的顺序为Precision—>standard—>external,同类型通道则从小往大。当所有使能的标准通道转换完成后ECH中断置位。
注入触发指的就是当一次注入触发信号来了,ADC模块就会立即去转换使能的注入通道(由JCMR寄存器使能),如果当前ADC模块正在转换标准通道,那么此时ADC会中断转换并开始转换注入通道,等注入通道转换完成后再恢复标准通道的转换。流程示意图如下:
注入触发方式也是有软件触发和硬件触发两种,软件触发就是对MCR[JTRGEN]写1,而硬件触发就是通过TRGMUX模块来配置其他外设信号触发ADC注入通道转换。
不同类型通道的转换顺利同上,当使能的注入通道全部转换完成后,JECH中断置位。
BCTU触发就是用外部模块BCTU发起信号去触发ADC模块。下图是两个模块之间的连接:
其中BCTU发送给ADC触发信号Tregger和通道号Channel,而ADC模块则返回三个信号,分别是Nextcmd,Endcov和data, 其中Nextcmd表示ADC模块已经准备好接受下一次的触发信号了,Endcov表示当前转换完成,数据可用,至于data就是转换的结果数据。
其中BCTU有两种模式去控制ADC,分别是BCTU Trigger mode和BCTU Control mode。
另外值得注意的点就是BCTU触发信号一定在ADC校准成功后才能发出,不然会导致ADC校准失败,BCTU触发转换完成后,EOBCTU中断置位。
在介绍BCTU触发时,讲到了校准,校准就是ADC模块会在受控条件下对已知参考电压进行采样和转换,以确定偏移、增益和电容失配的校正值(校准值)。校准期间必须禁止一切触发信号。
对应安全应用,定期验证操作是否正确非常重要。因为S32K3是可以达到ASIL-D的MCU,为此,ADC具有自检功能。启用自检后,ADC会自动检查其组件,并在发现错误时标记错误。这里的自检功能非常复杂,在这里就不多介绍了,感兴趣的可以自行参考RM手册的Analog-to-Digital Converter (ADC)–>Functional description->Calibration and self-test章节。
模拟看门狗就是可以设置两个值THRH和THRL,当满足以下条件的一种时会产生中断信号,非常简单。
任何通道转换完成后都可以产生一个DMA请求信号,一旦启用,片上DMA控制器可以在每个通道转换后获取DMA请求并搬运结果。 可以在DMA Request Enable For Precision Inputs (DMAR0),DMA Request Enable For Standard Inputs (DMAR1), DMA Request Enable For Precision Inputs (DMAR0)寄存器中设置相应的屏蔽字段来激活和屏蔽相应通道的DMA。DMA屏蔽寄存器必须在开始任何转换之前进行编程。
转换时间当然是由ADC时钟来确定的了,至于ADC的时钟源配置在前面已经介绍过了,接下来就直接说计算方式了。
所以,总转换时间=([(PST+ST+CT+DP)*通道数]+TPT)*AD_clk周期。
举个例子:
所以,总转换时间=[( 0 + 22 +(4*13)+2)*3 ] + 1 = 229个周期~=2.862μs。
CDR寄存器是用来存储ADC转换结果的寄存器,每一个通道都对应一个CDR,其中低16位用来存储转换结果,但是只有其中15位有效,可以配置为是左对齐(即**CDR[15:1]有效)还是右对齐(即CDR[14:0]**有效)。
另外不管你配置的ADC分别是多少位,最后CDR中存储的转换结果数据都是15bit,这个时候就需要通过软件移位来得到有效数据了,当然了这些SDK驱动都会帮做了。
说到这里我们不得不提一下ADC的分辨率问题,虽然在ADC介绍中,提到ADC模块支持8/10/12/14bit分辨率,举个例子,如果说配置ADC模块为14bit分辨率,其实并不是说最后转换结果的精度为14bit,这里的意思指的是ADC模块在转换的时候会将最后结果比较到第14bit,至于结果是达不到14bit精度的,ADC的precision channel最高支持的精度为12bit,Standard channel最高支持的精度为10bit。
待续。。。。。。