STM32——定时器

定时器有 捕获脉冲宽度、计算PWM占空比、输出PWM波形以及编码器计数等各种功能。

定时器又能分为

  • 基本定时器:TIM6和TIM7
  • 通用定时器:TIM2、TIM3、TIM4和TIM5
  • 高级定时器:TIM1、TIM8

一、计数和分频

每当一个方波信号的上升沿经过寄存器,计数器就会+1。

对于APB1先进外设总线上的定时器时钟线连接给了基本定时器和通用定时器。APB2则提供给了高级定时器。

我们可以通过修改 APB1 上定时器时钟,来实现恒定波形频率。

例如设置 APB1 时钟频率为 72MHz,也就是当计数器计数到72000 000 次时,1秒钟就过去了。

但是计数器的寄存器有的仅有16bit,也就是做多计数65535个数。

STM32提供了预分配器(PSC)来进行分频,例如:

当预分频器设置为1时,将每两个脉冲分频成一个脉冲,也就是2分频,36Hz;同样的设置为2,就是三分频,24Hz。预分频器也是16bit,能够进行65536分频。

那么对于 72MHz 的时钟频率,最多能够计数约59秒多:

当然定时器不止一个,能够计数的量就更多。

二、定时原理

自动重装载寄存器(ARR)

当计数器到达与自己的值,会将计数器的值重置为0,此时可以触发一次定时器更新中断。有个细节问题,计数是从0开始的,计数总和要+1。

捕获/比较寄存器值(CCRx)

用于捕获输入信号的边沿时间或者生成输出信号。

计数器输出频率

计数器占空比

三、输出频率、占空比

1. 定时器配置

时钟频率为80:

分频器和重装载器分别为4000和100。

2. 示例

要求 PA6 通道占空比 10%,PA7 通道占空比 10%。

PA6 通道输出频率为 100Hz,PA7 通道输出频率为 200Hz。

B2:按下B2按键,PA6手动模式占空比参数加10%,占空比可调整范围:10%~90%,占空比参数增加到90%后,再次按下B2按键,返回10%。

B3:按下B3按键,PA7手动模式占空比参数加10%,占空比可调整范围:10%~90%,占空比参数增加到90%后,再次按下B3按键,返回10%。

2.1 引脚设置

PA6的频率为100Hz,那么

100Hz=\frac{80MHz}{8000*100},即时钟80M,8000分频,捕获为100.

PA7频率为200Hz,分频改 4000就行了,其他不变。

2.2 代码

定义变量输出频率和占空比

//TIM
uint16_t PA6_frq,PA7_frq;
uint8_t PA6_duty=10,PA7_duty=10;

主函数部分,输出频率和占空比的计算。

	HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//频率计算PA6_frq=80000000/8000/(TIM16->ARR+1);PA7_frq=80000000/4000/(TIM17->ARR+1);//占空比TIM16->CCR1=PA6_duty;TIM17->CCR1=PA7_duty;/* USER CODE END 2 */

HAL_TIM_PWM_Start() 函数用于启动定时器的PWM(脉冲宽度调制)输出

HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);TIM_HandleTypeDef *htim: 指向定时器句柄的指针,该句柄包含了定时器的配置信息。uint32_t Channel: 定时器的PWM通道,用于指定哪个通道将开始PWM输出。

按键实现逻辑: 

