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

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波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…...

第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...

【通俗理解】Koopman算符与非线性动力系统分析

【通俗理解】Koopman算符与非线性动力系统分析 关键词&#xff1a; #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 提供了多种日志实现&#xff08;log-impl&#xff09;&#xff0c;用于记录 SQL 语句和相关操作&#xff0c;帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明&#xff1a; StdOutImpl…...

ObjectMapper

ObjectMapper 是 Jackson 库中非常重要的一个类&#xff0c;它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper 的底层实现是基于 Jackson 的数据绑定模型&#xff0c;它将 Java 对象与 JSON 数据转换为互通格式。 1. ObjectMapper 的设计与核心功能 O…...

新增白名单赋予应用安装权限

目录 相关问题 具体实现 相关问题 安装app到/data/分区时&#xff0c;如何在安装阶段就赋予权限&#xff0c;无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...

传奇996_51——脱下装备,附加属性设为0

奶奶的lua怎么都修改不了&#xff0c;可以调用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&#xff0c;需要先安装JDK&#xff0c;Gradle 与 JDK的版本对应参见&#xff1a;Java Compatibility IDEA的版本也是有要求Gradle版本的&#xff0c;二者版本对应关系参见&#xff1a;Third-Party Software and Licenses 本次 Gradle 安装版本为…...

MySQL中的redoLog

在数据库系统中&#xff0c;redo log&#xff08;重做日志&#xff09;用于记录所有已提交事务的修改操作&#xff0c;它的主要目的是确保在系统崩溃或故障后&#xff0c;能够恢复数据库到崩溃前的状态。Redo log 记录的是事务修改的数据的具体操作&#xff0c;而不是数据本身。…...

Windows 安装 MySQL

1.下载 MySQL 安装包 访问&#xff1a;MySQL :: Download MySQL Installer选择适合的版本。推荐下载 MySQL Installer for Windows&#xff0c;该安装包包含所有必要的组件选择 Windows (x86, 32-bit), MSI Installer 或 Windows (x86, 64-bit), MSI Installer 2.运行安装程序…...

yocto的xxx.bb文件在什么时候会拷贝文件到build目录

在 Yocto 中&#xff0c;.bb 文件用于描述如何构建和安装一个软件包&#xff0c;而文件在构建过程中的拷贝操作通常会在某些特定的步骤中进行。具体来说&#xff0c;文件会在以下几个阶段被拷贝到 build 目录&#xff08;或者更准确地说&#xff0c;拷贝到目标目录 ${D}&#x…...

Ubuntu Server 22.04.5 LTS重启后IP被重置问题

Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后&#xff0c;所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址&#xff1a;Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…...

Java基础复习

“任何时候我也不会满足&#xff0c;越是多读书&#xff0c;就越是深刻地感到不满足&#xff0c;越感到自己知识贫乏。科学是奥妙无穷的。” ——马克思 目录 一、方法&方法重载 二、运算符 三、数据类型 四、面向对象 1. 面向对象思想 2. 引用传递 3. 访问权限修饰…...

简易图书管理系统

javawebjspservlet 实体类 package com.ghx.entity;/*** author &#xff1a;guo* date &#xff1a;Created in 2024/12/6 10:13* description&#xff1a;* modified By&#xff1a;* version:*/ public class Book {private int id;private String name;private double pri…...

结构型-组合模式(Composite Pattern)

什么是组合模式 又名部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#xff0c;它创建了对象组的树形结构。 结构 抽象根节点&#xff08;Co…...

【知识堂】大数据

一、大数据的基本概念 什么是大数据&#xff1f; 大数据&#xff08;Big Data&#xff09;是指无法通过传统工具和方法在合理时间内处理的海量数据集合。其关键特征是4V&#xff0c;即数据量大&#xff08;Volume&#xff09;、数据种类多&#xff08;Variety&#xff09;、处…...

力扣C语言刷题记录(三)搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...

在Node.js局域网调试https的Vue项目

需求&#xff1a; 最近在测试在网页端&#xff08;HTML5&#xff09;调用移动设备的定位等权限功能&#xff0c;发现某些功能是必须保证域名在https下的否则会出现不正常现象。 解决&#xff1a; 1.在线生成和证书 访问&#xff1a;CSR文件生成工具-中国数字证书CHINASSL …...

3.5 认识决策树

3.5 认识决策树 3.5.1 认识决策树 如何高效的进行决策&#xff1f; 特征的先后顺序 3.5.2 决策树分类原理详解 已知有四个特征&#xff0c;预测 是否贷款给某个人。 先看房子&#xff0c;再看工作&#xff0c;是否贷款。 年龄&#xff0c;信贷情况&#xff0c;工作&#…...

股市复盘笔记

复盘是股市投资中非常重要的一个环节&#xff0c;它指的是投资者在股市收盘后&#xff0c;对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结&#xff0c;以便更好地指导未来的投资决策。以下是对复盘的详细解释&#xff1a; 一、复盘的目的 总结市场走势&#xff…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

rm视觉学习1-自瞄部分

首先先感谢中南大学的开源&#xff0c;提供了很全面的思路&#xff0c;减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接&#xff1a;https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架&#xff1a; 代码框架结构&#xff1a;readme有…...