STM32使用PWM实现led亮度变化

news2024/11/18 1:29:51

原理及代码讲解

    • 1.序言
    • 2.频率
    • 3.占空比
    • 4.控制led亮度变化原理
    • 5.代码实例
      • 5.1 初始化引脚
      • 5.2 配置定时器1
      • 5.3配置输出PWM
    • 6.结语

1.序言

这里我以stm32F103c8te为例,讲解一下pwm如何输出,
pwm又是如何控制led灯的亮度变化,以及具体代码又是
如何是实现的。最后结语中也给出了一个小练习。

2.频率

首先我们搞清楚一个概念什么是频率。比如我们stm32F103的系统频率是72M
就是指1秒钟能产生的72M的脉冲(高电平或者低电平)次数。
而对于定时器的时钟频率,就是指定时器1秒钟产生的脉冲(低电平或者高电平)的次数。
所以频率越高,led灯就不容易闪烁(速度够快,肉眼察觉不到,感觉是一直亮着)。

3.占空比

什么是占空比?就是在一个周期内,高电平所占时间的比例。
比如周期是一秒,有600ms是高电平,400ms是低电平。
则占空比是60%(下图),而这个占空比起什么作用呢?
与频率有什么区别?就拿上述占空比举例,
如:高电平电压位3.3V 占空比是60%则平均电压是3.3乘于60%=1.96V。
可以用万用表测量。所以占空比实际上是影响输出电压大小的。
led灯的输入电压变小(电压不足),led灯自然就没那么亮了。
所以就在一定周期内,占空比越大,引脚输出的电压就越大。
图1

4.控制led亮度变化原理

有了上述二个概念,我们就能知道在一定频率下,修改占空比就能实现led亮度变化。

5.代码实例

这里我使用的是stm32F103c8T6定时器1的通道1,输出引脚为PA8。
这里我们用PA8输出PWM波控制led灯亮度变化。
如果是其他开发板,查询相关开发板原理图,找到对应的PWM输出引脚

5.1 初始化引脚

这里我使用的是c8t6的的通道1为PA8引脚。这里配置为复用推挽输出

#define ARR 900-1
#define CCR 300
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  
GPIO_InitTypeDef GPIO_InitStructure;
//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

5.2 配置定时器1

配置为80khz,向上计数。

    // 使能定时器1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
//72M/900=80KHZ,其实就是频率
TIM_TimeBaseStructure.TIM_Period = ARR; //设置为900-1
//设置用来作为TIMx时钟频率除数的预分频值,不分频
TIM_TimeBaseStructure.TIM_Prescaler =psc; 	
//设置时钟分割:不分割
TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
//TIM向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 

5.3配置输出PWM

配置输出占空比为1/3的pwm波