void Key_Proc(void)
{key_val=Key_Scan();key_down = key_val &(key_val^key_old);key_up = ~key_val &(key_val^key_old); key_old=key_val;if(key_down==1){LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);if(++lcd_page==3) lcd_page=0;}if(key_down==2){    //B2使占空比增加10%PA6_duty+=10;//参数增加到90%时,占空比返回10%if(PA6_duty==100) PA6_duty=10;TIM16->CCR1=PA6_duty;}if(key_down==3){PA7_duty+=10;if(PA7_duty==100) PA7_duty=10;TIM17->CCR1=PA7_duty;}}

四、输入捕获频率、占空比

1. 原理图

R39和R40两个滑动变阻器,能够调整555定时器的频率。让PA15和PB4设置为了定时器的输入捕获模式。

3. 捕获原理

在输入捕获模式下,当检测到ICx信号上相应的边沿(如上升沿或下降沿)后,定时器的当前计数器值(CNT)被锁存到捕获/比较寄存器(TIMx_CCRx)中。然后根据CCR的值与时钟,计算出频率。

3.1 捕获频率

而学过信号的都知道,频率都是算一个周期的,对于方波信号,就是捕获连续两个上升沿的时间差值即可。

T=(CCRx2-CCRx1)*ARR/CLK

f=1/T=CLK/ARR/(CCRx2-CCRx1)

3.2 捕获占空比

要先捕获一个周期的时间差,作为分母。然后捕获一个电平变化的时间差,作为分子。

设 CCRx1 为第一个上升沿,CCRx3 为第二个上升沿,那么周期为 CCRx3-CCRx1。

设 CCRx2 为第一个下降沿,那么电平变化时间差为 CCRx2-CCRx1。

占空比为:\frac{CCRx3-CCRx1}{CCRx2-CCRx1}

当然需要两个通道,分别获取上升沿和下降沿。

4. 程序编写 

4.1 捕获频率

TIM2的配置,当然TIM3也是一样的。

 

uint32_t cap1,cap2,R39_frq,R40_frq;HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2){//获取CCR捕获值cap1 = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);TIM2->CNT=0;//计算频率R40_frq = 80000000/80/cap1;HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);}if(htim->Instance==TIM3){cap2 = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);TIM3->CNT=0;R39_frq = 80000000/80/cap2;HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);}
}

 

4.2 捕获占空比

设置两个通道,分别上升和下降沿。

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2){if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){cap1 = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);cap1_2 = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);TIM2->CNT=0;R40_frq = 80000000/80/cap1;R40_duty= (1.0*cap1_2)/(1.0*cap1)*100;HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);}}
}

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

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

相关文章

链表双指针经典习题

链表双指针经典习题 链表的分解删除排序链表中的重复元素2(重复元素彻底删除)方法一:分解链表方式二:快慢指针递归解法 链表的合并丑数2有序矩阵中第k小的元素查找和最小的k对数字两数相加两数相加2 回文单链表回文链表 迭代和递归…

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch 要说2025年国内产品经理使用的主流原型设计工具,当然是墨刀、Axure、Figma和Sketch了,但是很多刚入行的产品经理不了解自己适合哪些工具,本文将从核心优势、局限短板、协作能…

RISC-V双核锁步高性能抗辐照MCU芯片技术解析与应用

1. 概念名词解析 安全冗余设计 AS32X601系列通过硬件ECC(Error Correction Code)保护存储系统(内置SRAM、Flash等),并在DMA模块中提供“可选的双核锁步安全备份”机制,支持高可靠性场景下的数据传输容错。…

2024爱分析·央国企数字化应用实践报告

报告综述“央国企KPI”驱动央国企数字化投入稳中有进 在民营企业推进数字化转型的过程中,其核心驱动力往往聚焦于降本增效与开源节流。然而,对于央国企而言,尽管降本增效等因素亦在其考量范围之内,但其推进数字化转型的根本动因则…

Kubernetes 的正式安装

1.基础的网络结构说明 软件路由器 ikuai 当然同一个仅主机模式 相当于在 同一个我们所谓的广播域内 所以相当于它们的几张网卡 是被连接起来的 为了防止出现问题 我们可以把第二块网卡临时关闭一下 2.准备路由器 ikuai 爱快 iKuai-商业场景网络解决方案提供商 (ikuai8.com)…

OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数,旨在平滑图像中的纹理区域,同时保留边缘信息。该技术特别适…

关于eMMC存储器在各种情况下的分区编号和名字的问题

前言 关于eMMC的分区编号和名字问题,表面上看是个小问题,事实上在程序开发中,没有小问题,一个变量值设置不对,可能整个程序或系统就跑不起来。eMMC的分区编号和名字问题就是一个事关嵌入式系统烧写和正常启动的关键问…

nuxt2-vue2:通过编程方式调用对话框 el-dialog

