定时器与PWM的LED控制

目录

    • 一、基础概念
      • 定时器
        • 定时器类型
        • 定时器特性
      • PWM
        • 定义
        • 占空比
        • 原理
    • 二、实验
      • 1.LED周期性亮灭
        • 定时器TIM2配置
        • GPIO引脚设置
        • 工程相关参数配置
        • Keil编写程序
      • 2.LED呼吸灯(PWM)
        • 呼吸灯原理
        • Keil编写程序
        • Keil虚拟示波器,观察 PWM输出波形
          • 设置
          • 点击setup,并设置观察引脚
        • 效果展示:
      • 总结

实验目的:深入了解STM32定时器原理,掌握脉宽调制pwm生成方法。

一、基础概念

定时器

定时器类型

STM32定时器主要分为三类:

  1. 基本定时器(Basic Timer)

    基本定时器通常较为简单,比如STM32中的TIM6和TIM7。

    它们主要用于生成定时中断,适用于需要定时计数或驱动DAC等简单应用。

    基本定时器没有输入捕获、输出比较等复杂功能,通常只有一个16位的自动装载寄存器。

  2. 通用定时器(General Purpose Timer)

    包括TIM1到TIM4, TIM9到TIM14(具体数量依据不同系列的STM32型号而异)。

    提供更多功能,如输入捕获、输出比较(可用于PWM生成)、单脉冲模式(One Pulse Mode)、编码器接口等。

    可用于测量输入信号的脉冲宽度、生成精确的输出波形等复杂任务。

    支持多种时钟源,包括内部时钟、外部时钟、ETR引脚时钟等。

  3. 高级定时器(Advanced Timer)

    通常指TIM1和TIM8(在某些高端系列中可能更多),具有更高级的功能。

    集成了基本定时器和通用定时器的所有特性,还增加了死区控制、紧急刹车功能等,特别适合于电机控制中的PWM生成。

    高级定时器还可以与其他定时器同步工作,支持更复杂的控制策略。

定时器特性

时钟源多样性:可选择内部时钟(如HCLK经预分频后的时钟)、外部时钟(通过特定引脚输入)、或者其他定时器的触发信号作为时钟源。

计数模式:包括向上计数、向下计数和中央对齐模式。

预分频器:通过预分频器可以灵活调整定时器的时钟频率,从而实现更宽范围的计时周期。

中断和DMA:定时器可以配置为在特定事件(如计数溢出、比较匹配等)时产生中断或触发DMA传输。

主/从模式:定时器可以工作在主模式下,通过TRGO引脚输出触发信号给其他外设(如ADC)或另一个定时器;或者作为从模式,其计数受其他定时器或外设的触发信号控制。

PWM

定义

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

占空比

是一个脉冲周期内,高电平的时间与整个周期时间的比例

image-20240527222130419

比方说周期的时间是10ms,脉宽时间是7ms 那么低电平时间就是3ms 总的占空比70%

原理

以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平

假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号

我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压

比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V
image-20240528211222275

pwm的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降

也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压

pwm就是通过这种原理实现D/A转换的。

PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压

二、实验

1.LED周期性亮灭

**内容:**使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。

image-20240527190343986

image-20240527191323634

image-20240527191432467

配置STM32的时钟系统,系统时钟配置为72MHz,APB1为72MHz。

image-20240527211025234

定时器TIM2配置

image-20240527201010499

TIM2在APB1总线上,实验要用定时器TIM2延时2s,STM32定时器时间计算公式如下:

image-20240527191841036

公式解释:

ARR(TIM_Period):自动重装载值,是定时器溢出前的计数值

PSC(TIM_Prescaler):预分频值,是用来降低定时器时钟频率的参数

Tclk:定时器的输入时钟频率(单位Mhz),通常为系统时钟频率或者定时器外部时钟频率(STM32f103c8t6,系统主频72Mhz)

Tout:定时器溢出时间(单位us)。一定要注意这个单位是us

image-20240527202600428

Clock Source”设置为“Internal Clock”(内部时钟);

预分频系数Prescaler”设置为“36000-1”;“Counter Mode”设置为“Up”;

计数值“Counter Period”设置为“4000-1”;

“auto-reload preload”设置为“*Enable”。

则定时器TIM3精确定时2,000,000微秒(2s)。

image-20240527194504578

GPIO引脚设置

设置PA5引脚为GPIO_Output,用于本例的LED指示灯显示,并在“GPIO Mode and Configuration”中配置相应的参数

image-20240527191344860

image-20240527194900084

工程相关参数配置

image-20240527195242341

image-20240527195401005

Keil编写程序

