小猫爪: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请求信号以及中断信号,如果使能了看门狗功能,还会输出看门狗的信号。

  说得复杂细致点,步骤如下:

  1. 当ADC接收到三种不同类型的触发器(BCTU、注入或正常)中的一种时,优先级多路复用器启动转换。
  2. 根据触发器类型和自检得配置,被选择的通道输入被转换
  3. 状态机(FSM)从空闲状态转换为转换状态。如果下一次要转换的通道为外部通道,那么转换在DSDR[DSD]配置的延迟后开始。
  4. 转换开始后,转换控制块将保持内部电容网络CDAC保持相同的CTRi[INPSAMP]的时间。
  5. 在比较阶段,CALBISTREG[RESN]定义了用于执行逐次逼近算法的步数。校准期间确定的误差校正值将添加到原始结果中。如果平均值被启用(MCR[AVGEN]=1),最多32个(通过MCR[AVGS]指定)转换结果被平均以获得后果。
  6. 当转换完成且所有平均步骤均已完成时:
    A. 转换完成信号置位。
    B. 转换_数据[14:0]写入数据结果寄存器。
    C. FSM状态机切换为完成状态。
  7. 通道选择块中的下一个输入被选择,FSM状态机切换到转换状态,第二次转换开始。这将持续进行,直到所有选定的通道输入都已转换。
  8. 如果启用了模拟看门狗,则将转换结果与配置的阈值进行比较。如果满足条件,可以触发中断。
  9. 自检可以检查ADC的完整性,可以与正常转换交错进行,也可以作为独立检查。
  10. 如果正在进行的转换被中止(通过将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种分别代表什么呢?

  1. Precision channels
    精确通道,转换结果分辨率能达到12bit。
  2. Standard channels
    标准通道,转换结果分辨率能达到10bit。
  3. Special internal channels
      这种就是通道的输入源在芯片内部,比如什么温度传感,REF等。在上面资源介绍中,表格上面显示有问题,其实真实情况应该是ADC0有5个,ADC1有4个,ADC2有4个。具体情况如下:
    在这里插入图片描述
    在这里插入图片描述
    其中ANAMUX_OUT的输入源就是芯片内部的一些电压点,可以通过DCMRWF1[SUPPLY_MON_SEL]字段来配置。
  4. 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模块则返回三个信号,分别是NextcmdEndcovdata, 其中Nextcmd表示ADC模块已经准备好接受下一次的触发信号了,Endcov表示当前转换完成,数据可用,至于data就是转换的结果数据。

  其中BCTU有两种模式去控制ADC,分别是BCTU Trigger mode和BCTU Control mode。

  1. BCTU Trigger mode
    这个模式其实就是增强型注入触发,处于该种模式下,当ADC模块接收到来自BCTU的触发信号时,ADC模块就会终止当前转换,立即响应BCTU的触发,原理和注入触发是一致的。也就是说三者的优先级关系为BCTU触发>注入触发>标准触发。所以当ADC处于响应BCTU的状态时,注入触发信号是无效的。
  2. 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 模拟门狗

  模拟看门狗就是可以设置两个值THRHTHRL,当满足以下条件的一种时会产生中断信号,非常简单。
在这里插入图片描述

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的时钟源配置在前面已经介绍过了,接下来就直接说计算方式了。

  1. 预采样时间(PST,等于ST并延时1个AD_clk周期,一般预采样不使能,所以一般等于0)
  2. 采样时间(ST,可配置,最小值为8个AD_clk周期)
  3. 比较时间(CT,固定,每bit 4个AD_clk周期)
  4. 数据处理时间(DP,固定,2个AD_clk周期)
  5. 触发处理时间(TPT,固定,1个AD_clk周期)

  所以,总转换时间=([(PST+ST+CT+DP)*通道数]+TPT)*AD_clk周期。

  举个例子:

  1. 转换时钟频率(AD_clk)为80 MHz(T=12.5 ns)
  2. ADC分辨率12位+1位用于特殊电容器(CS)
  3. 3个通道在NCMRx寄存器中编程(通道数=3)
  4. 未使能预采样(PST,0个周期)
  5. 采样时间保持默认(ST,22个周期)
  6. 转换时间(CT,每位4个周期)
  7. 数据处理时间固定(DP,2个周期)
  8. 触发处理时间是固定的(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配置

待续。。。。。。

待续。。。。。

  • 22
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值