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

4.定时器(TIMER)

理论

预分频寄存器(TIMx_PSC):由于时钟源为:72MHz,T = 1/f = 1/72MHz,由于不好计算周期时间,则需要分频,若分72则T = 1/1MHz = 1us(1MHz = 一百万秒)

计数方式:向上(递增到某个数触发中断)、向下(递减到某一个数触发中断)、中心计数(递增到某一个数触发中断,再递减到某一个数触发中断)

比较值(参考:链接):

    PWM1模式:若计数值小于有效值则高电平,计数值大于有效值则低电平,可以控制比较值来调节占空比

    PWM2模式:与PWM1模式相反,计数值小于有效值则低电平,大于有效值则高电平

复用:Pin脚本身除了支持普通GPIO功能之外,还支持别的功能(使用别的功能就叫复用)

重映射:Pin脚本身不支持这些功能,配置重映射寄存器,使其具备别的功能

定时器分类

型号:STM32F103ZET6

基本定时器:TIM6、TIM7

基本定时器功能

通用定时器:TIM2~TIM5

通用定时器功能

高级定时器:TIM1、TIM8

高级定时器功能

代码编写

定时器中断实验:LED灯一秒闪烁一次、LED灯两秒闪烁一次、计算单片机运行时间、串口5秒返回单片机运行时间

PWM信号输出:呼吸灯、电机(由慢到快)、舵机

输入捕获:检测信号脉冲宽度(舵机脉冲宽度)

LED灯、UART、定时器、PWM配置

LED灯配置请看:链接

串口配置请看:链接

配置定时器:

72/7200 = 0.01,T = 1/f = 1/0.01MHz = 100us,计数10000,触发中断,100us * 10000 = 1s,1s = 1000000us,但单片机都是以0开始,所以分频值以及计数值都 -1

定时器配置

配置定时器向上计数溢出中断NVIC(嵌套向量中断控制器)

配置定时器NVIC

定时器(PWM)控制LED灯配置

LED(PB5)引脚说明:
PWMLED灯配置

所以配置定时器3,通道二,但配置完发现图中不符,需手动修改

定时器配置LED灯

定时器(PWM)控制电机配置

配置PB4引脚PWM控制电机速度

配置PWM控制电机速度

定时器(PWM)控制舵机配置

舵机脉冲周期:20ms

PWM控制舵机配置

输入捕获定时器配置

输入捕获定时器配置

输入捕获定时器配置

配置定时器全局中断NVIC

开启中断

LED灯闪烁、串口输出运行时间

LED1每隔一秒电平翻转一次,LED2每隔两秒电平翻转一次,串口输出单片机运行时间

Cube IDE代码

main.c

/* USER CODE BEGIN Includes */
#include <stdio.h>	//27行
#include <string.h>	//28行
/* USER CODE END Includes *//* USER CODE BEGIN 0 */
uint32_t G_Timer_Count = 0;	//59行
uint8_t UART_Count[200];	
uint8_t UART_Flag = 0;
/* USER CODE END 0 *//* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);	//开启定时器,97行
/* USER CODE END 2 */if(UART_Flag)	//104行
{sprintf(UART_Count,"MCU run time is %lus",G_Timer_Count);HAL_UART_Transmit(&huart1, UART_Count, strlen(UART_Count), 1000);UART_Flag = 0;	//打印一次后标志=0,等中断五次(5s)后
}/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)	//定时器触发函数,157行
{if(htim == &htim1){HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);G_Timer_Count++;if((G_Timer_Count % 5) == 0)UART_Flag = 1;	//每隔五秒,让标志=1if((G_Timer_Count % 2) == 0)	//LED2每隔两秒翻转电平HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);}}
/* USER CODE END 4 */

PWM信号LED呼吸灯、电机、舵机

理论参考:链接

PWM信号控制LED,产生一个呼吸灯效果,以及对电机控制,控制速度由慢到快

Cube IDE代码

main.c

/* USER CODE BEGIN PV */
uint8_t PWM_Value = 0,LED_PWM_Value = 0,SG_PWM = 5;	//47行
/* USER CODE END PV *//* USER CODE BEGIN 2 */
//参数1:定时器句柄(指向配置好的定时器结构体的指针),参数2:定时器通道,93行
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);	//开启定时器3,通道2 PWM
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);	//开启定时器3,通道1 PWM
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);	//开启定时器4,通道1 PWM
/* USER CODE END 2 *///103行
PWM_Value++;
PWM_Value = PWM_Value % 200;
if(PWM_Value > 99)LED_PWM_Value = 200 - PWM_Value;	//大于99时,从大到小(100,99...)
elseLED_PWM_Value = PWM_Value;
HAL_Delay(25);
//参数1:定时器句柄,参数2:定时器通道,参数3:比较值
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, LED_PWM_Value);	//设置LED比较值
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, LED_PWM_Value);	//设置电机比较值if(PWM_Value % 30 == 0)
{//每0.1ms计数值+1则0.5ms,比较值模式1,则占空比(高电平)0.5msSG_PWM += 5;if(SG_PWM > 25)SG_PWM = 5;__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, SG_PWM);	//设置舵机比较值
}

