S32K系列之PDB框圖詳解及PDB觸發ADC

可編程延遲模塊PDB,PDB可提供從內部或外部觸發或可編程間隔信號到ADC硬件觸發輸入的可控制延遲。 PDB可以選擇提供脈衝輸出,用作CMP塊中的採樣窗口。

S32K系列的PDB資源如下表:
1

PDB功能框圖

在下圖中,以下字母表示的意義:

  • N:PDB通道的總數
  • n:PDB通道號,範圍從0到N-1
  • M:每個PDB通道的總可用預觸發
  • m:預觸發編號,範圍從0到M-1
  • Y:脈衝輸出的總數
  • y:脈衝數,有效值爲0到Y-1
    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;   /* 使能軟件觸發 */ 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章