【STM32学习】PWM学习,(二)驱动LED呼吸灯

news2025/1/6 18:56:53

        上文学习了PWM的基本概述,和PWM的各种参数,本文 学习使用PWM信号去驱动LED实现呼吸灯的效果。

 1、PWM驱动LED呼吸灯

1.1介绍

目标:单片机输出一个PWM信号,驱动LED呼吸亮灭。PWM占空比高,则LED更亮;PWM占空比低,则LED更暗;

如下图为实物连接图,在PA0引脚输出PWM信号。

1.2程序运行思路分析:

1)打开时钟(TIM和GPIO的时钟)

2)初始化GPIO(指定某个引脚输出PWM信号)

3)初始化定时器时基单元,(为了设置定时器参数,如频率,计数模式,ARR自动重装值,PSC预分频器等)

4)初始化定时器输出比较,(配置某个定时器的某个通道,模式,极性,使能,和CCR捕获比较寄存器)

5)开启定时器

6)函数调用

1.3程序

下图的程序为输出50%占空比PWM 信号。使用时,直接在主函数,调用PWM_Init ();

void PWM_Init (void)
{
	RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStruct.TIM_Period = 100-1;      //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;    //PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);	
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 50;   //CCR   ,ARR,PSC,CCR,共同设置PWM的占空比
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);
	
	TIM_Cmd(TIM1,ENABLE);
}

若要设置不断更改PWM占空比,则需要调用更改CCR的函数TIM_SetCompare1,

然后再在主函数中调用函数,写入自己想要的值,

如:在主函数中调用,功能为,更改CCR 的值从小变大,再从大变小,不断循环。

运行LED效果:变亮变暗不断循环,实现呼吸灯效果

void PWM_SetCompare(uint16_t Compare1)
{
	TIM_SetCompare1(TIM2,Compare1);
}

//以上是调用的函数
//下面可以在主函数中调用,功能为,更改CCR 的值从小变大,再从大变小,不断循环
while(1)
	{
		
		for (i=0;i <= 100;i++)
		{
			PWM_SetCompare(i);
			Delay_ms(10);
		}
		for (i=0;i <= 100;i++)
		{
			PWM_SetCompare(100-i);
			Delay_ms(10);
		}
		
	}

2、程序功能解释

2.1、PWM输出流程图

系统时钟频率出来,经过预分频器和自动重装器,可输出固定频率的信号,

设计计数模式,如图中的向上计数模式,从0计数到ARR,再自动重装为0,不断循环。

当经过比较器的时候,比较计数值CNT与CCR的值,选择比较的模式(PWM1和PWM2),如PWM1模式:CNT<CCR,则输出高电平。

如此经过比较器后,就输出高低电平不同宽度的PWM波形了。

2.2、PWM占空比计算

计算PWM占空比的计算方式为:如图为输出50%PWM信号,1KHZ。

2.3、时基单元初始化函数

TIM_TimeBaseInit函数,TIM_TimeBaseInitTypeDef结构体参数有:

TIM_Prescaler,预分频器值,也就是PSC值。

TIM_CounterMode,计数模式,一般为向上计数模式,

TIM_Period,自动重装值,ARR.

TIM_ClockDivision,预分频,多少分频,对72MHZ的频率进行除法,一分频则不变。

TIM_RepetitionCounter,不太理解,给的是0

2.4输出比较初始化函数

 以上函数是用来配置输出比较模块的,每个函数对应一个定时器的通道,配合结构体使用。

TIM_OCInitTypeDef,结构体参数有:

TIM_OCMode:输出比较模式,PWM应用中就PWM1和PWM2两种模式,其他有冻结/有效/无效/反转等用不到的模式。

TIM_OutputState:输出使能

TIM_OutputNState:输出失能

TIM_Pulse:比较器值CCR, 0x0000 and 0xFFFF之间的值。

TIM_OCPolarity:极性,TIM_OCNPolarity_High,TIM_OCNPolarity_Low 

TIM_OCNPolarity:同上

TIM_OCIdleState:未理解,没用到

TIM_OCNIdleState:未理解,没用到

如上面几个在程序中未用到的参数,就可以调用函数TIM_OCStructInit(&TIM_OCInitStructure);,给他们统一赋初始值。

下图为输出比较模式的详解图:

2.5设置CCR值

以上函数是用来更改占空比的,调整CCR的值来改变占空比,

参考:

PWM原理 PWM频率与占空比详解

PWM详解(嵌入式学习)

STM32入门教程-2023版 细致讲解 中文字幕

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

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

相关文章

javase day05笔记

第5天课堂笔记 四舍五入问题&#xff0c;保留两位小数★ System.out.printf("%.2f\n" , d);选择结构★★★ ifif(){}else{}&#xff1a;二选一if(){}else if(){}else if(){} else{} &#xff1a;多重if:多选1 和 equals区别★★★ 基本数据类型&#xff1a;对比值…

STM32F103 CubeMX 使用USB生成鼠标设备

STM32F103 CubeMX 使用USB生成鼠标设备 1 配置cubeMX1.1配置外部晶振&#xff0c;配置debug口1.2 配置USB1.3 配置芯片的时钟1.4 生成工程 2. 编写代码2.1 添加申明2.2 main函数代码 1 配置cubeMX 1.1配置外部晶振&#xff0c;配置debug口 1.2 配置USB 1.3 配置芯片的时钟 需…

【算法与数据结构】深入解析二叉树(二)之堆结构实现

