stm32之测量占空比

#include "tim4.h"void TIM4_Init(void)
{// 开启时钟RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使用 TIM4 的 GPIOB 时钟// 配置 PB6 为浮空输入 CNF 01 MODE 00GPIOB->CRL &= ~GPIO_CRL_MODE6;GPIOB->CRL &= ~GPIO_CRL_CNF6_1;GPIOB->CRL |= GPIO_CRL_CNF6_0; // 浮空输入// 定时器时基部分// 预分频71TIM4->PSC = 71;// 自动重装载值 1000TIM4->ARR = 65535; // 65535 是最大值,计数到这个值后会重装载// 向上计数TIM4->CR1 &= ~TIM_CR1_DIR;// TI1输入选择直通TIM4->CR2 &= ~TIM_CR2_TI1S; // 输入滤波器TIM4->CCMR1 &= ~TIM_CCMR1_IC1F; // 无滤波// 配置边沿检测器极性上升沿触发TIM4->CCER &= ~TIM_CCER_CC1P;// 配置边沿检测器极性下降沿触发TIM4->CCER |= TIM_CCER_CC2P;// 选择通道1的输入映射为TI1 01TIM4->CCMR1 &= ~TIM_CCMR1_CC1S; // 清除 CC1S 位TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; // 选择通道2的输入映射为TI1 10TIM4->CCMR1 |= TIM_CCMR1_CC2S; // 清除 CC2S 位TIM4->CCMR1 &= ~TIM_CCMR1_CC2S_0;// 预分频器TIM4->CCMR1 &= ~TIM_CCMR1_IC1PSC; // 无预分频TIM4->CCMR1 &= ~TIM_CCMR1_IC2PSC; // 无预分频// 配置触发输入信号101TIM4->SMCR |= TIM_SMCR_TS; // 清除 TS 位TIM4->SMCR &= ~TIM_SMCR_TS_1; // 选择触发输入为 TI1// 配置从模式为复位模式100TIM4->SMCR &= ~TIM_SMCR_SMS; // 清除 SMS 位TIM4->SMCR |= TIM_SMCR_SMS_2; // 设置为复位模式// 通道1输入捕获使能TIM4->CCER |= TIM_CCER_CC1E;// 通道2输入捕获使能TIM4->CCER |= TIM_CCER_CC2E;
}void TIM4_START(void)
{TIM4->CR1 |= TIM_CR1_CEN; // 启动定时器
}void TIM4_STOP(void)
{TIM4->CR1 &= ~TIM_CR1_CEN;
}// 获取 输入 周期为ms
double TIM4_GETPWMCYCLE(void)
{return TIM4->CCR1 / 1000.0; // 假设计数器时钟为 1MHz
}double TIM4_GETPWMFREQ(void)
{return 1000000.0 / TIM4->CCR1;
}double TIM4_GetDutyCycle(void)
{return (TIM4->CCR2 * 1.0) / TIM4->CCR1; // 假设 CCR2 是捕获的高电平时间
}

在这里插入图片描述

定时器 TIM4 被配置为从模式复位模式(TIM_SMCR_SMS = 100),并且触发输入选择为 TI1(TIM_SMCR_TS 设置为 101)。

1. 复位模式的触发机制

  • 在复位模式下,计数器 (CNT) 会在检测到指定的触发输入事件时立即清零。
  • TIM_SMCR_TS 被设置为 101,表示触发输入源是 TI1 的边沿(上升沿或下降沿取决于 TIM_CCER_CC1PTIM_CCER_CC2P 的极性配置)。
  • TIM_CCER_CC1P = 0(上升沿触发),TIM_CCER_CC2P = 1(下降沿触发):
    • 通道 1 (CC1) 捕获 TI1 的上升沿。
    • 通道 2 (CC2) 捕获 TI1 的下降沿。

2. 代码中的配置

  • 触发输入 TI1TIM_SMCR_TS = 101 选择 TI1 作为触发源。TI1 是输入 PWM 信号的滤波和映射后的信号。
  • 复位模式TIM_SMCR_SMS = 100 计数器会在 TI1 的上升沿触发时复位。
  • CNT 行为:计数器从 0 开始计数,当 TI1 检测到上升沿时,CNT 会立即清零。

