可編程延遲模塊PDB,PDB可提供從內部或外部觸發或可編程間隔信號到ADC硬件觸發輸入的可控制延遲。 PDB可以選擇提供脈衝輸出,用作CMP塊中的採樣窗口。
S32K系列的PDB資源如下表:
PDB功能框圖
在下圖中,以下字母表示的意義:
- N:PDB通道的總數
- n:PDB通道號,範圍從0到N-1
- M:每個PDB通道的總可用預觸發
- m:預觸發編號,範圍從0到M-1
- Y:脈衝輸出的總數
- y:脈衝數,有效值爲0到Y-1
由以上功能框圖所知,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
轉換。
編程順序
- 初始化PDB0的時鐘
- 選擇PDB0的時鐘預分頻器和觸發方式
- 選擇PDB0通道,是否開啓Back to Back模式
- 通道0觸發通道1,通道1開啓Back to Back,通道0不用
- 填寫PDB0的通道計數值,中斷延時計數值或者脈衝輸出計數值
- 使能PDB
- 更新計數值,使能軟件觸發(如果是硬件觸發不需要)
- 每次一個流程之後,需要重新軟件觸發使能纔開啓下一次計數
代碼
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; /* 使能軟件觸發 */
}