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

stm32使用定时器实现PWM与呼吸灯

PWM介绍

STM32F103C8T6 PWM 资源:
高级定时器( TIM1 ): 7
通用定时器( TIM2~TIM4 ):各 4
例如定时器2 
PWM 输出模式:
PWM 模式 1 :在 向上计数 时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 向下计数 时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。
PWM 模式 2 :在 向上计数 时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 向下计数 时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。
 所以,在生成PWM波的时候,定时器在不断通过ARR计时的同时,通过一个新的CCRx寄存器来控制有效电平的时长。

注意,对于这种情况,占空比不再是“高电平占一个周期的百分比”,而是“有效电平占一个周期的百分比” !!!!

PWM的周期和占空比

PWM的周期很好理解,就是上节计算公式中的Tout频率就是1/Tout

Tout = 设定时间 (单位秒s)

Tclk = 通过预分频后输出的TIMxCLK(上图右侧红线)

PSC = 预分频系数 (+1是因为计算机是从0开始的)

ARR = 自动重装载值(+1是因为计算机是从0开始的)

假如频率为 2kHz ,则: PSC=71 ARR=499,则Tout=500ms

PWM的占空比则由TIMx_CCRx寄存器决定。

使用PWM实现呼吸灯

Q: LED灯为什么可以越来越亮,越来越暗?

A: 这是由不同的占空比决定的,即修改CCRx寄存器的值,在HAL库中,提供了__HAL_TIM_SetCompare() 函数可以直接修改。

Q: 如何修改周期/频率?

A:加入频率为2kHZ,则PSC=71,ARR=499(其他也行,这只是一种)

Q: LED1连接到哪个定时器的哪一路?

A:要学会看产品手册,通过搜索“PB8”,可以搜出以下表格,表示了引脚PB8的复用功能:

 可见,PB8(LED1)对应的定时器通道Timer 4Channel 3 。

打开Cubemx

1. 惯例设置

2. 设置Timer

2.1 选择Timer 4,点击Internal Clock,在Channel3 选择 PWM Generation CH3 (【STM32】输出比较与输入捕获_输入捕获和输出比较-CSDN博客)

2.2 在下方的“Parameter Setting”中的“Counter settings"设置PSCARRauto-reload 

2.3 在下方的“Parameter Setting”中的“PWM Generation Channel 3 "设置

Mode(这个模式就是本节一开始提到的两种PWM模式),

Pulse(占空比,此处不进行设置,可以在之后的代码中使用刚刚提到的函数来动态的设置),

Output compare preload(预加载,选择Enable),(若Output compare preload配置为Enable,则CCR数据的修改发生在更新事件发生时;配置为Disable,则CCR数据的修改会立即影响TIMx_CCR的影子寄存器)说白了就是可设置动态的CCR

CH polarity(设置有效电平,在这次项目中,目的是点亮LED,LED点亮需要低电平,所以是Low)

2.4 由于呼吸灯没有用到中断,因此NVIC不需要配置;并且由于Timer4的CH3是PB8管脚的复用,因此在完成上面三步的设置后,就相当于配置了PB8,因此GPIO的PB8也不要配置

 3. 惯例设置

4.打开Keil

在自动生成的main.c中的main函数中,可以找到MX_TIM4_Init(),点击跳转之后,可以看到PWM设置部分的代码:

在main函数里编写代码


