单片机-STM32部分:13、PWM

飞书文档https://x509p6c8to.feishu.cn/wiki/NjhuwbVP7iaEOikVK95cmJNLnWf

PWM(Pulse Width Modulation)脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制电流。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。

PWM频率

是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);

如果频率为1000Hz ,也就是说1秒内来回了1000次,那每次的时间就是1ms,那此信号一个周期就是1ms

占空比:

是一个脉冲周期内,高电平的时间与整个周期时间的比例

调节占空比最终会反映到输出的电流、电压上,或者可以理解为输出的总能量变化,100%占空比时输出100%能量,50%占空比时,只会输出一半的能量,例如50%占空比控制LED会比较暗,控制电机力气会比较小。

STM32内置多个IO输出PWM通道。

STM32F1系列中:
高级定时器:TIM1、TIM8
通用定时器:TIM2、TIM3、TIM4、TIM5
基本定时器:TIM6、TIM7

STM32的每个高级、通用定时器都有独立的通道可以用来作为PWM输出模式。

TIM1_CH是普通通道,可以输出PWM信号或者捕获外部信号。
TIM1_CHN是互补通道,可以输出反相的PWM信号或者捕获反相的外部信号。
 

配置通用定时器TIM3,设置时钟源为内部时钟,这里我们可以看到TIM3定时器有四个通道可以配置

Slave Mode 从模式 Disable 不开启

Trigger Source 触发源 Disable 不开启

Clock Source 时钟源 内部时钟

Channel1 通道1设置为PWM输出

input capture direct mode 输入捕获模式

输入捕获模式可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用来测量输入信号的脉宽、频率和占空比,类似逻辑分析仪的实现。

Output Compare XX 输出比较模式

输出比较模式可以方便的调节每一路PWM波的频率,可以输出四路频率不同,占空比不同的PWM,完全独立。

输出比较模式是通过比较定时器计数器的值和预设的比较值来控制输出信号的状态的。当定时器计数器的值小于比较值时,输出信号为低电平;当定时器计数器的值大于等于比较值时,输出信号为高电平。

PWM Generation XX PWM模式

PWM模式可输出的四路PWM,4个通道的频率是一致的,只有占空比是独立的,可以说PWM模式是输出比较模式的子集。

PWM Generation No Output 如果需要使用定时器事件来触发其他内部逻辑,比如设置标志位或触发中断,但不需要影响到GPIO的电平时使用
PWM Generation CH1 CH1输出
PWM Generation CH1N CH1互补输出
PWM Generation CH1 CH1N CH1输出和互补输出

Forced output 强制输出模式

强制输出模式能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。

配置PWM的具体参数

定时器部分配置在定时器章节已经进行讲解,

Prtscaler (定时器分频系数) : 71

Counter Mode(计数模式):Up(向上计数模式)

Counter Period(自动重装载值) : 499

CKD(时钟分频因子) :No Division (不分频 )

auto-reload-preload(自动重装载) : Enable (使能)

预分频系数为 72-1,自动重装载值为 500-1,定时器溢出频率,即PWM的周期,就是 72MHz/(72)/(500) = 2kHz 这里的72是因为从0开始计算到71,500同理。

下面主要来了解PWM部分配置


 

在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
当CNT小于CCRx时,TIMx_CHx通道输出低电平;
当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。

PWM频率:
Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)
arr 是计数器值
psc 是预分频值
比如:
定时器频率Tclk=72Mhz arr=500-1 psc=72-1 那么PWM频率就是72000000/72/500=2000Hz,即2KHz

占空比:
duty circle = TIMx->CCR1 / arr(单位:%)
CCR1  用户设定值

设置CCR1=250,定时器arr=500,则pwm的占空比为50% 

修改arr、psc可以修改频率
修改CCR1寄存器可以修改占空比

Mode: PWM模式1

有效电平的区别,有效电平的高低可以通过下方的CH Polarity配置
模式1和模式2正好互补,互为相反,在运用起来差别不大,一般使用模式1即可。
PWM模式1-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;
PWM模式2-在向上计数时,一旦TIMx_CNT=TIMx_CCR1时通道1为无效电平,否则为有效电平。

Pulse: 占空比,设置为0,由代码进行配置即可。

Output compare preload: 使能输出比较预装载

