S32K系列之PDB框图详解及PDB触发ADC

可编程延迟模块PDB,PDB可提供从内部或外部触发或可编程间隔信号到ADC硬件触发输入的可控制延迟。 PDB可以选择提供脉冲输出,用作CMP块中的采样窗口。

S32K系列的PDB资源如下表:
S32K系列之PDB框图详解及PDB触发ADC_第1张图片

PDB功能框图

在下图中,以下字母表示的意义:

  • N:PDB通道的总数
  • n:PDB通道号,范围从0到N-1
  • M:每个PDB通道的总可用预触发
  • m:预触发编号,范围从0到M-1
  • Y:脉冲输出的总数
  • y:脉冲数,有效值为0到Y-1
    S32K系列之PDB框图详解及PDB触发ADC_第2张图片

由以上功能框图所知,PDB的本质是一个延时模块,除了PDB_SC控制状态寄存器设置主要的模式外,其他就是对计数值的填写和比较。

首先从左到右看第一部分,通过通道控制寄存器PDB_CHnC1选择通道和相关模式之后,可以选择三种方式触发本身PDB的计数:

  • PDB_CHnDLYm和PDB counter比较触发计数
  • TRIGSEL触发源(比如TRGMUX)触发计数
  • 开启Back to Back模式,当上一个PDB计数完毕后,由上一个PDB通道的Ackm触发计数

第二部分用来设置PDB的计时时间,PDB本质是一个延时模块,故这是PDB的主要部分。通过PDB_SC[MULT]PDB_SC[PRESCALER]来对输入时钟进一步预分频;PDB_MOD寄存器指定计数器的计数值上限;开始计数,PDB_CNT根据时间不断计数,当与设定的计数值PDB_MOD相同时,一个周期的计数完成,PDB_CNT重新开始计数。
通过PDB_SC[TRGSEL]设置触发源,PDB_SC[CONT]设置是否连续计数之后,可以控制计数器在计数一个周期后的重新计数或者暂停计数。

第三部分用来选择PDB的触发源,包括TRGMUX或者软件触发。在PDB_SC[TRGSEL]中设置。

第四部分为PDB的脉冲输出功能配置。PDB可以生成可配置宽度的脉冲输出:

  • 当PDB计数值达到PDB_POnDLY[DLY1]设置的值时,脉冲输出高电平
  • 当PDB计数值达到PDB_POnDLY[DLY2]设置的值时,脉冲输出低电平

脉冲输出功能在PDB_POEN[POEN]位中开启。将DLY2的值设置大于或小于DLY1的值产生的脉冲结果相反:

第五部分是PDB的中断配置,在PDB_SC[PDBIE]中打开中断。当使能中断之后,PDB的计数值达到PDB_IDLY中设置的值后,产生中断。


实例:PDB触发ADC

功能概述

  • 平台:S32K144

使用PDB0触发ADC0_SE8,开启Back to Back模式,ADC0_SE8转换完毕之后触发ADC0_SE0转换。

编程顺序

  1. 初始化PDB0的时钟
  2. 选择PDB0的时钟预分频器和触发方式
  3. 选择PDB0通道,是否开启Back to Back模式
    • 通道0触发通道1,通道1开启Back to Back,通道0不用
  4. 填写PDB0的通道计数值,中断延时计数值或者脉冲输出计数值
  5. 使能PDB
  6. 更新计数值,使能软件触发(如果是硬件触发不需要)
    • 每次一个流程之后,需要重新软件触发使能才开启下一次计数

代码

void PDB_Init(void) 
{ 
	PCC->PCCn[PCC_PDB0_INDEX] = PCC_PCCn_CGC_MASK; 
 
	PDB0->SC = PDB_SC_MULT(1) |           /* 分频器选择10 */ 
		   PDB_SC_TRGSEL(0xF) |        	 /* 选择软件触发 */ 
		   PDB_SC_PRESCALER(7);      /* 时钟128*10分频 */ 
	 
	PDB0->CH[0].C1 = PDB_C1_EN(3) |  /* 开启PDB通道0和通道1 */ 
		 PDB_C1_TOS(3) | /* 双通道开启 ADC触发 */ 
		 PDB_C1_BB(2);    
    /* 开启back to back功能,这里是通道0触发通道1,通道1开启back to back */  
  
	PDB0->MOD = 0xFFFF;        /* 初始化PDB计数器 */ 
	PDB0->IDLY = 0;   /* 初始化中断延时 */ 
	PDB0->MOD = 15000;        /* 计数值 */ 
	PDB0->CH[0].DLY[0] = 15000; 
	PDB0->CH[0].DLY[1] = 15000; 
	 
	PDB0->SC |= PDB_SC_PDBEN_MASK;  /* PDB使能 */ 
	 
	PDB0->SC |= PDB_SC_LDOK_MASK;  /* 更新计数值 */ 
	PDB0->SC |= PDB_SC_SWTRIG_MASK;   /* 使能软件触发 */ 
}

你可能感兴趣的:(专业)