在 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
:“折中之道”。