STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期
需求分析
上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。
把测到的结果通过串口发送到电脑,检查测试的结果。
如何测量
1、输入捕获功能主要是:测量输入通道的上升沿和下降沿
2、让第一个上升沿触发,第二个上升沿卡个事件,可以测量到周期
3、然后通过周期反推频率
输入捕获包括三个部分:
共四路,每路都有自己的输入引脚
计数器部分
捕获寄存器部分
过程

通过之前产生的方波信号,然后再配置输入对这个方波信号进行测量,用杜邦线

连接两个引脚,tim4和tim5的引脚,昨天tim5的引脚产生PWM方波,用tim4定时器用于测量。
产生中断会触发中断函数(这个函数将CNT计时器清零),但是触发中断函数之前会产生一个捕获比较事件,这个事件是将CNT的值搬到捕获比较1寄存器中。
上升沿会触发中断,产生搬用事件,并将CNT清零,
然后下一个上升沿会再次产生中断,那么会产生搬用事件将CNT计数器搬到寄存器中,可以抓取这个值,就是这个周期的事件。
设计相关寄存器
每个复用器都需要寄存器进行配置
CCMR1
CC2S:选择输入
IC1F:无滤波,可以抗干扰,一般在硬件就已经抗干扰啦,这里无滤波
CCIS: 输入有三种情况
PSC:预分频 三档2/4/8分频
CCER:
CC1P:上升沿还是下降沿
CC1E: 输入使能
CR2:
TI1S:采用TIMx_CH1的线路
DIER:捕获比较中断
CC1IE:允许中断
tim4.c
#include "tim4.h"void TIM4_Init(){//1.GPIO//1.1放时钟RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//1.2 PB6 引脚 配置输入模式 浮空输入GPIOB->CRL &= ~ (GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6);GPIOB->CRL |= GPIO_CRL_CNF6_0;//2.TIM4//2.0 先放时钟RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;//2.1 控制器 (不管 全部保留默认设72MHz)//2.2 时基单元//2.2.1 分频 计数频率就是1M 数一个数的时间就是1usTIM4->PSC = 72 - 1;//2.2.2 尺子越长越好TIM4->ARR = 65535;//2.3 输入和输出通道//2.3.1 通道输入还是输出TIM4->CCMR1 |= TIM_CCMR1_CC1S_0;TIM4->CCMR1 &= ~TIM_CCMR1_CC1S_1;//2.3.2 配置TI1复用器,选择CH1引脚直接过来的信号(默认就是)TIM4->CR2 &= ~TIM_CR2_TI1S;//2.3.3 配置滤波器(默认就是)TIM4->CCMR1 &= ~ TIM_CCMR1_IC1F;//2.3.4 配置边沿检测器(默认就是)TIM4->CCER &= ~TIM_CCER_CC1P;//2.3.5 预分频器(默认就是)TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;//2.3.6 中断使能TIM4->DIER |= TIM_DIER_CC1IE;//3 有中断就需要配置NVIC//3.1 优先级分组NVIC_SetPriorityGrouping(3);//3.2 设置本中断的优先级NVIC_SetPriority(TIM4_IRQn,6);//3.3 对于片上外设 NVIC有一个使能控制NVIC_EnableIRQ(TIM4_IRQn);
}void TIM4_Start(void){// 开启通道使能TIM4->CCER |= TIM_CCER_CC1E;//开启计数器使能TIM4->CR1 |= TIM_CR1_CEN;
}void TIM4_Stop(void){// 关闭通道使能TIM4->CCER &= ~TIM_CCER_CC1E;//关闭计数器使能TIM4->CR1 &= ~TIM_CR1_CEN;
}uint8_t raise_edge_num = 0;uint16_t cnt = 0;double TIM4_GetCycleMs(void){return cnt/1000.0;
}double TIM4_GetFreq(void){return 1000000.0/cnt;
}void TIM4_IRQHandler (void){//片上外设都有标志位//-1 判断什么原因进入中断//0 清0 标志位if(TIM4->SR & TIM_SR_CC1IF){TIM4->SR &= ~TIM_SR_CC1IF;//业务逻辑//1 .让编号加1raise_edge_num ++;//2. 分开第一个上升沿和第二个上升沿的逻辑if (raise_edge_num == 1){//3 如果第一个上升沿到来 我直接从0开始计数TIM4->CNT = 0;}else if (raise_edge_num == 2){//4.如果第二个上升沿到来raise_edge_num = 0;//5.抄数,把值记录下来cnt = TIM4->CCR1;}}
}
tim4.h
#ifndef __TIM4_H__
#define __TIM4_H__#include "stm32f10x.h"void TIM4_Init();void TIM4_Start(void);void TIM4_Stop(void);double TIM4_GetCycleMs(void);double TIM4_GetFreq(void);#endif /* __TIM4_H__ */
main.c
我们要设置占空比,因为我们是tim5产生的pwm方波,如果没有占空比,也就没有方波产生,也就产生不了上升沿触发不了中断。
#include "usart1.h"
#include "string.h"
#include <stdio.h>
#include "m24c02.h"
#include "i2c.h"
#include "led.h"
#include "systick.h"
#include "tim6.h"
#include "tim5.h"
#include "tim4.h"typedef enum {LIGHT,DARK}LED_DIRCT;extern uint16_t cnt;int main(void)
{TIM5_Init();TIM5_PWMStart();TIM5_SetDuty(10);Usart1_Init();TIM4_Init();TIM4_Start();// LED_DIRCT direct = LIGHT;while (1){Delay_s(2);printf ("当前的周期时%.2fms,频率是%.2fHz",TIM4_GetCycleMs(),TIM4_GetFreq());}
}
HAL库
前面有两个__:是宏定义,
相关文章:
STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期
需求分析 上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑,检查测试的结果。 如何测量 1、输入捕获功能主要是:测量输入通道的上升沿和下降沿 2、让第一个…...
第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】
摘要:本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路,所用材料均为常见的模块,简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...
【通俗理解】Koopman算符与非线性动力系统分析
【通俗理解】Koopman算符与非线性动力系统分析 关键词: #Koopman算符 Koopman Operator #非线性动力系统 Nonlinear Dynamical System #无穷维线性算子 Infinite-Dimensional Linear Operator #演化分析 Evolution Analysis #Bernard Koopman Bernard Koopman 第…...
mybatis plus打印sql日志
1、官方文档 使用配置 | MyBatis-Plus 2、日志实现 MyBatis-Plus 提供了多种日志实现(log-impl),用于记录 SQL 语句和相关操作,帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明: StdOutImpl…...
ObjectMapper
ObjectMapper 是 Jackson 库中非常重要的一个类,它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper 的底层实现是基于 Jackson 的数据绑定模型,它将 Java 对象与 JSON 数据转换为互通格式。 1. ObjectMapper 的设计与核心功能 O…...
新增白名单赋予应用安装权限
目录 相关问题 具体实现 相关问题 安装app到/data/分区时,如何在安装阶段就赋予权限,无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...
传奇996_51——脱下装备,附加属性设为0
奶奶的lua怎么都修改不了,可以调用txt的 ; LINKPICKUPITEM ; ChangeitemaddvaLue -1 5 0 ; GETITEMADDVALUE 3 5 M10 ; SENDUPGRADEITEM ; SENDMSG 9 你的衣服附加了<$STR(M10)>点防御属性. 或者lua callscriptex(actor,“LINKPICKUPITEM”) callscriptex(…...
【Mac】安装Gradle
1、说明 Gradle 运行依赖 JVM,需要先安装JDK,Gradle 与 JDK的版本对应参见:Java Compatibility IDEA的版本也是有要求Gradle版本的,二者版本对应关系参见:Third-Party Software and Licenses 本次 Gradle 安装版本为…...
MySQL中的redoLog
在数据库系统中,redo log(重做日志)用于记录所有已提交事务的修改操作,它的主要目的是确保在系统崩溃或故障后,能够恢复数据库到崩溃前的状态。Redo log 记录的是事务修改的数据的具体操作,而不是数据本身。…...
Windows 安装 MySQL
1.下载 MySQL 安装包 访问:MySQL :: Download MySQL Installer选择适合的版本。推荐下载 MySQL Installer for Windows,该安装包包含所有必要的组件选择 Windows (x86, 32-bit), MSI Installer 或 Windows (x86, 64-bit), MSI Installer 2.运行安装程序…...
yocto的xxx.bb文件在什么时候会拷贝文件到build目录
在 Yocto 中,.bb 文件用于描述如何构建和安装一个软件包,而文件在构建过程中的拷贝操作通常会在某些特定的步骤中进行。具体来说,文件会在以下几个阶段被拷贝到 build 目录(或者更准确地说,拷贝到目标目录 ${D}&#x…...
Ubuntu Server 22.04.5 LTS重启后IP被重置问题
Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后,所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址:Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…...
Java基础复习
“任何时候我也不会满足,越是多读书,就越是深刻地感到不满足,越感到自己知识贫乏。科学是奥妙无穷的。” ——马克思 目录 一、方法&方法重载 二、运算符 三、数据类型 四、面向对象 1. 面向对象思想 2. 引用传递 3. 访问权限修饰…...
简易图书管理系统
javawebjspservlet 实体类 package com.ghx.entity;/*** author :guo* date :Created in 2024/12/6 10:13* description:* modified By:* version:*/ public class Book {private int id;private String name;private double pri…...
结构型-组合模式(Composite Pattern)
什么是组合模式 又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 结构 抽象根节点(Co…...
【知识堂】大数据
一、大数据的基本概念 什么是大数据? 大数据(Big Data)是指无法通过传统工具和方法在合理时间内处理的海量数据集合。其关键特征是4V,即数据量大(Volume)、数据种类多(Variety)、处…...
力扣C语言刷题记录(三)搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...
在Node.js局域网调试https的Vue项目
需求: 最近在测试在网页端(HTML5)调用移动设备的定位等权限功能,发现某些功能是必须保证域名在https下的否则会出现不正常现象。 解决: 1.在线生成和证书 访问:CSR文件生成工具-中国数字证书CHINASSL …...
3.5 认识决策树
3.5 认识决策树 3.5.1 认识决策树 如何高效的进行决策? 特征的先后顺序 3.5.2 决策树分类原理详解 已知有四个特征,预测 是否贷款给某个人。 先看房子,再看工作,是否贷款。 年龄,信贷情况,工作&#…...
股市复盘笔记
复盘是股市投资中非常重要的一个环节,它指的是投资者在股市收盘后,对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结,以便更好地指导未来的投资决策。以下是对复盘的详细解释: 一、复盘的目的 总结市场走势ÿ…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
