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

2024-03-25 01:12

本文主要是介绍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与呼吸灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843407

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q