TIM_OCInitTypeDef  TIM_OCInitStructure;
/*选择定时器模式:TIM脉冲宽度调制模式1
PWM1 其实就是计数值小于CCR的值就输出有效电平,
下面第四句话设置了有效电平是高电平
所以小于CCR的值就输出高电平.*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_Pulse = 0; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = CCR;//设置CCR的值为300
//所以占空比为CCR/ARR= 300/900=1/3 电压就是3.3 乘于 1/3=1.1V
    
//根据TIM_OCInitStruct中指定的参数初始化外设TIM1通道1
TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE);  //使能TIM1
//我们可以通过 TIM_SetCompare1(TIM1,CCR);重新设置CCR的大小改变占空比
}

6.结语

我们的功能到这里已经实现了,我们可以在需要修改占空比的地方调用 TIM_SetCompare1(TIM1,CCR)函数
修改占空比,改变led灯亮度。最后你们学会了吗?自己也可以动手做个小实验。
比如使用PWM修改风扇的风速大小。快动手去试一试吧!

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

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

相关文章

53、基于51单片机蓄电池充电器过充过放保护LCD液晶屏显示系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)

方案选择 单片机的选择 方案一:AT89C52是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&…

STL之Stack与queue的模拟实现与duque的底层结构(3千字长文详解)

STL之Stack与queue的模拟实现与duque的底层结构 文章目录 STL之Stack与queue的模拟实现与duque的底层结构设计模式的概念适配器模式 stack的实现queue的实现双端队列——dequedeque的底层结构 设计模式的概念 设计模式像是古代的兵法,是以前的人总结出来的一些在特定…

TClientDataSet 模拟 EXCEL表

日常处理数据时,经常需要,从EXCEL表格中,批量导入数据,通过 XLSReadWriteII编程,会很快导入。 但是,客户提供的EXCEL表的字段,数据格式,字段的排序,有很大的区别。因此&a…

PostmanScript脚本功能使用详解!

目录 前言: 一、Pre-requestScript 二、TestScript 三、随机参数: 前言: Postman 是一个强大的 API 工具,可以用于构建、测试和文档化 Web API。Postman 还提供了一个名为 PostmanScript 的功能,它可以用于自动化…

【5】Midjourney Prompt

Prompt 是Midjourney Bot解释以生成图像的简短文本短语。 Midjourney Bot将Prompt 中的单词和短语分解成为Token的较小部分,可以将其与训练数据进行比较,然后用于生成图像。 精心制作的 Prompt可以帮助生成独特且令人兴奋的图像。 Structure 结构 基本…

Spring Boot + Vue3前后端分离实战wiki知识库系统<八>--分类管理功能开发二

接着上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统<七>--分类管理功能开发的分类功能继续完善。 分类编辑功能优化: 概述: 现在分类编辑时的界面长这样: 很明显目前的父分类的展现形式不太人性&#xf…

【JVM】JVM常用指令

文章目录 1、jps2、jinfo3、jstat4、jstack5、jmap6、jhat 1、jps jps(java process status tool), 用于查看java进程及相关信息,如果你想找到一个java进程的pid,可以使用jps命令代替linux的ps命令。 命令格式&#…

ansible常见模块应用简介

目录 command, shell, raw模块file 模块copy 模块fetch 模块lineinfile模块unarchive解包解压缩 模块user 模块yum_repository 仓库管理yum/dnf模块Service/systemd模块firewalld 模块nmcli 模块get_url 模块mount模块 注意:该文档需要有 Linux 基础的看 command, s…

【架构基础】高内聚低耦合

软件设计目标:实现需求、易于重用、易于理解、没有冗余。 Dont reinvent the wheel, just realign it. --Anthony J D’ Angelo 高内聚低耦合,是软件工程中判断软件设计好坏的标准。主要评判模块或类的内聚性是否高,耦合度是否低。目的是使…

【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

TCP的安全和效率机制

目录 0.TCP协议格式 ​编辑 一.确认应答(安全机制) 二.超时重传(安全机制) 1.SYN丢包 2.ACK丢包 三.连接管理(安全机制) 1.三次握手建立连接 ​编辑 2.四次挥手断开连接 3.建立和断开连接 四.滑动窗口(效率机制) 五.流量控制(效率机制) 六.拥塞控制(安全机制) 七…

算法扩展第一次:收集雪花 【hash表,双指针,stl中的map】

算法详解 这道题需要新学的知识一个是双指针,一个是c库中的unordered_map容器 双指针 双指针原先我写过很多这方面的题,但是这道题我一开始是低估了它的难度,而且压根没有想到要用双指针,属于是长见识了,这道题的双…

Virtual box安装Ubuntu1804乱码

Virtual box安装Ubuntu1804乱码 1. 首先检查编码格式 运行以下命令打开locale配置文件: sudo nano /etc/default/locale2. 可能缺少字体,打开终端,先执行更新 sudo apt-get update 接着进入设置,搜索language,进入…

机器学习-搭建轻量级GPT2训练对话

在自己的机器上部署一个GPT简直太酷啦,因为模型数据缘故,所以这个机器人有时候傻傻的。。。 需要安装环境:python3.7 、Transformers4.2.0、pytorch1.7.0、nginx(映射网页文件) 我的系统:MAC m2 Mac默认是…

Jmeter如何安装jp@gc - Ultimate Thread Group插件(终极线程组)

首先明确一点,我们为什么要做压力测试? 压力测试是为了确保系统能够在负载高峰期和长时间运行的情况下保持高性能、稳定和可靠。同时也是软件开发生命周期中不可或缺的一环,帮助开发人员和系统管理员优化和调整系统,以提供卓越的…

2023春期末考试选择题R2-8计算最小生成树总权重详解

题目如图: 分析和计算: 题目给出一个图的邻接矩阵表示,要求求最小生成树的总开销。 根据Kruskal算法,根据邻接矩阵顶点连接情况,收集开销最小的边,直到所有顶点被收集,且无环路,即…

Debian 12 “bookworm“ 发布 - 通用操作系统

Debian 12 “bookworm” 发布 - 通用操作系统 基于 Linux kernel 6.1 LTS,支持 APFS 读写 请访问原文链接:https://sysin.org/blog/debian-12/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Debian 1…

(数组) 1365. 有多少小于当前数字的数字 ——【Leetcode每日一题】

❓1365. 有多少小于当前数字的数字 难度:简单 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j ! i 且…

希捷科技:具有周期性价值的全球云存储之王

来源:猛兽财经 作者:猛兽财经 总结: (1)根据Statista的数据,希捷科技是全球硬盘驱动器市场的领导者,在全球拥有约43%的市场份额。 (2)希捷科技的管理层近期已经宣布了一…

Node.js模块化学习笔记

Node.js模块化 模块化雨模块 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化。 其中拆分的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 模块化项目 编…