int main(void)
{uint16_t pwmVal = 0;//调整占空比的参数uint8_t dir = 1;//改变方向 1:越来越亮;0:越来越暗//写在Timer的初始化后HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3); //打开Timer4的3号Channelwhile (1){HAL_Delay(1); //一定要先Delay一下,不然不会亮if(dir == 1){ //如果是越来越亮pwmVal++; //则CCRx的值变大,占空比变大,即有效电平(低电平)的占比变大,亮度变高}else{pwmVal--; //则CCRx的值变小,占空比变小,即有效电平(低电平)的占比变小,亮度变低}if(pwmVal > 500){ //如果CCRx的值超过了ARRdir = 0; //则越来越暗}else if(pwmVal == 0){ //如果CCRx的值为0dir = 1; //则越来越亮}__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal); //修改CCRx,进而修改占空比}}

 

相关文章:

stm32使用定时器实现PWM与呼吸灯

PWM介绍 STM32F103C8T6 PWM 资源&#xff1a; 高级定时器&#xff08; TIM1 &#xff09;&#xff1a; 7 路 通用定时器&#xff08; TIM2~TIM4 &#xff09;&#xff1a;各 4 路 例如定时器2 PWM 输出模式&#xff1a; PWM 模式 1 &#xff1a;在 向上计数 时&#xff0…...

MAC本安装telnet

Linux运维工具-ywtool 目录 1.打开终端1.先安装brew命令2.写入环境变量4.安装telnet 1.打开终端 访达 - 应用程序(左侧) - 实用工具(右侧) - 终端 #注意:登入终端用普通用户,不要用MAC的root用户1.先安装brew命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/H…...

[AIGC] 使用Spring Boot进行单元测试:一份指南

在现代软件开发过程中&#xff0c;确认你的应用正确运行是至关重要的一步。Spring Boot提供了一组实用工具和注解来辅助你在测试你的应用时&#xff0c;使得这个过程变得简单。下面就来分享一下如何在Spring Boot中进行单元测试。 文章目录 为什么需要单元测试Spring Boot单元测…...

使用 Go 语言统计 0-200000 的数字中,哪些是素数?

题目 使用 Go 语言统计 0-200000的数字中&#xff0c;哪些是素数&#xff1f; 思路 两种方法&#xff1a; 单循环遍历 1-200000 数字&#xff0c;并判断是否是素数。 使用了 Goroutine 和通道实现并发&#xff1a; 通过创建两个通道 intChan 和 primeChan&#xff0c;以及一…...

Fabric Measurement

Fabric Measurement 布料测量...

wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载材质文件Mtl 中的纹理图片最简实例(十六)

文章目录 前言一、3d 立方体 model 属性相关文件1. cube.obj2. cube.Mtl3. 纹理图片 cordeBouee4.jpg二、代码实例1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c5.…...

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…...

React腳手架已經創建好了,想使用Vite作為開發依賴

使用Vite作為開發依賴 安裝VITE配置VITE配置文件簡單的VITE配置項更改package.json中的scripts在根目錄中添加index.html現在可以瀏覽你的頁面了 安裝VITE 首先&#xff0c;在現有的React項目中安裝VITE npm install vite --save-dev || yarn add vite --dev配置VITE配置文件 …...

数据结构——双向链表(C语言版)

上一章&#xff1a;数据结构——单向链表&#xff08;C语言版&#xff09;-CSDN博客 目录 什么是双向链表&#xff1f; 双向链表的节点结构 双向链表的基本操作 完整的双向链表示例 总结 什么是双向链表&#xff1f; 双向链表是一种常见的数据结构&#xff0c;它由一系列节…...

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

一、缓存雪崩 简单理解&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间 (例如&#xff1a;设置缓存时采用了相同的过期时间&#xff0c;在同一时刻出现大面积的缓存过期)&#xff0c;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库CPU和内存造成…...

深度学习pytorch——多层感知机反向传播(持续更新)

在讲解多层感知机反向传播之前&#xff0c;先来回顾一下多输出感知机的问题&#xff0c;下图是一个多输出感知机模型&#xff1a; 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机&#xff08;Perceptron&#xff09;&#xff08;持续更新…...

五、分布式锁-redission

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、redission介绍 目前基于redis的setnx特性实现的自定义分布式锁仍存在的问题&#xff1a; 问题描述重入问题同一个线程无法多次获取统一把锁。当方法A成功获取锁后&#xff0c;调用方法B&#xff0…...

ARM的三个按键实验

main.c #include "key_inc.h"//封装延时函数void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}}}int main(){//按键中断初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}re…...

高架学习笔记之需求工程

目录 一、什么是软件需求 二、需求工程 2.1. 需求获取 2.2. 需求分析 2.3. 形成需求规格 2.4. 需求确认 2.5. 需求管理 2.5.1. 变更控制 2.5.2. 版本控制 2.5.3. 需求跟踪 2.5.4. 需求状态跟踪 一、什么是软件需求 软件需求目前没有统一的定义&#xff0c;一般是指用…...

mysql基础2多表查询

多表查询 多表关系: 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工&#xff0c;一个员工对应一个部门 实现: 在多的一方建立外键&#xff0c;指向一的一方的主键 多对多 案例: 学生 与 课程的关系 关系: 一个学生可以选修多门课程&#xff0c;一门课程也可以…...

Qt 写一个邮件发送程序

最近在完成一个邮箱代替的告警功能&#xff0c;写了一个邮件发送的demo 以下为代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QTcpSocket> namespace Ui { class MainWindow; }class MainWindow : public QMainWin…...

swagger3快速使用

目录 &#x1f37f;1.导入依赖 &#x1f32d;2.添加配置文件 &#x1f9c2;3.添加注解 &#x1f96f;4.访问客户端 1.导入依赖 引入swagger3的依赖包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artif…...

一键入门Ubuntu22!

目录 一、安装 二、常用目录 三、常用指令 四、用户指令 五、ssh与scp 六、服务相关 七、Python与Pycharm 八、Vim编辑器 九、Ubuntu22下使用Mysql 十、Ubuntu22下使用mongodb 十一、Ubuntu22下使用redis Ubuntu是一个基于Debian的开源操作系统&#xff0c;由Canoni…...

阿里云服务器价格购买价格表,2024新版报价查询

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…...

实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)

1、先看一效果&#xff1a; 2、实现思路&#xff1a; 使用定时器setTimeout和闭包实现常规防抖功能&#xff1b;增加immediate字段控制第一次是否执行一次函数&#xff08;true or false&#xff09;&#xff1b;增加一个flag标识&#xff0c;在第一次执行时&#xff0c;将标…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...