文章目录 &#x1f4dd;二叉树的顺序结构及实现&#x1f320; 二叉树的顺序结构&#x1f320; 堆的实现&#x1f320; 堆的实现&#x1f309;堆向下调整算法&#x1f309;堆的创建&#x1f309;建堆时间复杂度&#x1f309;堆的插入&#x1f309;堆的删除 &#x1f320;堆向上调…

sqllab第十九关通关笔记

知识点&#xff1a; 错误注入 最大长度为32位&#xff1b;如果目标长度>32时&#xff0c;需要利用截取函数进行分段读取referer注入 insert语句update语句 通过admin admin进行登录发现页面打印除了referer字段的信息 这应该是一个referer注入 首先进行测试一下 构造payl…

MATLAB/SIMULINK流水账

01.模块大小的一致性 当模型建完以后&#xff0c;模型大小比较散乱&#xff0c;可以利用该功能快速整理模块的大小 例如&#xff1a;如下5个constant模块&#xff0c;大小不一 若想把所有的模块都调整至跟第3个模块一样的大小 需要先把5个模块全部选取起来&#xff0c;另外再…

开发指南006-后端配置文件

后端配置文件分为两层&#xff0c;一是部署目录中的内容如下&#xff1a; 这里最重要的是端口号&#xff0c;同一个目录下可以是一个jar包多个配置文件&#xff0c;启动批处理中&#xff0c;按一个配置文件启动一个程序的方式启动多个服务。例如上面目录里的启动批处理文件可以…

Observability:使用 Elastic AI Assistant 和 APM 分析 OpenTelemetry 应用程序

作者&#xff1a;来自 Elastic Bahubali Shetti OpenTelemetry 正在迅速成为云原生计算基金会 (CNCF) 内最广泛的项目&#xff0c;拥有与 Kubernetes 一样多的提交&#xff0c;并获得了客户的广泛支持。 许多公司正在采用 OpenTelemetry 并将其集成到他们的应用程序中。 Elasti…

【AI+应用】一步步搭建聊天机器人搭配多种国内外大模型以及api接口调用

如果你看过我之前写的一篇文章 【AI应用】怎么快速制作一个类chatGPT套壳网站&#xff0c; 你可能顺利地使用chatGPT、Gemini&#xff0c; 用得很happy。 突然有一天&#xff0c;你发现一些网站&#xff0c;除了chatGPT、Gemini &#xff0c;还可以切换使用国内外其他的大模型…

“风口”上的量化大厂“绣球”抛向中低频人才

量化人才这几年是人才舞台上的“香饽饽”。 遵循着低频不如高频、小厂不如大厂的薪资逻辑&#xff0c;各路人才被各路机构“哄抢”&#xff0c;薪资一路走高。 但2024年的“信号”再强烈不过——量化大厂们到了改变的时候了。 而量化大厂们显然对此已“心知肚明”....... “…

Vue.js 应用实现监控可观测性最佳实践

前言 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 TinyPro 是一套使用 Vue …

固态存储是未来|浅析SSD架构的演进与创新技术-2

除了性能和容量这两个最大的诉求外&#xff0c;其他的需求已经成为SSD现场架构的核心竞争力。 一是安全性&#xff1a;随着数据安全威胁日益严重&#xff0c;SSD的安全设计成为关键&#xff0c;包括提供单芯片硬件信任根、遵循FIPS140-3安全标准以及支持一次性可编程位字段来锁…

基础:TCP是什么?

1. TCP 是什么&#xff1f; TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff09; 是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC 793 [1]定义。 TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机…

TCP相关特性

协议段格式 • 源/⽬的端⼝号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认号:后⾯详细讲; • 4位TCP报头⻓度:表⽰该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最⼤⻓度是15*460 • 6位标志位: ◦ URG:紧急指针是否有效 ◦ ACK:确认号是否有效…

yocto是个什么东东

yocto不是个什么东东 在我们了解Yocto项目是什么之前&#xff0c;让我们先了解一下它不是什么。 Yocto项目不是用于现有硬件的软件开发工具包&#xff08;SDK&#xff09;&#xff0c;而是用于构建这样一个工具包。 Yocto项目不是可以部署到硬件上的系统二进制镜像&#xff…

软考高级:BPR 和 BPM概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

ubuntu下docker安装

目录 官网链接 安装步骤 docker使用方法 拉取镜像 创建镜像 运行镜像 查看运行结果 保存镜像文件 传输到windows下 官网链接 Install Docker Engine on Ubuntu | Docker Docs 安装步骤 1.运行以下命令卸载所有冲突的包&#xff1a; for pkg in docker.io docker-d…

mysql实战开发之 mysql 删除一张表某个字段的sql语句

有一张表, 我需要删除这张表其中的某一个或者某几个字段, 相信大家在日常开发中应该会遇到这种情况, 然后刚好自己接触的项目安装的mysql关闭了允许远程连接的设置, 也就是说不允许使用类似于navicat 等可视化工具连接, 那么就没办法通过可视化工具直接去通过鼠标操作就可以 完…

Android Studio实现内容丰富的安卓宠物医院管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

详细分析Java中Stream流和for循环的差异之处

目录 前言1. 基本知识2. Demo 前言 事情起因是遍历大数据的时候&#xff0c;数据卡顿很严重 对于Java的基本知识推荐阅读&#xff1a;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; 1. 基本知识 在Java中&#xff0c;Stream API提供…

对模型性能进行评估(Machine Learning 研习十五)

在上一篇我们已然训练了一个用于对数字图像识别的模型&#xff0c;但我们目前还不知道该模型在识别数字图像效率如何&#xff1f;所以&#xff0c;本文将对该模型进行评估。 使用交叉验证衡量准确性 评估模型的一个好方法是使用交叉验证&#xff0c;让我们使用cross_val_score…