如何使用S32K1的PDB模块触发多个ADC通道连续采样

1. 外设模块介绍

1.1 PDB模块简介

  1. S32K1的PDB模块全称为Programmable delay block,即可编程的延时模块。PDB模块可以认为是一个不需要消耗CPU资源计数的计时器模块。

  2. S32K14x系列包含2个PDB模块,S32K11x系列包含一个PDB模块。如下表所示,以S32K144为例,每个PDB模块包含2个通道(Slots可以当成通道),每个通道有一个触发器和8个预触发器。
    0

  3. 和计时相关的有以下几个寄存器,

    • Modulus register (PDB_MOD),设置计数器的周期,当计数器达到MOD值,计数器会归0,如果使能PDB连续模式。计数器会重新开始计数。
    • Counter register (PDB_CNT),读此寄存器会返回计数器当前的值。
    • Interrupt Delay register (PDB_IDLY),如果使能了PDB中断并且关闭了DMA使能,当计数器的值达到IDLY+1,会产生中断标志。
    • Channel n Delay m register (PDB_CHnDLYm),m的值从0到7,代表了8个预触发器,如果使能了预触发,当计数器的值达到CHnDLYm+1,会置相应标志位为1,如果ADC触发源选择了PDB,还会启动ADC对应通道的转换。
    • 特别提醒:对MOD, IDLY, CHnDLYm写的值会预先放入内部缓存中,只有对PDB_SC寄存器的LDOK位写1才会加载这些值。
  4. PDB的触发源有三种:软件触发(对PDB_SC寄存器的SWTRIG位写1),内部触发,外部触发。

  5. PDB的模式,预分频,使能,中断,DMA等基本配置请参考PDB_SC, PDB_CHnC1, PDB_CHnS这些寄存器的描述,此处不展开描述。

1.2 ADC通道

  1. S32K1系列每个子型号的ADC通道数都不一样,使用前建议查询参考手册确定能够使用的通道数,具体型号如下图:
    1

  2. ADC模块的每个index的输入通道配置均由对应的SC1n寄存器的ADCH[5:0]bit配置,主要有以下几种通道类别选择:(为了区别SC1n寄存器对应的通道n和外部通道,前者称为index,下文也是一样)

    • 外部通道0-31(不同的MCU对应不同的外部通道数),可以通道参考手册的Excel附件查看对应的外部引脚,表格位置如下图
      2

    • 内部通道0-3,目前只有ADC0的内部通道0可用,用来监控MCU内部的供电电源情况,需要搭配SIM模块的CHIPCTL寄存器使用,相关寄存器说明如下图:
      3

    • Band Gap通道,Bandgap电压是精度较高的1V电压,用于ADC内部的自校准,同时也可以通过ADC通道读出其电压。

    • VREFSH和VREFSL通道,ADC参考电压的上限和下限。

1.3 ADC触发源

  1. ADC的触发源可以由PDB或者TRGMUX配置,此处具体描述下PDB的触发方式。

  2. ADC的触发源默认设置和推荐方案都是PDB。ADC和PDB是成对工作的:PDB0-ADC0,PDB1-ADC1,如下图所示(PDB0和PDB1使用不同的触发源)。
    4

  3. PDB的预触发通道和ADC的通道索引号对应关系如下图:
    5

1.4 PDB触发多个ADC通道的两种方式

PDB触发多个ADC通道有两种方式:

  1. 设置多个PDB预触发器的延迟时间,计数器达到1个预触发器的延迟,就启动对应的ADC index配置的输入通道,大致流程如下图所示:
    6

  2. 使用PDB的背靠背模式,PDB模块内部的两个通道可以各自形成环,也可以同一个PDB模块的两个通道形成环(如左下图),还可以PDB0的通道0和PDB1的通道0形成环。通过PDB预触发器和ADC转换完成的标志相互触发,形成触发链条(如右下图)。
    7

2. 例程

本篇例程主要介绍PDB-ADC的背靠背模式,仅使用多个预触发器延迟触发ADC的方式也会简单提一下。

2.1 例程功能介绍

功能框架如下图,在PDB0的每个计时周期内会依次采集8个ADC通道的值,然后通过串口打印出来。
ADC最后三个index选择一样的测量内容,是因为测量内部各种供电模块的电压都只能通过ADC0的内部通道0。背靠背模式下,在一个PDB周期内切换内部通道0的监控对象比较难。最终为了方便演示,最后三个index监测相同的供电模块。
8

2.2 例程编写

2.2.1 准备工作
  • 开发环境:S32DS For ARM 2.2
  • 开发板:S32K144EVB-Q100
  • 串口工具
2.2.2 图形界面配置
  1. 打开S32DS For ARM 2.2,选择adc_hwtrigger_s32k144例程创建工程,重命名为pdb_adc_backtoback_s32k144,如下图所示:
    9

  2. 打开adc组件配置,切换到转换配置界面,开启MCU内部供电监控,触发方式和原来配置保持一致,如下图:
    10

  3. 切换到ADC的通道配置界面,依次配置ADC0的前8个index,每个index的输入通道选择请参考2.1章节的功能框图。注意disable掉ADC中断,(测试程序为了测量1个PDB周期内ADC的通道转换了几次,开启了index0中断)如下图所示:
    11

  4. 打开PDB组件,切换到基础配置界面,勾选持续模式,使能中断,这里的Back-To-Back mode不需要勾选,如果勾选会将PDB0的通道0和通道1以背靠背的方式连接起来。主要配置如下图所示:
    12

  5. 切换到PDB的ADC预触发器配置界面,配置8个预触发器,勾选预触发器输出和Back-To-Back模式,如下图所示:
    13