输入捕获(IC)

捕获高电平持续时间

Cube IDE代码

捕获PWM高电平的时间

main.c

/* USER CODE BEGIN PTD */
uint32_t ic_state=0,period_count=0,ic_count=0,us_count;	//32行
/* USER CODE END PTD *//* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);	//开启普通定时器中断HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);	//开启捕获定时器中断printf("Please connect MCU51 P2.0,and let SG90 run to detect signal!\n");	//串口输出捕获的时间(记得配置串口重定向)
/* USER CODE END 2 */if(ic_state== 2 )	//103行(while里)
{/* 始终设置的是1us触发计数值加1* 一个周期大概65ms,若大于65只有捕获中断函数不好使* 若period_count为1,则代表过了一个中断周期,时间(1*65535)us* 若没有到整个中断周期时间则剩下的为:ic_count* 所以两个相加等于整个高电平时间*/us_count = ic_count + period_count * 0xFFFF;printf("High level duration:  %ldus \n",us_count);	//(float)(us_count)/1000.000ic_state = 0;	//再将中间键恢复0,方便下次上升沿触发中断计时
}/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)	//输入捕获触发函数,161行
{if(TIM2 == htim->Instance){if ( ic_state == 0 ){__HAL_TIM_SET_COUNTER(htim,0);	//将定时器从零开始计时__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);		//设置成下降沿触发ic_state = 1;	//下次触发中断时(下降沿)则运行elseperiod_count = 0;ic_count = 0;}else{ic_count = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);	//读取定时器计数值__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2,   TIM_INPUTCHANNELPOLARITY_RISING);	//设置成上降沿触发ic_state = 2;	//进入while里面的判断}}
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)	//普通定时器中断触发函数
{if(TIM2 == htim->Instance){if(ic_state==1){if(period_count==0XFFFF)	//一次周期大约65ms,若进入这个需要(65*65535)ms{ic_state=2;ic_count=0XFFFF;	//返回一个超大数显示错误}elseperiod_count++;}}
}
/* USER CODE END 4 */

相关文章:

4.定时器(TIMER)

理论 预分频寄存器(TIMx_PSC)&#xff1a;由于时钟源为&#xff1a;72MHz&#xff0c;T 1/f 1/72MHz&#xff0c;由于不好计算周期时间&#xff0c;则需要分频&#xff0c;若分72则T 1/1MHz 1us(1MHz 一百万秒) 计数方式&#xff1a;向上(递增到某个数触发中断)、向下(递…...

java springboot mqtt控制海康摄像头

GHHKControlService 接口 package org.gh.ghhk.service;public interface GHHKControlService {boolean monitorControl(String payload);}GHHKControlServiceImpl 实现类 ​ package org.gh.ghhk.service.impl;import com.alibaba.fastjson.JSONArray; import com.alibaba.…...

AI大模型02:Prompt Engineering 提示工程

一、什么是提示工程&#xff08;Prompt Engineering&#xff09; 1.提示工程&#xff0c;也叫“指令工程” &#xff08;1&#xff09;Prompt 就是我们给大模型发送的指令&#xff0c;或者说是在聊天对话框中发送的内容。 Prompt是AGI时代的编程语言。 Prompt是去控制大模型的…...

EasyExcel动态表头导出

1、封装方法 package com.skybird.iot.base.utils;import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.w…...

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…...

MySQL基础练习题27-上升的温度

目录 题目 准备数据 分析数据 总结 题目 找出与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id 。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Weather (id int, recordDate date, temperature int);#…...

只出现一次的数字 II

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2]…...

第十一章 数据仓库和商务智能 10分

11.1.0语境关系图 11.1 Q 建立数据仓库&#xff0c;有哪些步骤&#xff1f;如何建设&#xff1f;【6 个步骤非常重要&#xff01;必须知道】 1. 理解需求&#xff08;P&#xff09;&#xff08;目的明确&#xff0c;ETL&#xff09; (1) 考虑业务目标和业务战略。 (2) 确定业…...

一篇文章带你解析完整数据结构-----满满干活值得收藏

数据结构是计算机科学中的一个重要分支&#xff0c;它涉及到计算机存储、组织数据的方式。以下是数据结构的主要知识点&#xff1a; 基本概念 数据&#xff08;Data&#xff09;。数据元素&#xff08;Data Element)&#xff1a;数据项&#xff08;Data Item&#xff09;&…...

11.3 用Python处理常见文件

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

Linux知识复习第2期

RHCE 远程登录服务-CSDN博客 Linux 用户和组管理_linux用户和组的管理-CSDN博客 Linux 文件权限详解-CSDN博客 目录 1、sshd 免密登录 (1)纯净实验环境 (2)生成密钥 (3)上锁 2、用户管理 (1)添加新用户 (2)删除用户 (3)修改用户信息 (4)为用户账号设…...

驗證HTTP代理的有效性的方法和步驟-okeyproxy

如何驗證HTTP代理的有效性&#xff0c;確保它的性能和安全性&#xff0c;是非常必要的。本文將詳細介紹驗證HTTP代理有效性的方法和步驟。 HTTP代理作為一種仲介伺服器&#xff0c;它可以幫助用戶在訪問目標網站時隱藏真實IP地址&#xff0c;從而提高匿名性和安全性。通過HTTP…...

Java和kotlin 反射机制

Java 反射机制详解 Java 反射机制是一种强大的工具&#xff0c;使得程序可以在运行时动态地获取类的信息&#xff0c;并且可以在运行时操作类的成员变量、方法和构造函数等。以下是 Java 反射的详细讲解&#xff0c;包括其原理、使用场景、优缺点以及如何使用反射。 1. 反射的…...

Linux Shell编程--数组

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除&#xff01; 一、简介 Shell 脚本中的数组允许你存储多个值&#xff0c;并可以通过索引访问它们。Shell 中的数组是一维的。 二、声明数组 在Shell…...

sheng的学习笔记-AI-k近邻学习(kNN)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 什么是k近邻学习 k近邻&#xff08;k-Nearest Neighbor&#xff0c;简称kNN&#xff09;学习是一种常用的监督学习方法&#xff0c;是一种基本的分类与回归方法。 分类问题&#xff1a;对新的样本&#xff0c;根据其 k 个…...

ShardingSphere之ShardingProxy集群部署

文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置&#xff0c;就是关于集群部署的 mode: # typ…...

同态加密和SEAL库的介绍(六)BGV 方案

前面介绍 BFV 和 CKKS 加密方案&#xff0c;这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念&#xff0c;这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密&#xff08;RLWE&#xff09;问题的加…...

uniapp微信小程序 canvas绘制圆形半透明阴影 createCircularGradient函数不支持透明度部分解决方案

背景 我需要在微信小程序中&#xff0c;用canvas绘制一个圆形钟表&#xff0c;在ui设计图中&#xff0c;有一部分阴影&#xff0c;这里我节选一下&#xff1a; 即深色发黑的部分 canvas通用阴影绘制 由于canvas中并不支持css那样简单的方式为圆形添加阴影或高光&#xff0c…...

W34KN3SS靶机

信息收集&#xff1a; 靶机地址&#xff1a;https://www.vulnhub.com/entry/w34kn3ss-1,270/# &#xff08;1&#xff09;ip扫描 nmap 192.168.254.0/24 -sn | grep -B 2 00:0C:29:E8:66:AB &#xff08;2&#xff09;端口扫描 nmap -p- -A 192.168.254.145 &#xff08;3&…...

8.9套题

A. 猴猴吃苹果 题意&#xff1a;给定根节点k&#xff0c;求访问点的顺序&#xff0c;使得每次从上一个点到当前点的权值最大。访问过的点权值为0。权值一样时&#xff0c;输出最小编号 思路&#xff1a;由于是双向边&#xff0c;先求根节点到每一个节点的距离值。在第一轮中&…...

VideoAgentTrek-ScreenFilter快速开始:10分钟完成Docker部署与API测试

VideoAgentTrek-ScreenFilter快速开始&#xff1a;10分钟完成Docker部署与API测试 你是不是也对那些能自动分析视频、识别屏幕内容的AI工具感到好奇&#xff1f;今天咱们就来聊聊VideoAgentTrek-ScreenFilter&#xff0c;一个专门用来处理视频中屏幕内容的模型。听起来挺酷&am…...

rust-bert 多语言翻译实战:支持 100+ 语言的智能翻译系统

rust-bert 多语言翻译实战&#xff1a;支持 100 语言的智能翻译系统 【免费下载链接】rust-bert Rust native ready-to-use NLP pipelines and transformer-based models (BERT, DistilBERT, GPT2,...) 项目地址: https://gitcode.com/gh_mirrors/ru/rust-bert rust-ber…...

LoRA训练助手GPU显存优化:Qwen3-32B INT4量化后仅需9.2GB显存稳定运行

LoRA训练助手GPU显存优化&#xff1a;Qwen3-32B INT4量化后仅需9.2GB显存稳定运行 1. 引言&#xff1a;当大模型遇见显存焦虑 如果你尝试过在个人电脑上运行大语言模型&#xff0c;大概率会遇到一个令人头疼的问题&#xff1a;显存不足。特别是像Qwen3-32B这样拥有320亿参数的…...

短视频 SEO 如何提高网站的搜索排名

为什么短视频 SEO 是提高网站搜索排名的关键 在当今数字化时代&#xff0c;短视频平台已经成为人们获取信息和娱乐的主要渠道。短视频的流行不仅改变了人们的观看习惯&#xff0c;还深刻影响了网络营销的方式。如何利用短视频 SEO&#xff08;搜索引擎优化&#xff09;来提高网…...

电商人必看!RMBG-2.0轻量抠图实战:证件照换背景+短视频素材一键生成

电商人必看&#xff01;RMBG-2.0轻量抠图实战&#xff1a;证件照换背景短视频素材一键生成 还在为商品图片抠图发愁吗&#xff1f;每天处理几十张产品图&#xff0c;用PS一点点抠边缘&#xff0c;既费时间又费眼睛&#xff1f;或者需要给员工批量制作证件照&#xff0c;但换背…...

手把手教你用MounRiver Studio开发沁恒CH32V003(附完整项目实战)

从零开始用MounRiver Studio开发沁恒CH32V003&#xff1a;温度控制器实战指南 当RISC-V遇上国产MCU&#xff0c;会碰撞出怎样的火花&#xff1f;沁恒CH32V003作为一款性价比极高的RISC-V内核微控制器&#xff0c;配合MounRiver Studio这一专为RISC-V优化的开发环境&#xff0c;…...

LangChain实战避坑:我的RAG项目为什么召回结果不准?从向量化到混合检索的调优全记录

LangChain实战调优&#xff1a;从召回失败到精准检索的完整解决方案 当你的RAG系统在回答"夏天旅行推荐"时&#xff0c;返回了撒哈拉沙漠海滩和新疆火山口这类荒谬结果&#xff0c;问题可能出在文本分割、嵌入模型或混合检索策略上。本文将分享一套经过实战验证的调优…...

2026年AI就业风口!这5个神仙岗位,高薪低门槛,普通人也能转行!

根据LinkedIn数据&#xff0c;2026年AI相关岗位增长迅猛&#xff0c;其中AI咨询顾问、机器学习工程师、AI产品经理、数据与检索工程师等岗位需求旺盛&#xff0c;且部分岗位对计算机科学学位要求不高。文章详细介绍了这5个岗位的火热原因、转行路径及薪资范围&#xff0c;并给出…...

如何高效管理LiteDB数据库?LiteDB.Studio实战指南与深度解析

如何高效管理LiteDB数据库&#xff1f;LiteDB.Studio实战指南与深度解析 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在现代软件开发中&#xff0c;嵌入式…...

ollama部署本地大模型|embeddinggemma-300m嵌入质量评估方法论

ollama部署本地大模型&#xff5c;embeddinggemma-300m嵌入质量评估方法论 1. 引言&#xff1a;为什么需要本地嵌入模型&#xff1f; 想象一下&#xff0c;你正在开发一个智能搜索系统&#xff0c;需要快速理解用户查询的语义含义&#xff0c;并在海量文档中找到最相关的内容…...