1. 外设模块介绍
1.1 PDB模块简介
-
S32K1的PDB模块全称为Programmable delay block,即可编程的延时模块。PDB模块可以认为是一个不需要消耗CPU资源计数的计时器模块。 -
S32K14x系列包含2个PDB模块,S32K11x系列包含一个PDB模块。如下表所示,以S32K144为例,每个PDB模块包含2个通道(Slots可以当成通道),每个通道有一个触发器和8个预触发器。 -
和计时相关的有以下几个寄存器,
- 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才会加载这些值。
-
PDB的触发源有三种:软件触发(对PDB_SC寄存器的SWTRIG位写1),内部触发,外部触发。 -
PDB的模式,预分频,使能,中断,DMA等基本配置请参考PDB_SC, PDB_CHnC1, PDB_CHnS这些寄存器的描述,此处不展开描述。
1.2 ADC通道
-
S32K1系列每个子型号的ADC通道数都不一样,使用前建议查询参考手册确定能够使用的通道数,具体型号如下图: -
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触发源
-
ADC的触发源可以由PDB或者TRGMUX配置,此处具体描述下PDB的触发方式。 -
ADC的触发源默认设置和推荐方案都是PDB。ADC和PDB是成对工作的:PDB0-ADC0,PDB1-ADC1,如下图所示(PDB0和PDB1使用不同的触发源)。 -
PDB的预触发通道和ADC的通道索引号对应关系如下图:
1.4 PDB触发多个ADC通道的两种方式
PDB触发多个ADC通道有两种方式:
-
设置多个PDB预触发器的延迟时间,计数器达到1个预触发器的延迟,就启动对应的ADC index配置的输入通道,大致流程如下图所示: -
使用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 图形界面配置
-
打开S32DS For ARM 2.2,选择adc_hwtrigger_s32k144例程创建工程,重命名为pdb_adc_backtoback_s32k144,如下图所示: -
打开adc组件配置,切换到转换配置界面,开启MCU内部供电监控,触发方式和原来配置保持一致,如下图: -
切换到ADC的通道配置界面,依次配置ADC0的前8个index,每个index的输入通道选择请参考2.1章节的功能框图。注意disable掉ADC中断,(测试程序为了测量1个PDB周期内ADC的通道转换了几次,开启了index0中断)如下图所示: -
打开PDB组件,切换到基础配置界面,勾选持续模式,使能中断,这里的Back-To-Back mode不需要勾选,如果勾选会将PDB0的通道0和通道1以背靠背的方式连接起来。主要配置如下图所示: -
切换到PDB的ADC预触发器配置界面,配置8个预触发器,勾选预触发器输出和Back-To-Back模式,如下图所示:
特别提醒: * 预触发器输出一定要勾选,因为此输出是ADC的硬件触发输入源,不勾选会导致MCU上电复位之后,ADC的8个通道只转换一次。----->后面2.3.3章节的测试程序验证该说法。 * 第一个预触发器通道不勾选Back-To-Back模式,否则第一个预触发器的延迟达到之后并不会开启第一个ADC通道的转换,从而导致所有ADC通道都不会开启转换。----->后面2.3.4章节的测试程序验证该说法。
2.2.3 测试代码
这里说一下基于原本的例程做的主要改动,完整的工程文末会给上链接。
-
ADC模块,相关代码如下图: 1.1 在ADC初始化过程中一定要记得调用自校验函数,否则精度会很差; 1.2 此处使用ADC0的index0中断,是为了计算一个PDB周期内每个ADCindex转换了几次 -
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。
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? -
UART模块 主循环里每1s打印一次所有的转换信息,由于开启了连续模式,也不需要再次调用软件触发命令。
2.3 例程测试
2.3.1 背靠背模式
-
通过板载OpenSDA下载程序之后,连接上电脑,配置好串口工具,例程演示效果如下: -
关于上文提到的一些配置的特别说明,也可以修改例程验证下。
2.3.2 多个预触发器触发ADC
-
PDB配置界面取消勾选Back-To-Back mode,如下图: -
点击下图中的代码生成按钮。 -
设置所有的预触发器延时寄存器,代码如下图:
4.编译下载,查看串口打印效果如下图:
2.3.3 取消预触发器输出
-
如下图,PDB配置界面取消预触发器输出,并生成代码。 -
编译下载,串口打印效果如下图,ADC并没有进行转换。 -
开启BackToBack模式,串口打印效果如下图: -
从上图打印的转换次数可知,ADC的所有通道只进行了一次转换。同时也可以通过旋转滑动变阻器然而EXT12通道的数值没有变化来验证。 综上所述:
- 背靠背模式和预触发器输出都不开启,ADC不会进行转换。
- 只开启背靠背模式,不开启预触发器输出,ADC所有通道只转换一次。
2.3.4 预触发器通道延迟的作用
-
将工程恢复到2.3.1章节的状态,勾选第一个预触发器通道的Back-To-Back mode,如下图: -
点击代码生成按钮,编译下载,串口打印界面如下图:
综上所述:
- PDB0的通道0的预触发器0,在使能背靠背模式之后,需要ADC0的index8的转换完成标志才能触发。此例程中没有办法完成这种触发,所以导致ADC的所有index都无法开启转换。
2.3.5 预触发器通道延迟的作用
-
将工程恢复到2.3.1章节的状态,故意将前三个预触发器的延迟设置到最高,如下图: -
编译下载,串口打印结果如下图: -
取消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
|