在main.c文件中的/*USER CODE BEGIN2 */和/*USER CODE END2 */之间添加开启定时器TIM3中断的程序

image-20240527204001261

在mian.c文件的/ * USER CODE BEGIN4 */ 和 /*USER CODE END4 */之间添加TIM2的中断回调函数

image-20240527204435356

效果展示:

led44

2.LED呼吸灯(PWM)

**内容:**接上,采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用Keil虚拟示波器,观察 PWM输出波形。

呼吸灯原理

一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感。

频率太小的话 看起来就会闪烁

那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯,

你在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的电灯就会闪烁,

但是如果是10毫秒内,5毫秒打开,5毫秒关闭,(频率100Hz) 这时候灯光的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用 人眼不感觉电灯在闪烁,而是感觉灯的亮度少了 因为高电平时间(占空比)为50% 亮度也就为之前的50% ,

频率很高时,看不到闪烁,占空比越大,LED越亮;
频率很低时,可看到闪烁,占空比越大,LED越亮。
所以,在频率一定下,可以用不同占空比改变LED灯的亮度。 使其达到一个呼吸灯的效果

通过设置ARR 和PSC调整端口高低电平持续时间以及频率实现呼吸灯

image-20240528004007991

image-20240528004133965

image-20240528004247608

image-20240528004522248

image-20240528002805431

image-20240528004744116

image-20240528004849531

Keil编写程序
  /* USER CODE BEGIN 1 */
	
	uint16_t pwmVal=0;   //PWM占空比  
    uint8_t dir=1;  

  /* USER CODE END 1 */

  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

  /* USER CODE END 2 */

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  while (pwmVal< 500)
	  {
		  pwmVal++;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);    //修改比较值,修改占空比
//		  TIM3->CCR1 = pwmVal;    与上方相同
		  HAL_Delay(1);
	  }
	  while (pwmVal)
	  {
		  pwmVal--;
		  __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal);    //修改比较值,修改占空比
//		  TIM3->CCR1 = pwmVal;     与上方相同
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);

  }
  /* USER CODE END 3 */

Keil虚拟示波器,观察 PWM输出波形
设置

关于keil虚拟示波器的一些设置可以参考我的上一篇博客HAL库LED点灯-CSDN博客的第三部分:波形分析

点击setup,并设置观察引脚

image-20240530203032574

效果展示:

可以看到随着占空比由小变大,由PWM原理可知,得到的实际电压由小变大,即灯泡逐渐由暗变亮;反之,则灯泡由亮变暗,从而达到了呼吸灯的效果

PWM_weave

总结

通过实验加深对HAL库代码结构的认识,学习了如何在STM32CubeMX中配置定时器的时钟源、预分频值、自动重载寄存器等,以设定合适的定时周期。还了解如何配置定时器的通道为PWM输出模式,包括设置占空比、频率等

参考链接:

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次-CSDN博客

PWM原理 PWM频率与占空比详解-CSDN博客

STM32CubeMX & Keil——STM32F103C8T6:PWM控制LED灯_stm32pwmled灯-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计计算六|自助法及置换检验(Bootstrap and Permutation Test)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 统计计算四|蒙特卡罗方法&#xff08;Monte Carlo Method&#xff09; 统计计算五|MCMC&#x…

spring boot 中的异步@Async

spring boot 开启异步调用 1、启动类上添加EnableAsync注解&#xff0c;表示启动异步 2、在具体实现异步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…

rtos最小任务切换的实现 keil软件仿真 stm32 PendSV

最小任务切换的实现 本例子实现了一个 rtos 最小的任务切换功能&#xff0c;使用 keil 仿真功能&#xff0c;在模拟的 stm32f103 的器件上实现了使用 PendSV 中断切换线程的效果。 git 源码仓库&#xff1a;https://github.com/yutianos/rtos-little 本文链接&#xff1a;csdn…

时钟、复位与上电初始化

目录 1. 复位2.1. 异步复位 同步释放2.2. Xilinx FPGA复位设计尽量少用复位reg信号初始值基于PLL锁定&#xff08;locked&#xff09;复位设计 2. 时钟 1. 复位 FPGA中复位设计总结 深入理解复位—同步复位&#xff0c;异步复位&#xff0c;异步复位同步释放(含多时钟域&#x…

认识Oracle v$mystat视图

v$mystat就是当前用户的各种统计信息&#xff0c; sid就是session的id(也就是当前用户),STATISTIC#就是统计量的编号(用来唯一确定统计量的名称)&#xff0c;value是统计量的值&#xff1b; desc命令在Oracle中通常用于查看表结构&#xff1b; v$mystat视图中只会有当前用户…

pdf拆分成有图和无图的pdf(方便打印)

pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印&#xff0c;每次都要手动弄&#xff0c;打印的时候很麻烦&#xff1b; 随着打印次数的增加&#xff0c;时间就越来越多 为解决此问题&#xff0c;使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明

Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 目录 Python 机器学习 基础 之 算法链与管道 【通用的管道接口/网格搜索预处理步骤与模型参数/网格搜索选择使用哪个模型】的简单说明 一、简单介…

Linux前奏-预热版本

一、操作系统概述 1.1 了解操作系统的作用 我们所熟知的计算机&#xff0c;也就是电脑&#xff0c;就是由硬件和软件来组成的 硬件&#xff1a;计算机系统中由电子机械&#xff0c;和各种光电元件等组成的各种物理装置的总称 软件是什么呢&#xff1f; 软件&#xff1a;用…

视频汇聚平台EasyCVR对接GA/T 1400视图库结构化数据:人员/人脸、非/机动车、物品

在信息化浪潮席卷全球的背景下&#xff0c;公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中&#xff0c;GA/T 1400标准作为公安视频图像信息应用系统的核心规范&#xff0c;以其结构化数据处理与应用能力&#xff0c;为公安信息化建设注入了强大的动力。…

skywalking介绍及搭建

链路追踪框架比对&#xff1a; skywalking安装部署&#xff1a; 下载地址&#xff1a;Downloads | Apache SkyWalking 配置微服务与skywalking整合&#xff1a; copy agent/optional-plugins/apm-spring-cloud-getway-xx.jar到plugins&#xff0c;然后重启skywalking 监控界面…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

Web程序设计-实验05 DOM与BOM编程

题目 【实验主题】 影视网站后台影视记录管理页设计 【实验任务】 1、浏览并分析多个网站后台的列表页面、编辑页面&#xff08;详见参考资源&#xff0c;建议自行搜索更多后台页面&#xff09;的主要元素构成和版面设计&#xff0c;借鉴并构思预期效果。 2、新建 index.h…

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑位置快捷键&#xff1a; pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑…

在IDEA中使用Git在将多次commit合并为一次commit

案例&#xff1a; 我想要将master分支中的 测试一、测试二、测试三三次commit合并为一次commit 1. 点击Git 2. 双击点击commit所在的分支 3. 右键要合并的多个commit中的第一次提交的commit 4. 点击右键后弹出的菜单中的Interactively Rebase From Here选项 5. 点击测试二…

elementui el-tooltip文字提示组件弹出层内容格式换行处理

1、第一种 1.1 效果图 1.2、代码 <template><div class"wrapper"><el-tooltip class"content" effect"dark" placement"top"><div slot"content"><div v-html"getTextBrStr(text)"&…

数据可视化:解析其在现代生活中的日益重要地位

数据可视化为什么对我们的生活影响越来越大&#xff1f;这是一个值得探讨的话题。在信息化时代&#xff0c;数据无处不在&#xff0c;海量的数据不仅改变了商业模式&#xff0c;也深刻影响了我们的日常生活。数据可视化作为一种将复杂数据转化为直观图表、图形的技术&#xff0…

CLIP模型NAN问题解决

早有耳闻&#xff0c;clip模型会在fp16下发生NAN的问题&#xff0c;但是今天基于2080Ti测试&#xff0c;发现在单精度下的tensorrt推理同样存在NAN的问题&#xff0c;我甚至一度怀疑是tensorrt的推理代码有问题。 之后&#xff0c;决定从python代码的角度去寻找问题的答案&…

PostgreSQL常用插件

PostgreSQL 拥有许多常用插件&#xff0c;这些插件可以大大增强其功能和性能。以下是一些常用的 PostgreSQL 插件&#xff1a; 性能监控和优化 pg_stat_statements 1.提供对所有 SQL 语句执行情况的统计信息。对调优和监控非常有用。 2.安装和使用&#xff1a; pg_stat_k…

SOLIDWORKS参数化开发 慧德敏学

传统的设计模式下大规模定制型产品结构设计周期长&#xff0c;问题多&#xff0c;以及大量重复性工作让工程师疲于应对&#xff0c;这些严重阻碍了公司订单承接能力和技术创新能力&#xff0c;难以响应市场需求。 什么是参数化设计&#xff1f; 1、它是一种设计的方式&#x…

oracle mysql索引区别

文章目录 1.引言1.1 索引的基本概念1.2 Oracle和MySQL的简介 2.Oracle索引2.1 Oracle索引的类型**B-Tree索引****Bitmap索引****Function-Based索引****Partitioned索引****Text索引** 2.2 Oracle索引的工作原理2.3 Oracle索引的实例代码 3.MySQL索引3.1 MySQL索引的类型**B-Tr…