输出比较预装载允许你在当前PWM周期结束之前设置新的占空比或比较值,而这个新的值会在下一个周期开始时才生效。这样可以避免在调整PWM信号参数时产生的突变或毛刺,使得PWM输出的变化更为平滑连续。

简单来说,如果enable,任何写入TIMx_CCRx事件到来,都不会打断当前计数周期,只能等到计完数了(更新事件),才把TIMx_CCRx传送至当前计数寄存器。
如果disable,任何写入TIMx_CCRx事件到来,都会打断当前计数周期,TIMx_CCRx的值传送至当前计数寄存器。

Fast Mode: 关闭PWM脉冲快速输出

CH Polarity: 设置有效电平为高或低,我们默认设置为高即可,和前面的PWM模式1共同作用。

下面,我们使用TIM3的CH2验证PWM功能


main.c
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);  //开启PWM输出
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,50);  //设置默认的占空比值PWM占空比修改uint16_t pwm_value =0;   //占空比while (1){/* USER CODE BEGIN 3 */while (pwm_value < 500){pwm_value++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwm_value);    //修改比较值,修改占空比HAL_Delay(1);}while (pwm_value){pwm_value--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, pwm_value);    //修改比较值,修改占空比HAL_Delay(1);}HAL_Delay(200);}/* USER CODE END 3 */PWM频率修改:
定时器频率Tclk=72Mhz arr=500-1 psc=72-1 那么PWM频率就是720000/500/72=2000Hz,即2KHz
在步修改arr的情况下,我们可以通过设置psc的值,以修改最终输出的频率while (1){/* USER CODE BEGIN 3 *///4k__HAL_TIM_SET_PRESCALER(&htim3, 36-1);HAL_Delay(10);//2k__HAL_TIM_SET_PRESCALER(&htim3, 72-1);HAL_Delay(10);}/* USER CODE END 3 */或者修改装载值
__HAL_TIM_SET_AUTORELOAD(&htim3, 500-1);

PWM频率固定2KHz,占空比修改

PWM占空比固定50%,频率修改

2K-4K变换

4K

2K

示例工程参考飞书文档

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

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

相关文章

抽奖系统-奖品-活动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言获取奖品列表前端页面活动创建需求分析活动创建后端实现1-控制层实现及校验活动活动创建后端实现2-保存信息活动插入活动奖品插入 整合活动信息存入redis测试活…

Dense 与 MoE 系列模型架构的全面对比与应用策略

0. 简介 人工智能领域正经历着一场架构革命&#xff0c;从传统的密集连接模型&#xff08;Dense&#xff09;向混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的转变。本文将全面剖析这两种模型架构的本质差异、各自优势与挑战&#xff0c;并提供战略性的选择框…

代码随想录算法训练营第四十天

LeetCode题目: 647. 回文子串516. 最长回文子序列 其他: 今日总结 往期打卡 647. 回文子串 跳转: 647. 回文子串 学习: 代码随想录公开讲解 问题: 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。…

Supabase 的入门详细介绍

Supabase 是什么&#xff1f; 简单来说&#xff0c;Supabase 是一个开源的 Firebase 替代品。它提供了一整套后端即服务 (BaaS - Backend as a Service) 的工具&#xff0c;让你能够快速构建应用程序的后端&#xff0c;而无需自己从头搭建和管理服务器、数据库等基础设施。 S…

【MySQL】mysql/bin目录下程序介绍

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 MySQL在安装完成后&#xff0c;通常会包含以下程序&#xff0c;以Ubuntu上的mysql为例&#xff0c;我们可以查看到 以下是常用的mysql程序 程序名作用…

IDEA+git将分支合并到主分支、IDEA合并分支

文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发&#xff0c;等上线后将代码合并到主分支(master)中&#xff0c;本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明&#xff1a;将dev分支的…

通过Ollama读取模型

通过Ollama读取模型 前言一、查看本地Ollama上有哪些模型二、调用bge-m3模型1、调用模型2、使用bge-m3进行相似度比较 三、调用大模型 前言 手动下载和加载大模型通常需要复杂的环境配置&#xff0c;而使用Ollama可以避免这一问题。本文将介绍如何调用Ollama上的模型。 一、查…

JS 中 Object.keys() 和 Object.values() 的深度解析与应用

文章目录 前言一、Object.keys() 和 Object.values() 基础1. Object.keys()2. Object.values() 二、与 Object.entries() 的对比三、实际应用场景1. 遍历对象属性2. 判断对象是否为空3. 对象与数组的转换4. 动态属性操作5. 过滤对象属性 总结 前言 在 JavaScript 开发中&#…

HCIP(BFD)

一、前言 随着网络应用的广泛部署,网络发生故障极大可能导致业务异常。为了减小链路、设备故障对业 务的影响,提高网络的可靠性,网络设备需要尽快检测到与相邻设备间的通信故障,以便及时采取措施,保证业务正常进行。BFD(Bidirectional Forwarding Detection,双向转发检测)提供…

Webpack其他插件

安装html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…

【Linux网络】网络层

网络层 在复杂的网络环境中确定一个合适的路径 IP 协议 IPV4 点分十进制[0,255].[0,255].[0,255].[0,255]IPV6 IP地址目标网格目标主机 基本概念 主机:配有IP地址,但是不进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 两个问题 路…

跨域的几种方案

因为浏览器出于安全考虑&#xff0c;有同源策略。也就是说&#xff0c;如果协议、域名、端口有一个不同就是跨域&#xff0c;Ajax 请求会失败。 我们可以通过以下几种常用方法解决跨域的问题 JSONP JSONP 的原理很简单&#xff0c;就是利用 <script> 标签没有跨域限制…

基于EFISH-SCB-RK3576/SAIL-RK3576的智能安检机技术方案‌

&#xff08;国产化替代J1900的全场景技术解析&#xff09; 一、硬件架构设计‌ ‌核心处理模块‌ ‌异构计算架构‌&#xff1a; ‌四核Cortex-A72&#xff08;2.3GHz&#xff09;‌&#xff1a;运行X光图像重建算法&#xff08;FDK反投影&#xff09;&#xff0c;支持双能谱…

MQ防重复消费----去重表结合 Spring AOP 切面编程,抽象封装成通用幂等注解

以下内容包含针对 NoMQDuplicateConsumeAspect 的深度面试问答、消息队列重投递触发场景、AOP 切面编程扩展&#xff0c;以及基于已有实现的关键要点与步骤总结。文中所有论断均引用多源资料&#xff0c;以助于您在面试与实战中全面展示对幂等消费切面及消息重投的理解。 一、深…

[:, :, 1]和[:, :, 0] 的区别; `prompt_vector` 和 `embedding_matrix`的作用

prompt_vector = torch.sum(prompt_embedding * attention_weights.unsqueeze(-1), dim=1) # [1, hidden_dim] prompt_vector = torch.sum(prompt_embedding * attention_weights.unsqueeze(-1), dim=1) 主要作用是通过将 prompt_embedding 与 attention_weights 相乘后再按指…

Dinky 安装部署并配置提交 Flink Yarn 任务

官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 &#xff0c;但是官方文档最新稳定版为 1.1 &#xff0c;所以先选择 1.1.0&#xff0c;验证通过后&#xff0c;再尝试 1.2.3 &#xff0c;发现 1…

java连数据库

一、准备工作 ​​安装MySQL数据库​​ 确保已安装MySQL服务器并启动服务 ​​下载JDBC驱动​​ 官方驱动&#xff1a;MySQL Connector/JMaven依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactI…

【生态信息】开源软件全方位解析

开源软件(0pen Source Software&#xff0c;0ss)是指其源代码可以公开发布、查看、使用和修改的软件。这一概念的核心在于开放性和共享性&#xff0c;允许开发者自由地使用、修改、分发以及改进软件。开源软件通常遵循特定的开源许可证&#xff0c;这些许可证确保了软件的自由使…

探秘 DeerFlow:字节跳动开源的科研创作魔法盒!

1.前言 字节跳动于2025年5月9日开源了名为DeerFlow的全新Deep Research项目&#xff0c;该项目基于LangStack框架&#xff0c;旨在通过人工智能技术简化科研和内容创作流程。DeerFlow整合了语言模型、网络搜索、爬虫和Python代码执行等多种工具&#xff0c;支持深度研究、MCP集…

机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值

机器学习第十一讲&#xff1a;标准化 → 把厘米和公斤单位统一成标准值 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 一、买菜…