在 STM32 的通用定時器(如 TIM2, TIM3, TIM4, TIM5 等)中,CR1
(Control Register 1) 寄存器中的 CKD[1:0]
(Clock division) 位域是一個與抗干擾和數字濾波相關的設置,它并不直接影響定時器計數器 (CNT)
的計數頻率(計數頻率由預分頻器 PSC
決定)。它的主要作用是控制定時器內部時鐘 (CK_INT)
相對于外部時鐘 (ETR)
或外部觸發輸入 (TIx)
的數字濾波器采樣頻率,以及死區時間生成的時鐘基準。
核心概念:
-
定時器時鐘源
(CK_PSC)
: 這是驅動定時器預分頻器(PSC)
和計數器(CNT)
的最終時鐘源。它可以來自內部時鐘(CK_INT)
、外部時鐘模式 1(ETR)
、外部時鐘模式 2(TIx)
或內部觸發輸入(ITRx)
。 -
數字濾波器: 定時器對外部輸入信號(如
ETR
,TI1
,TI2
)有內置的數字濾波器,用于抑制高頻噪聲(毛刺)。濾波器通過采樣輸入信號來工作。 -
死區時間生成: 在高級定時器
(TIM1, TIM8)
中用于互補 PWM 輸出時,需要插入死區時間以防止上下管同時導通。死區時間的分辨率也需要一個時鐘基準。
CKD[1:0]
的作用: 它定義了用于數字濾波采樣和死區時間分辨率的時鐘 (t_DTS)
相對于定時器內部時鐘 (CK_INT)
的分頻關系。
CKD[1:0]
的取值與含義:
CKD[1:0] | 值 | 分頻因子 | 數字濾波/死區時間基準時鐘 (t_DTS) | 說明 | 抗干擾能力 | 延遲/分辨率 |
---|---|---|---|---|---|---|
00 | 0 | 1 | t_DTS = t_CK_INT | 不分頻。采樣頻率最高。 | 最低 | 最小 |
01 | 1 | 2 | t_DTS = 2 * t_CK_INT | 2 分頻。采樣頻率為 CK_INT 的一半。 | 中等 | 中等 |
10 | 2 | 4 | t_DTS = 4 * t_CK_INT | 4 分頻。采樣頻率為 CK_INT 的四分之一。 | 最高 | 最大 |
11 | 3 | Reserved | Reserved | 保留。勿使用此設置。 | - | - |
詳細解釋:
-
對數字濾波器的影響:
-
數字濾波器通過檢測
N
個連續的t_DTS
周期內輸入信號是否穩定為高或低電平來判斷有效邊沿。N
是可配置的(通過TIMx_CCMRx
寄存器的ICxF[3:0]
位)。 -
CKD
決定了t_DTS
的周期長度:-
CKD=00
(t_DTS = t_CK_INT):濾波器采樣頻率最高。能過濾掉更窄的毛刺(即更高頻的噪聲),但對信號真實邊沿的延遲最小。 -
CKD=01
(t_DTS = 2*t_CK_INT):采樣頻率中等。能過濾中等寬度的毛刺,延遲中等。 -
CKD=10
(t_DTS = 4*t_CK_INT):采樣頻率最低。能過濾更寬的毛刺(即較低頻的噪聲),但對信號真實邊沿的延遲最大。
-
-
選擇原則: 如果外部輸入信號環境噪聲大(毛刺多且寬),選擇更高的分頻因子(如
10
- 4分頻)可以更好地抑制噪聲,但會增加信號延遲。如果環境比較干凈或者需要低延遲,選擇低的分頻因子(如00
- 不分頻或01
- 2分頻)。 -
影響的功能模塊:
-
輸入捕獲通道: 用于測量脈沖寬度、頻率等。
CKD[1:0]
影響捕獲到信號邊沿的準確性和抗噪性。 -
外部時鐘模式: 當使用外部信號作為計數器時鐘源時(
ETR
或TIx
)。 -
外部觸發輸入 (
ETR
): 用于復位、啟動、停止計數器或觸發從模式操作(如門控模式)。 -
觸發輸出 (
TRGO
): 在某些從模式(如復位模式)下,CKD[1:0]
也會影響TRGO
信號對外部觸發輸入的響應。
-
-
-
對死區時間生成的影響 (僅高級定時器 TIM1/TIM8):
-
死區時間
(DTG)
的值是以t_DTS
的倍數來配置的。 -
CKD
決定了t_DTS
的周期長度,從而決定了死區時間的最小步進(分辨率):-
CKD=00
:t_DTS
最小,死區時間分辨率最高(能配置更精細的死區時間)。 -
CKD=10
:t_DTS
最大,死區時間分辨率最低(配置步進變大)。
-
-
選擇原則: 如果需要非常精細地控制死區時間,選擇低的分頻因子(如
00
)。如果對死區時間精度要求不高,或者CK_INT
頻率很高導致t_DTS
已經足夠小,可以選擇更高的分頻因子以換取更好的抗噪能力(如果同時使用了外部觸發輸入)。
-
-
對定時器基本在代碼中配置: 通過設置
TIMx->CR1
寄存器的CKD[1:0]
位。// 示例:設置 CKD[1:0] = 01 (2分頻) TIMx->CR1 &= ~TIM_CR1_CKD; // 先清零 CKD 位 TIMx->CR1 |= TIM_CR1_CKD_1; // CKD[1:0] = 01 (TIM_CR1_CKD_1 宏通常對應 0x0200)
-
計數 (
CNT
) 頻率的影響:-
CKD
設置對定時器計數器CNT
的計數頻率(CK_CNT)
完全沒有影響!
-
? ? ?5. 與輸入濾波器 (ICxF[3:0]
, ETF[3:0]
) 的關系:CKD[1:0]
設置的tDTS
是輸入濾波器工作的基礎時鐘。
? ? ? ?輸入濾波器配置位(如 IC1F[3:0]
用于輸入通道 1)決定了需要連續采樣到多少次穩定電平才確認有效邊沿(N=2, 4, 6, 8
等)。實際能濾除的噪聲最小寬度是 N * tDTS
。因此,CKD[1:0]
和輸入濾波器位 共同決定了濾波器的性能。
?
總結與使用建議:
-
CKD[1:0]
的核心作用是設置t_DTS
時鐘,用于數字濾波采樣和死區時間分辨率。 -
它不改變定時器計數器
(CNT)
的計數頻率,計數頻率由預分頻器(PSC)
控制。 -
選擇
CKD
值是一個在抗干擾能力 (噪聲抑制
) 和響應速度/分辨率 (延遲
) 之間的權衡:-
高噪聲環境: 選擇
CKD=10
(4分頻) 獲得最強的抗噪能力(過濾更寬的毛刺),但信號延遲最大,死區時間分辨率最低。 -
低噪聲環境或需要低延遲/高分辨率: 選擇
CKD=00
(不分頻) 獲得最小的信號延遲和最高的死區時間分辨率,但抗噪能力最弱(只能過濾很窄的毛刺)。 -
折中方案:
CKD=01
(2分頻) 提供中等性能。
-
-
如果不使用外部觸發輸入
(ETR, TIx)
或者使用但環境非常干凈,并且不使用高級定時器的死區時間(或者對死區分辨率要求不高),通常保持默認值CKD=00
即可。 -
如果遇到外部信號誤觸發問題(噪聲引起),嘗試增大
CKD
值(并配合配置濾波器的采樣數ICxF
)是首要的解決方案之一。
簡單記憶:
-
CKD
是 “清潔度/延遲 開關”。 -
00
:“快快凈凈” (響應快,環境干凈時用)。 -
10
:“慢慢抗臟” (抗干擾強,響應慢,環境臟時用)。 -
01
:“折中之道”。