小猫爪:S32K3学习笔记05-S32K3之ADC
1 前言
??今天学习了一下S32K3的ADC模块,接下来做个总结。
2 资源简介
??下表是S32K3各型号拥有的ADC模块。 ??下表是三个ADC模块拥有的体征: ??可以看到对于ADC的通道有Precision channels,Standard channels,Special Internal channels,External channels之分,至于这些类型的通道都有什么不同,还有这个图上的信息有点问题,后面会详细说到。
??表中还有一个BCTU trigger,这个就是一个硬件触发模块,可以通过配置BCTU去触发ADC转换,之后ADC转换的结果会传递到BCTU模块,一般在电力电子,电机控制应用中比较常见,后面会专抽一章来介绍BCTU。
3 ADC功能详解
3.1 ADC mux-mode channels
??这个指的就是一个pad可能会对应多个ADC通道,可以通过DCM寄存器中每个通道对应的GPR位来设置。下图例举了几个例子: ??所以说如果配置了一些PAD复用成AI后,还得观察一下这个PAD是否为ADC通道的默认引脚,如果不是的话,还得需要配置一下DCM寄存器。
3.2 ADC内部框架
??下图是ADC模块的内部框架图。
??乍一看上去巨复杂,但是要是仔细稍微那么一看,其实这个ADC模块也就是个纸老虎,非常简单。
??说得简单点就是当ADC接收到触发信号后,就会开始启动转换,转换完成后就会生成转换结果,DMA请求信号以及中断信号,如果使能了看门狗功能,还会输出看门狗的信号。
??说得复杂细致点,步骤如下:
- 当ADC接收到三种不同类型的触发器(BCTU、注入或正常)中的一种时,优先级多路复用器启动转换。
- 根据触发器类型和自检得配置,被选择的通道输入被转换
- 状态机(FSM)从空闲状态转换为转换状态。如果下一次要转换的通道为外部通道,那么转换在DSDR[DSD]配置的延迟后开始。
- 转换开始后,转换控制块将保持内部电容网络CDAC保持相同的CTRi[INPSAMP]的时间。
- 在比较阶段,CALBISTREG[RESN]定义了用于执行逐次逼近算法的步数。校准期间确定的误差校正值将添加到原始结果中。如果平均值被启用(MCR[AVGEN]=1),最多32个(通过MCR[AVGS]指定)转换结果被平均以获得后果。
- 当转换完成且所有平均步骤均已完成时:
A. 转换完成信号置位。 B. 转换_数据[14:0]写入数据结果寄存器。 C. FSM状态机切换为完成状态。 - 通道选择块中的下一个输入被选择,FSM状态机切换到转换状态,第二次转换开始。这将持续进行,直到所有选定的通道输入都已转换。
- 如果启用了模拟看门狗,则将转换结果与配置的阈值进行比较。如果满足条件,可以触发中断。
- 自检可以检查ADC的完整性,可以与正常转换交错进行,也可以作为独立检查。
- 如果正在进行的转换被中止(通过将1写入MCR[ABORT]),或一组输入通道的转换被中止(通过将1写入MCR[ABORTCHAIN]),FSM将转换为空闲状态。如果MCR[ABORT]写1,则转换控制块停止当前转换;如果MCR[ABORTCHAIN]写1,则完成当前转换再中止转换。在这两种情况下,转换控制块的转换完成输出信号都会被置1。
3.3 时钟源
??ADC模块最高可支持的时钟频率到达80MHz,如果选择的时钟源超过80MHz的话,那么就需要设置ADC时钟分频器系数,是最后的ADC时钟在80MHz以内。下图显示在各个时钟源区间的分频设置,其中MCR[ADCLKSEL]设置分频系数,AMSIO[17]使能高速转换模式。
3.4 通道类型
??在一开始就说了由4种输入通道类型,分别是Precision channels,standard channels,special internal channels,那么这4种分别代表什么呢?
- Precision channels
精确通道,转换结果分辨率能达到12bit。 - Standard channels
标准通道,转换结果分辨率能达到10bit。 - Special internal channels
??这种就是通道的输入源在芯片内部,比如什么温度传感,REF等。在上面资源介绍中,表格上面显示有问题,其实真实情况应该是ADC0有5个,ADC1有4个,ADC2有4个。具体情况如下: 其中ANAMUX_OUT的输入源就是芯片内部的一些电压点,可以通过DCMRWF1[SUPPLY_MON_SEL]字段来配置。 - External channels
??ADC提供三个外部解码信号,用于从外部模拟多路复用器的八个通道中选择一个通道。最多可以有四个这样的多路复用器用于连接32个外部通道。ADC根据选择用于转换的当前通道,自动设置解码信号以控制这些外部模拟多路复用器。
3.5 触发信号
??从ADC工作流程来看,其实S32K3的ADC模块非常的纯粹,一旦有触发信号过来,ADC模块就开始安装原先的配置转换当前被使能的通道。所以想要实现一些复杂的转换完完全全取决于触发信号的产生。下面就来一一来看ADC模块的三大类型的触发信号,分别是标准触发,注入触发,BCTU触发。
3.5.1 标准触发
??标准触发指的就是传统意思上的ADC触发,就是由软件或者硬件来启动一次DMA转换,转换模式可以是单次转换模式和连续扫描模式,单次转换模式就是把所有使能的标准通道(由NCMR寄存器使能)转换完成后就自动停止转换,而连续扫描模式就是连续循环转换。
??其中软件触发模式就是给MCR[NSTART]写1,而硬件触发就是通过TRGMUX模块来配置其他外设信号触发标准通道转换。
??转换的顺序为Precision—>standard—>external,同类型通道则从小往大。当所有使能的标准通道转换完成后ECH中断置位。
3.5.2 注入触发
??注入触发指的就是当一次注入触发信号来了,ADC模块就会立即去转换使能的注入通道(由JCMR寄存器使能),如果当前ADC模块正在转换标准通道,那么此时ADC会中断转换并开始转换注入通道,等注入通道转换完成后再恢复标准通道的转换。流程示意图如下: ??注入触发方式也是有软件触发和硬件触发两种,软件触发就是对MCR[JTRGEN]写1,而硬件触发就是通过TRGMUX模块来配置其他外设信号触发ADC注入通道转换。
??不同类型通道的转换顺利同上,当使能的注入通道全部转换完成后,JECH中断置位。
3.5.3 BCTU触发
??BCTU触发就是用外部模块BCTU发起信号去触发ADC模块。下图是两个模块之间的连接: ??其中BCTU发送给ADC触发信号Tregger和通道号Channel,而ADC模块则返回三个信号,分别是Nextcmd,Endcov和data, 其中Nextcmd表示ADC模块已经准备好接受下一次的触发信号了,Endcov表示当前转换完成,数据可用,至于data就是转换的结果数据。
??其中BCTU有两种模式去控制ADC,分别是BCTU Trigger mode和BCTU Control mode。
- BCTU Trigger mode
这个模式其实就是增强型注入触发,处于该种模式下,当ADC模块接收到来自BCTU的触发信号时,ADC模块就会终止当前转换,立即响应BCTU的触发,原理和注入触发是一致的。也就是说三者的优先级关系为BCTU触发>注入触发>标准触发。所以当ADC处于响应BCTU的状态时,注入触发信号是无效的。 - BCTU Control mode
这种模式就比较简单了,就是BCTU一家独大,完全接手ADC的控制权,此时只有BCTU可以启动转换,另外两种触发信号无效。
??另外值得注意的点就是BCTU触发信号一定在ADC校准成功后才能发出,不然会导致ADC校准失败,BCTU触发转换完成后,EOBCTU中断置位。
3.6 校准和自检
3.6.1 校准
??在介绍BCTU触发时,讲到了校准,校准就是ADC模块会在受控条件下对已知参考电压进行采样和转换,以确定偏移、增益和电容失配的校正值(校准值)。校准期间必须禁止一切触发信号。
3.6.2 自检
??对应安全应用,定期验证操作是否正确非常重要。因为S32K3是可以达到ASIL-D的MCU,为此,ADC具有自检功能。启用自检后,ADC会自动检查其组件,并在发现错误时标记错误。这里的自检功能非常复杂,在这里就不多介绍了,感兴趣的可以自行参考RM手册的Analog-to-Digital Converter (ADC)–>Functional description->Calibration and self-test章节。
3.7 模拟门狗
??模拟看门狗就是可以设置两个值THRH和THRL,当满足以下条件的一种时会产生中断信号,非常简单。
3.8 DMA和中断
??任何通道转换完成后都可以产生一个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模块有以下几种中断信号:
3.9 转换时间的计算
??转换时间当然是由ADC时钟来确定的了,至于ADC的时钟源配置在前面已经介绍过了,接下来就直接说计算方式了。
- 预采样时间(PST,等于ST并延时1个AD_clk周期,一般预采样不使能,所以一般等于0)
- 采样时间(ST,可配置,最小值为8个AD_clk周期)
- 比较时间(CT,固定,每bit 4个AD_clk周期)
- 数据处理时间(DP,固定,2个AD_clk周期)
- 触发处理时间(TPT,固定,1个AD_clk周期)
??所以,总转换时间=([(PST+ST+CT+DP)*通道数]+TPT)*AD_clk周期。
??举个例子:
- 转换时钟频率(AD_clk)为80 MHz(T=12.5 ns)
- ADC分辨率12位+1位用于特殊电容器(CS)
- 3个通道在NCMRx寄存器中编程(通道数=3)
- 未使能预采样(PST,0个周期)
- 采样时间保持默认(ST,22个周期)
- 转换时间(CT,每位4个周期)
- 数据处理时间固定(DP,2个周期)
- 触发处理时间是固定的(TPT,1个周期)
??所以,总转换时间=[( 0 + 22 +(4*13)+2)*3 ] + 1 = 229个周期~=2.862μs。
4 使用注意事项
4.1 CDR寄存器
??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。
5 MCAL配置
待续。。。。。。
待续。。。。。
|