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,进而修改占空比}}

 

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

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

相关文章

mysql的实训操作任务指南

对于当前MYSQL的实训任务&#xff0c;对于MySQL的运行进行截图。自己需要首先打开自己的电脑里面。查看是否有自己的MYSQL是否可以顺利运行。其次&#xff0c;还需要查看自己的mysql文本文档是否可以顺利运行。它的代码是否可以正确运行&#xff0c;其次&#xff0c;将他的代码…

稀碎从零算法笔记Day22-LeetCode:两数相加

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

MySQL临时表:临时存储数据的灵活利器

MySQL临时表&#xff1a;临时存储数据的灵活利器 MySQL临时表是处理数据时非常有用的工具&#xff0c;它提供了临时存储数据的能力&#xff0c;使得复杂查询、排序、聚合以及数据筛选变得更加高效和简单。在本文中&#xff0c;我们将深入探讨MySQL临时表的概念以及何时需要使用…

leetcode02-Two Sum

这道题目最直接的方法就是for循环俩次遍历数组&#xff0c;第二次遍历用target减去对应的值然后看数组中是否有该值&#xff0c;这种的解法时间复杂度是O(n^2)。我们想一下之所以需要二次遍历的原因是因为没有办法在O(1)的时间内判断出差值是否存在于该数组中&#xff0c;如果有…

JWT面试题

一&#xff0c;什么是JWT JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 JWT总的来说是用来解决session的共享的问题的 1&#xff0c;JWT的原理 JWT 的原理是&#xff0c;服务器认证以后&#xff0c;生成一个 JSON 对象&#xff0c;发回给…

太阳之华 连通块计数

C-太阳之华_牛客小白月赛89 (nowcoder.com) 思路&#xff1a;可以发现&#xff0c;最多经过一次操作就能知道结果&#xff1a; 全是蓝色&#xff1a;蓝方胜全是红色&#xff1a;红方胜红方经过一次操作&#xff1a; 存在一个连通块扩散等于蓝色个数&#xff1a;红方胜否则&am…

2024年最新阿里云服务器价格表(配置价格+带宽价格+磁盘)

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

爬楼梯C语言

方法一&#xff1a;动态规划 int climbStairs(int n) {int f[100] {0};f[0] 0;f[1] 1;f[2] 2;for(int i 3;i<n;i)f[i] f[i-1] f[i-2];//可能是从i-1阶爬上第i阶&#xff0c;也有可能是从i-2阶 return f[n]; } 方法二&#xff1a;滚动数组 int climbStairs(int n){int…

覃超老师 算法面试通关40讲

教程介绍 无论是阿里巴巴、腾讯、百度这些国内一线互联网企业&#xff0c;还是 Google、Facebook、Airbnb 等硅谷知名互联网公司&#xff0c;在招聘工程师的过程中&#xff0c;对算法和数据结构能力的考察都是重中之重。本课程以帮助求职者在短时间内掌握面试中最常见的算法与…

笔记:Mysql数据库删除报错 1008

说明 mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mysql | | performance_schema | | sys | | test | -------------------- 5 rows in set (0.02 sec…

[AIGC] Redis基础命令集详细介绍

Redis是一个强大的开源的键-值存储系统&#xff0c;被广泛应用于各种应用程序中。在使用Redis时&#xff0c;我们需要掌握一些基本的Redis命令来操作存储在其上的数据。这篇文章将向你介绍一些基本的Redis命令&#xff0c;让你能够更好地使用和理解Redis。 文章目录 启动Redis…

【云开发笔记No.13】Jenkins和持续集成

一、Jenkins的概念 Jenkins是一个开源的持续集成工具&#xff0c;用于自动化软件开发过程中的各种任务&#xff0c;包括编译、测试、打包、部署等。它提供了一个可扩展的平台&#xff0c;通过插件机制支持多种开发语言和构建工具。Jenkins的主要目标是帮助软件开发团队提高开发…

代码随想录算法训练营第十八天|找树左下角的节点

513. 找树左下角的值 已解答 中等 相关标签 相关企业 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7提示: 二…

python写爬虫爬取京东商品信息

工具库 爬虫有两种方案&#xff1a; 第一种方式是使用request模拟请求&#xff0c;并使用bs4解析respond得到数据。第二种是使用selenium和无头浏览器&#xff0c;selenium自动化操作无头浏览器&#xff0c;由无头浏览器实现请求&#xff0c;对得到的数据进行解析。 第一种方…

因特网服务

▶1.网页服务 WWW(万维网)的信息资源分布在全球近10亿个网站上&#xff0c;网站的服务内容由ICP(因特网信息提供商)进行发布和管理&#xff0c;用户通过浏览器软件(如IE),就可浏览到网站上的信息&#xff0c;网站主要采用网页的形式进行信息描述和组织&#xff0c;网站是多个网…

C#绘制面形图

创建windows窗体应用 ,从工具箱添加Button和Panel using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Fo…

draw.io 去除箭头

问题 draw.io 去除箭头 详细问题 笔者使用draw.io绘制流程图&#xff0c;需要没有箭头的连接器&#xff0c;但是General所提供的连接器添加了尾部箭头&#xff0c;如何取消尾部箭头? 解决方案 1、点击选中选择连接器&#xff08;箭头1&#xff09;。在格式面板的“Style…

【Transformer】transformer注解

every blog every motto: You can do more than you think. 0. 前言 transformer注解 在过去的一年里&#xff0c;《Attention is all you need》中的transformer一直萦绕在很多人的脑海里。除了在翻译质量上产生重大改进之外&#xff0c;它还为许多其他NLP任务提供了一种新的…

AOP原理和切面应用

1 概述 我们所说的Aop(即面向切面编程),即面向接口,也面向方法,在基于IOC的基础上实现。 Aop最大的特点是对指定的方法进行拦截并增强,这种增强的方式不需要业务代码进行调整,无需侵入到业务代码中,使业务与非业务处理逻辑分离。 以Spring举例,通过事务的注解配置,S…

C++ 基本运算

何谓运算符和操作数 基本运算 1、双目运算 2、单目运算 3、赋值表达式 表达形式&#xff1a; <变量><表达式>; 表达式是指各种运算符把常量、变量&#xff0c;函数等运算对象连接起来的具有实际意义并符合C语法规则的式子。赋值是指表达式的值赋给一个变量。 …