当前位置: 首页 > news >正文

【STM32的通用定时器CR1的CKD[1:0]: 时钟分频因子 (Clock division)】

在 STM32 的通用定时器(如 TIM2, TIM3, TIM4, TIM5 等)中,CR1 (Control Register 1) 寄存器中的 CKD[1:0] (Clock division) 位域是一个与抗干扰和数字滤波相关的设置,它并不直接影响定时器计数器 (CNT) 的计数频率(计数频率由预分频器 PSC 决定)。它的主要作用是控制定时器内部时钟 (CK_INT) 相对于外部时钟 (ETR) 或外部触发输入 (TIx) 的数字滤波器采样频率,以及死区时间生成的时钟基准

核心概念:

  1. 定时器时钟源 (CK_PSC) 这是驱动定时器预分频器 (PSC) 和计数器 (CNT) 的最终时钟源。它可以来自内部时钟 (CK_INT)、外部时钟模式 1 (ETR)、外部时钟模式 2 (TIx) 或内部触发输入 (ITRx)

  2. 数字滤波器: 定时器对外部输入信号(如 ETR, TI1, TI2)有内置的数字滤波器,用于抑制高频噪声(毛刺)。滤波器通过采样输入信号来工作。

  3. 死区时间生成: 在高级定时器 (TIM1, TIM8) 中用于互补 PWM 输出时,需要插入死区时间以防止上下管同时导通。死区时间的分辨率也需要一个时钟基准。

CKD[1:0] 的作用: 它定义了用于数字滤波采样死区时间分辨率的时钟 (t_DTS) 相对于定时器内部时钟 (CK_INT) 的分频关系。

CKD[1:0] 的取值与含义:

CKD[1:0]分频因子数字滤波/死区时间基准时钟 (t_DTS)说明抗干扰能力延迟/分辨率
0001t_DTS = t_CK_INT不分频。采样频率最高。最低最小
0112t_DTS = 2 * t_CK_INT2 分频。采样频率为 CK_INT 的一半。中等中等
1024t_DTS = 4 * t_CK_INT4 分频。采样频率为 CK_INT 的四分之一。最高最大
113ReservedReserved保留。勿使用此设置。--

详细解释:

  1. 对数字滤波器的影响:

    • 数字滤波器通过检测 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] 影响捕获到信号边沿的准确性和抗噪性。

      • 外部时钟模式: 当使用外部信号作为计数器时钟源时(ETRTIx)。

      • 外部触发输入 (ETR): 用于复位、启动、停止计数器或触发从模式操作(如门控模式)。

      • 触发输出 (TRGO): 在某些从模式(如复位模式)下,CKD[1:0] 也会影响 TRGO 信号对外部触发输入的响应。

  2. 对死区时间生成的影响 (仅高级定时器 TIM1/TIM8):

    • 死区时间 (DTG) 的值是以 t_DTS 的倍数来配置的。

    • CKD 决定了 t_DTS 的周期长度,从而决定了死区时间的最小步进(分辨率):

      • CKD=00t_DTS 最小,死区时间分辨率最高(能配置更精细的死区时间)。

      • CKD=10t_DTS 最大,死区时间分辨率最低(配置步进变大)。

    • 选择原则: 如果需要非常精细地控制死区时间,选择低的分频因子(如 00)。如果对死区时间精度要求不高,或者 CK_INT 频率很高导致 t_DTS 已经足够小,可以选择更高的分频因子以换取更好的抗噪能力(如果同时使用了外部触发输入)。

  3. 对定时器基本在代码中配置: 通过设置 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)
  4. 计数 (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“折中之道”

相关文章:

  • 造轮子系列:从0到1打造生产级HTTP客户端,优雅封装OkHttp/HttpClient,支持异步、重试与文件操作
  • LSM树与B+树优缺点分析
  • LeetCode 209.长度最小的子数组
  • 多线程中SimpleDateFormat为何不安全?如何解决?
  • 基于大模型预测过敏性紫癜的技术方案大纲
  • window 显示驱动开发-DirectX VA 2.0 的扩展支持
  • Python 爬虫入门 Day 2 - HTML解析入门(使用 BeautifulSoup)
  • 【工具教程】批量PDF识别提取区域的内容重命名,将PDF指定区域位置的内容提取出来改名的具体操作步骤
  • Logback-spring.xml 配置屏蔽特定路径的日志
  • 美化显示MSVC调试的数据结构
  • centos 8.3(阿里云服务器)mariadb由系统自带版本(10.3)升级到10.6
  • 实现无缝连接:EtherNet/IP转CANopen网关助力汽车制造智能化未来
  • 【Twisted】Python 使用Twisted实现TCP多人聊天Demo
  • 从Apache OFBiz 17.12.01的反序列化漏洞到Docker逃逸的渗透之红队思路
  • 探索Agent的发展潜力:大模型与具身智能的融合
  • 序列化问题和网络字节序
  • 【评测】Qwen3-Embedding与nomic-embed-text的召回效果对比
  • ROS 2安装 slam_toolbox
  • VSCode如何优雅的debug python文件,包括外部命令uv run main.py等等
  • UE5场景漫游——开始界面及关卡跳转
  • 编程培训就业班/太原网站seo
  • 长安网站建设制作/免费的建站平台
  • 哪有深圳设计公司/百度关键词优化技巧
  • html5新增标签/成都seo工程师
  • 手机网站自动跳转代码/爱奇艺科技有限公司
  • 滕州市中远建设工程公司网站首页/新东方线下培训机构官网