3. 高电平与复位的关系

  • PWM 信号的高电平是从上升沿开始到下降沿结束。
  • 在你的配置中,复位是由 TI1 的上升沿触发的(因为 TIM_CCER_CC1P = 0 选择上升沿)。这意味着:
    • 当 PWM 信号从低电平跳到高电平(上升沿发生)时,计数器 (CNT) 会被复位。
    • 复位发生在高电平的开始时刻,而不是整个高电平期间。
  • 之后,CNT 会从 0 开始计数,直到下一次触发或达到 ARR。

4. 代码中的捕获逻辑

  • TIM4->CCR1 捕获上升沿时间(高电平开始)。
  • TIM4->CCR2 捕获下降沿时间(高电平结束)。
  • 由于 CNT 在每次上升沿复位,CCR1 总是记录 0(或很小的值),CCR2 记录高电平持续时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86908.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂模式 - Flutter中的UI组件工厂,按需生产各种“产品

想要动态创建不同风格的按钮?想一键切换整个主题?工厂模式就是你的"生产流水线"! 想象一下这个场景: 你决定扩大奶茶店业务,推出两个品牌系列: 经典系列:传统珍珠奶茶,红…

基于 SpringBoot+Vue.js+ElementUI 的 Cosplay 论坛设计与实现7000字论文

基于 SpringBootVue.jsElementUI 的 Cosplay 论坛设计与实现 摘要 本论文设计并实现了一个基于 SpringBoot、Vue.js 和 ElementUI 的 Cosplay 论坛平台。该平台旨在为 Cosplay 爱好者提供一个集作品展示、交流互动、活动组织于一体的综合性社区。论文首先分析了 Cosplay 论坛…

超标量处理器11-Alpha21264 处理器

1. 简介 21264处理器是一款4-way,乱序执行的超标量处理器,采用0.35um的CMOS工艺,工作电压是2.2V, 工作频率是466-667MHz; 处理器能支持60条指令,也即ROB的深度是60; Load/Store指令也采取乱序执行, 总共7级流水。I-CACHE和D-CACH…

Spring 中 Bean 的生命周期

一、什么是 Bean 生命周期? Spring 中的 Bean 生命周期是指一个 Bean 从 被容器创建到 最终销毁 所经历的一系列过程。 它体现了 Spring IOC 容器在管理 Bean 实例时所执行的各个钩子流程,包括初始化、依赖注入、增强处理、销毁等多个环节。 二、Bean 生…

C++ 中 std::string 与 QString 的深度剖析

在 C 编程领域,std::string 和 QString 是两种广泛应用的字符串类型,它们在设计理念、功能特性以及适用场景上都呈现出鲜明的特点。本文将从多个维度对这两种字符串类型进行深度剖析,并详细阐述它们之间的相互转化方法。 std::string 是 C 标…

不止于“修补”:我如何用Adobe AI重塑设计与视频叙事流程

最近我深度体验了一把来自英国Parvis School of Economics and Music的Adobe正版教育订阅,在把玩PhotoShop、Premiere Pro这些“老伙计”的新功能时,的确挖到了一些宝藏,觉得非常有必要与大家说道说道。首先得聊聊这个订阅给我的直观感受&…

重头开始学ROS(5)---阿克曼底盘的URDF建模与Gazebo控制(使用Xacro优化)

阿克曼底盘的URDF建模与Gazebo控制(使用Xacro优化) 阿克曼底盘建模 建模 我们使用后轮驱动,前轮转向的阿克曼底盘模型。 那么对于后轮只需进行正常的continous joint连接即可 对于前轮,有两个自由度,旋转和转向&…

RabbitMq中启用NIO

✅ 所属类 com.rabbitmq.client.ConnectionFactory🧠 使用背景 RabbitMQ Java 客户端默认使用传统的 阻塞 I/O (java.net.Socket) 实现。如果你希望: 更好地控制 线程数获得更好的 并发性能降低 每个连接的线程占用在高并发连接或消费者数量较多的系统…

