文章目录

  • 1. 外设模块介绍
    • 1.1 PDB模块简介
    • 1.2 ADC通道
    • 1.3 ADC触发源
    • 1.4 PDB触发多个ADC通道的两种方式
  • 2. 例程
    • 2.1 例程功能介绍
    • 2.2 例程编写
      • 2.2.1 准备工作
      • 2.2.2 图形界面配置
      • 2.2.3 测试代码
    • 2.3 例程测试
      • 2.3.1 背靠背模式
      • 2.3.2 多个预触发器触发ADC
      • 2.3.3 取消预触发器输出
      • 2.3.4 预触发器通道延迟的作用
      • 2.3.5 预触发器通道延迟的作用
  • 3. 参考资料
    • 3.1 参考文档
    • 3.2 例程

1. 外设模块介绍

1.1 PDB模块简介

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

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

  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通道数都不一样,使用前建议查询参考手册确定能够使用的通道数,具体型号如下图:

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

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

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

    • 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使用不同的触发源)。

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

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

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

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

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

2. 例程

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

2.1 例程功能介绍

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

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,如下图所示:

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

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

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

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

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

2.2.3 测试代码

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

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

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

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

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

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

    2.4 关于PDB的MOD值计算,可以调用例程中的calculateIntValue函数计算,也可以通过如下公式计算。以此例程计算一下,需要延迟1s,所以second=1;pdb的频率为48MHz,所以frequency =48000000;分频系数和分频因数分别为128和10,最终按照公式得出MOD=37500。
    MOD=frequency×secondprescaler×multiplicationfactorMOD = \frac{frequency × second}{prescaler × multiplication factor} MOD=prescaler×multiplicationfactorfrequency×second​

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

2.3 例程测试

2.3.1 背靠背模式

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

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

2.3.2 多个预触发器触发ADC

  1. PDB配置界面取消勾选Back-To-Back mode,如下图:

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

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

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

2.3.3 取消预触发器输出

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

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

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

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

  • 背靠背模式和预触发器输出都不开启,ADC不会进行转换。
  • 只开启背靠背模式,不开启预触发器输出,ADC所有通道只转换一次。

2.3.4 预触发器通道延迟的作用

  1. 将工程恢复到2.3.1章节的状态,勾选第一个预触发器通道的Back-To-Back mode,如下图:

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

综上所述:

  • PDB0的通道0的预触发器0,在使能背靠背模式之后,需要ADC0的index8的转换完成标志才能触发。此例程中没有办法完成这种触发,所以导致ADC的所有index都无法开启转换。

2.3.5 预触发器通道延迟的作用

  1. 将工程恢复到2.3.1章节的状态,故意将前三个预触发器的延迟设置到最高,如下图:

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

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

综上所述:

  • 不正确设置预触发器延迟(依次加大),不开启背靠背模式,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

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

  1. 【python基础】断点调试pdb模块简易使用

    文章目录 前言 代码内使用 命令行使用 前言 断点调试是程序基础,pdb是Python自带的调试器,可以帮助我们在代码中设置断点,并且提供了一些命令来帮助我们在程序执行时进行调试. 代码内使用 以下是 ...

  2. STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置

    本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作. #include    "adc.h" [cpp] view plaincopy #defi ...

  3. python pdb查看变量值_使用Python中PDB模块中的命令来调试Python代码的教程

    你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便 ...

  4. python pdb模块_使用Python中PDB模块中的命令来调试Python代码的教

    你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,Python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便 ...

  5. python pdb查看变量值_使用pdb模块调试Python

    在Python中,我们需要debug时,有三种方式: 加log语句.最简单的方式是添加print()语句来输出我们想要获知的状态或者变量,好处是简单容易操作,坏处是debug完了之后,还需要将prin ...

  6. 光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门

    前面给大家介绍了传感器的开关输出的使用,今天给大家介绍一下常见传感器的模拟输出的用法,用到了STM32的ADC(模数转换)模块和USART串口通信模块.代码就是正点原子的ADC实验的代码.今天只聊传感 ...

  7. USB转I2C适配器 模块 USB-IIC/GPIO/PWM/ADC 支持Android 安卓

    名称:纬图Ginkgo USB-I2C适配器 品牌:ViewTool/纬图 型号:VTG200A 典型应用: - I2C总线设备,芯片控制.调试 - I2C接口传感器测试 - I2C存储器EEPROM ...

  8. EFM32片内外设--ADC之多通道采样+Timer+PRS触发+DMA

    在Application note中,ADC已经有了很多的例子,唯独缺少一个多通道定时触发进行扫描的例程.从理论上讲,将ADC配置为多通道ADC转换,配合DMA进行数据传输,而且使用Timer+PRS ...

  9. DSP之TMS320F28335学习总结与笔记(二)————ADC模块

    F28335 ADC模块 ADC转换模块 A/D转换器(ADC)将模拟量转换为数字量通常要经过四个步骤:采样.保持.量化和编码. 采样:将一个时间上连续变化的模拟量转化为时间上离散变化的模拟量. 保持 ...

最新文章

  1. node.js入门 - 9.api:http
  2. Object.create()和new Object()
  3. python中进程池的应用
  4. 电子产品的磨砂膜和镜面膜的选择
  5. php设置session 生命周期,设置session的生命周期(php)
  6. SpringBoot 简单实现仿CAS单点登录系统
  7. Log4j 与 Logback的ConversionPattern对比
  8. 解决ubuntu 20.04 打不开设置的问题
  9. 全面了解浏览器(内核)发展史
  10. 百亿节点,毫秒级延迟,携程金融基于nebula的大规模图应用实践
  11. android水印的添加,Android添加水印的正确方法 只要三步!
  12. [COGS 2264]魔法传输
  13. PCB板材及叠层结构(转)
  14. 如何学习编程、一门编程语言怎么算入门、快速掌握一门编程语言
  15. xcode4.3 构建ipa包发布到iphone
  16. 推荐一个开源低代码开发平台 Corteza
  17. Zain Iraq通过MATRIXX Software推出突破性数字品牌oodi
  18. 手把手让你实现开源企业级web高并发解决方案
  19. 5月10日云栖精选夜读:阿里专家直击前端盛会JSConf2017_Day2:见证Moment.js精彩分享
  20. 小明的调查作业java_小明的调查作业

热门文章

  1. 火绒安全推出首款Mac产品 提速布局Mac终端安全领域
  2. 穷人最讨人嫌的地方其实不是穷,而是太在意面子
  3. 一个程序员,写在告别程序员生涯时说的话
  4. 物联网开放平台使用总结
  5. 解决Failed to open .ini file C:\Users\xxx\.android\emu-update-last-check.ini for writing.
  6. 信必优荣获BOSS直聘“王者之舟·最爱人才雇主奖”
  7. .NetCore支付宝支付-服务商模式(saas)
  8. hbase表按rowkey和时间清理数据
  9. 让AURIX Development Studio变得更好用
  10. 解决Spring Spring Data JPA 错误: Page 1 of 1 containing UNKNOWN instances