特别提醒:
* 预触发器输出一定要勾选,因为此输出是ADC的硬件触发输入源,不勾选会导致MCU上电复位之后,ADC的8个通道只转换一次。----->后面2.3.3章节的测试程序验证该说法。
* 第一个预触发器通道不勾选Back-To-Back模式,否则第一个预触发器的延迟达到之后并不会开启第一个ADC通道的转换,从而导致所有ADC通道都不会开启转换。----->后面2.3.4章节的测试程序验证该说法。

2.2.3 测试代码

这里说一下基于原本的例程做的主要改动,完整的工程文末会给上链接。

  1. ADC模块,相关代码如下图:
    1.1 在ADC初始化过程中一定要记得调用自校验函数,否则精度会很差;
    14

    1.2 此处使用ADC0的index0中断,是为了计算一个PDB周期内每个ADCindex转换了几次
    15

  2. PDB模块,相关代码如下图:
    2.1 背靠背模式下,只有第一个预触发器的延迟设置是有效的(也可以不设置)。如果配置界面不开启背靠背模式,那么所有的PDB的预触发器的延迟都需要设置,且延迟时间依次增大。----->后面2.3.5章节的测试验证该说法。
    16

    2.2 调用加载函数之后,延迟的值才会被写入寄存器。调用软件触发器即开启PDB的计数器。
    17

    2.3 PDB中断函数里获取ADC的测量值以及ADC一个PDB周期内的测量次数。
    18

    2.4 关于PDB的MOD值计算,可以调用例程中的calculateIntValue函数计算,也可以通过如下公式计算。以此例程计算一下,需要延迟1s,所以second=1;pdb的频率为48MHz,所以frequency =48000000;分频系数和分频因数分别为128和10,最终按照公式得出MOD=37500。
    M O D = f r e q u e n c y × s e c o n d p r e s c a l e r × m u l t i p l i c a t i o n f a c t o r MOD = \frac{frequency × second}{prescaler × multiplication factor} MOD=prescaler×multiplicationfactorfrequency×second

  3. UART模块
    主循环里每1s打印一次所有的转换信息,由于开启了连续模式,也不需要再次调用软件触发命令。
    19

2.3 例程测试

2.3.1 背靠背模式
  1. 通过板载OpenSDA下载程序之后,连接上电脑,配置好串口工具,例程演示效果如下:
    20

  2. 关于上文提到的一些配置的特别说明,也可以修改例程验证下。

2.3.2 多个预触发器触发ADC
  1. PDB配置界面取消勾选Back-To-Back mode,如下图:
    21

  2. 点击下图中的代码生成按钮。
    22

  3. 设置所有的预触发器延时寄存器,代码如下图:
    23

4.编译下载,查看串口打印效果如下图:
24

2.3.3 取消预触发器输出
  1. 如下图,PDB配置界面取消预触发器输出,并生成代码。
    25

  2. 编译下载,串口打印效果如下图,ADC并没有进行转换。
    26

  3. 开启BackToBack模式,串口打印效果如下图:
    27

  4. 从上图打印的转换次数可知,ADC的所有通道只进行了一次转换。同时也可以通过旋转滑动变阻器然而EXT12通道的数值没有变化来验证。
    综上所述:

  • 背靠背模式和预触发器输出都不开启,ADC不会进行转换。
  • 只开启背靠背模式,不开启预触发器输出,ADC所有通道只转换一次。
2.3.4 预触发器通道延迟的作用
  1. 将工程恢复到2.3.1章节的状态,勾选第一个预触发器通道的Back-To-Back mode,如下图:
    28

  2. 点击代码生成按钮,编译下载,串口打印界面如下图:
    29

综上所述:

  • PDB0的通道0的预触发器0,在使能背靠背模式之后,需要ADC0的index8的转换完成标志才能触发。此例程中没有办法完成这种触发,所以导致ADC的所有index都无法开启转换。
2.3.5 预触发器通道延迟的作用
  1. 将工程恢复到2.3.1章节的状态,故意将前三个预触发器的延迟设置到最高,如下图:
    30

  2. 编译下载,串口打印结果如下图:
    31

  3. 取消PDB的Back-To-Back mode,串口打印结果如下图:
    32

综上所述:

  • 不正确设置预触发器延迟(依次加大),不开启背靠背模式,ADC通道无法开启
  • 背靠背模式下,只有修改第一个预触发器的延迟会有效果。
  • 背靠背模式下,当到达第一个预触发器的延迟值时,不论计数器是否到达MOD值重新计数,ADC的所有通道都会依次开启转换。

3. 参考资料

3.1 参考文档

  • S32K1XXRM Rev. 12.1, 02/2020
  • S32K1xx RTM3.0.0 组件说明文档

3.2 例程

文章中的例程的百度网盘链接如下:

  • 链接:https://pan.baidu.com/s/1TeGN5x3_nGOw5IYtlogJwA
  • 提取码:6322
  • 24
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Auto FAE进阶之路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值