[Dify]-基础篇2- 如何注册并快速上手 Dify 平台

在生成式 AI 应用开发新时代,如何快速搭建一个高效、可维护、易上线的 AI 工具,是每位开发者关注的核心。Dify,正是为此而生的一站式平台。本篇将以新手视角,带你从注册账号、配置环境,到构建应用、部署上线,手把手完成你的第一个 AI 项目。 注册并设置工作环境 1. 账号…

Java面试宝典:基础七

153. 如何实现对象克隆? 答: 对象克隆有两种主要方式: 浅克隆:实现Cloneable接口并重写Object.clone() class Person implements Cloneable {String name;Car car; // 引用类型@Override

spring-security原理与应用系列:requestMatchers和authorizeRequests

目录 简单示例 WebSecurityConfig requestMatchers ​​​​​​​requestMatchers ​​​​​​​antMatchers ​​​​​​​chainRequestMatchers ​​​​​​​setMatchers ​​​​​​​requestMatcher ​​​​​​​WebSecurity ​​​​​​​performBuild…

Bessel位势方程求解步骤

问题 考虑偏微分方程(PDE): − Δ u u f , x ∈ R n , -\Delta u u f, \quad x \in \mathbb{R}^n, −Δuuf,x∈Rn, 其中 f ∈ L 2 ( R n ) f \in L^2(\mathbb{R}^n) f∈L2(Rn)。这是一个线性椭圆型方程,称为 Bessel 位势方…

if __name__ == ‘__main__‘:

基本概念 if __name__ __main__: 是一个条件判断语句,用于确定当前模块是作为主程序运行,还是被其他模块导入。 __name__ 变量 __name__ 是Python的一个内置变量,表示当前模块的名称当一个模块被直接运行时,__name__ 的值会被…

浅谈Apache HttpClient的相关配置和使用

Apache HttpClient是由Apache软件基金会维护的一款开源HTTP客户端库,对比最基础的 HttpURLConnection 而言,它的优势时支持连接池管理,拦截器(Interceptor)机制,同步/异步请求支持等能力。 在使用这个组件时&#xff…

【Teensy】在ArduinoIDE中配置Teensy4.1

1.文件——首选项 在其他开发板管理器地址这里添加: https://www.pjrc.com/teensy/package_teensy_index.json 点击确定! 2.安装Teensy(for Arduino IDE…) 按照图中1,2,3操作!可以选择上一个版本(不使用最…

企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云

随着云计算技术逐渐成熟,越来越多的企业开始在本地数据中心自行搭建云平台,满足数据合规、业务性能与连续性、节约成本等多方面的需求。不过,面对多种多样的自建云产品,不少用户会有类似的疑问:自建云等于私有云吗&…

反弹 Shell 升级为全交互终端的两种高效方法

目录 🚀 升级反弹 Shell 为全交互终端:两种高效方法 🛠️ 方法 1:利用 Python pty.spawn 创建伪终端 📋 操作步骤

Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation论文精读(逐段解析)

Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation论文精读(逐段解析) 论文地址:https://arxiv.org/abs/2408.04804 CVPR 2024 Yifan Feng, Jiangang Huang, Shaoyi Du, Senior Member, IEEE, Shihui Ying, Jun-Hai Y…

Windows 下配置多个 GitHub 账号的 SSH Key

Windows 下配置多个 GitHub 账号的 SSH Key 假设你有以下两个 SSH key 文件: 第一个账号:id_rsa(默认)第二个账号:id_rsa_github ✅ 步骤:在 Windows 上配置多个 GitHub 账号 SSH Key 1️⃣ 打开 SSH 配…

技术选型:时序数据库(三)

IoTDB vs InfluxDB vs TDengine 时序数据库横评对比。 从 架构设计、性能、功能、生态、适用场景 等维度,对三款时序数据库进行深度对比,助您精准选型。 一、核心架构对比 数据库 存储模型 数据模型 扩展性 Apache IoTDB 分层存储(TsFi…