一、背景 1.1、需求 项目:nuxt2 vue2 希望通过编程方式的调用打开对话框,展现我们想要的内容。 1.2、效果 二、代码 2.1、插件 plugins/dialog.js import Vue from vue; import { Dialog } from element-ui; // 本文使用了Dialog组件,…

记录一些面试遇到的问题

重载和重写的区别 重载是overload,覆盖是override 重载属于编译时多态,覆盖属于运行时多态 运行时多态和编译时多态 运行时多态指的是在运行的时候才知道要调用哪一个函数,编译时多态是指在编译的时候就知道调用哪一个函数。 运行时多态…

【为什么会有 map、weakmap 类型?】

为什么会有 map、weakmap 类型? 传统对象的局限性催生 Map‌1. 键类型单一性‌2. 有序性与迭代支持‌3. 性能优化场景‌ 内存管理需求催生 WeakMap‌1.弱引用机制‌2. 私有数据存储‌3. 规避循环引用问题‌ 总结 传统对象的局限性催生 Map‌ 1. 键类型单一性‌ 传统对象&…

Django下防御Race Condition

目录 漏洞原因 环境搭建 复现 A.无锁无事务时的竞争攻击 B.无锁有事务时的竞争攻击 防御 A.悲观锁加事务防御 B.乐观锁加事务防御 总结 漏洞原因 Race Condition 发生在多个执行实体(如线程、进程)同时访问共享资源时,由于执行顺序…

课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比

随着无人机在工业检测、仓储物流、应急救援等室内场景的广泛应用,高精度室内定位技术成为关键支撑。超宽带(UWB)技术凭借其高时间分辨率、强抗多径能力等优势,成为室内定位的主流方案。然而,不同的定位方法&#xff08…

c语言笔记 fgets

fgets 是 C语言中的一个标准输入输出函数,用于从输入流(如文件、键盘等)读取一行字符串。它的名字来源于 "File GeT Sring",表示从文件中读取字符串。 fgets 的函数原型如下: char *fgets(char *str, int n,…

【含文档+PPT+源码】基于微信小程序的农产品自主供销商城系统

项目介绍 本课程演示的是一款基于微信小程序的农产品自主供销商城系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

ReAct论文阅读笔记总结

ReAct:Synergizing Reasoning and Acting in Language Models 背景 最近的研究结果暗示了在自主系统中结合语言推理与交互决策的可能性。 一方面,经过适当Prompt的大型语言模型(LLMs)已经展示了在算术、常识和符号推理任务中通…

20250306-笔记-精读class CVRPEnv:step(self, selected)

文章目录 前言一、if self.time_step<4:控制时间步的递增判断是否在配送中心特定时间步的操作更新更新当前节点和已选择节点列表更新需求和负载更新访问标记更新负无穷掩码更新步骤状态&#xff0c;将更新后的状态同步到 self.step_state 二、使用步骤总结 前言 class CVRP…

nginx服务器实现上传文件功能_使用nginx-upload-module模块

目录 conf文件内容如下html文件内容如下上传文件功能展示 conf文件内容如下 #user nobody; worker_processes 1;error_log /usr/logs/error.log; #error_log /usr/logs/error.log notice; #error_log /usr/logs/error.log info;#pid /usr/logs/nginx.pid;even…

mapbox进阶,模仿百度,简单实现室内楼层切换

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion三维填充图层样式1.4 ☘…

String / StringBuffer / StringBuilder 的区别是什么?

String、StringBuffer 和 StringBuilder 都是 Java 中用于处理字符串的类&#xff0c;但它们在多个方面存在区别&#xff0c;以下是详细介绍&#xff1a; 1. 可变性 4. 使用场景 String&#xff1a;String 类是不可变的&#xff0c;一旦创建了一个 String 对象&#xff0c;它的…

为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!

从去年以来&#xff0c;多家新造车企业都经常拿大定、小定的数据来说事&#xff0c;而不是如之前说销量领先&#xff0c;原因就在于他们曾对标的特斯拉在销量方面已远远超越&#xff0c;在销量方面无法与特斯拉比拼&#xff0c;就只好用订单 国内媒体一片宣传特斯拉在中国的销量…