当前位置: 首页 > article >正文

STM32 PWM脉冲宽度调制介绍

目录

背景

PWM 模式

影子寄存器和预装载寄存器

PWM对齐模式

PWM 边沿对齐模式

向上计数配置

向下计数的配置

PWM 中央对齐模式

程序

第一步、使能GPIOB组、AFIO、TIM3外设时钟

第二步、输出通道端口配置​编辑

第三步、定时器配置产生频率

第四步、PWM输出配置

第五步、使能预装载寄存器

第六步、使能定时器TIM3

第七步、应用中设置捕获比较寄存器


背景

PWM是单片机的常用功能。比如我可以使用来调节LED的亮度等。通过本篇文章可以了解PWM的工作原理以及STM32如何来控制脉冲的占空比。

PWM 模式

脉冲宽度调制模式可以产生一个由 TIMx_ARR 寄存器确定频率、由 TIMx_CCRx 寄存器确定占空
比的信号。
上图为向上计数且有效电平为低时的图片。什么是向上计数,什么是有效电平可以查看下文
TIMx_CCMRx 寄存器中的 OCxM 位写入 ’110’(PWM 模式 1) ’111’(PWM 模式 2) ,能够独立地设
置每个 OCx 输出通道产生一路 PWM 。必须设置 TIMx_CCMRx 寄存器 OCxPE 位以使能相应的预
装载寄存器,最后还要设置 TIMx_CR1 寄存器的 ARPE 位, ( 在向上计数或中心对称模式中 ) 使能
自动重装载的预装载寄存器。
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问 预装载寄存器
仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计
数之前,必须通过设置 TIMx_EGR寄存器中的UG 位来初始化所有的寄存器
OCx的极性 可以通过软件在 TIMx_CCER 寄存器中的 CCxP 位设置, 它可以设置为高电平有效或
低电平有效 TIMx_CCER 寄存器中的 CCxE 位控制 OCx 输出使能。详见 TIMx_CCERx 寄存器的
描述。
PWM模式(模式1或模式2) 下, TIMx_CNT TIMx_CCRx 始终在进行比较, ( 依据计数器的计数
方向 ) 以确定是否符合 TIMx_CCRx TIMx_CNT 或者 TIMx_CNT TIMx_CCRx 。然而为了与
OCREF_CLR 的功能 ( 在下一个 PWM 周期之前, ETR 信号上的一个外部事件能够清除 OCxREF)
一致, OCxREF 信号只能在下述条件下产生:
● 当比较的结果改变,或
● 当输出比较模式 (TIMx_CCMRx 寄存器中的 OCxM ) 从“冻结” ( 无比较, OCxM=’000’)
换到某个 PWM 模式 (OCxM=’110’ ’111’)
这样在运行中可以通过软件强置 PWM 输出。
根据 TIMx_CR1 寄存器中 CMS 位的状态,定时器能够产生边沿对齐的 PWM 信号或中央对齐的
PWM 信号。

影子寄存器和预装载寄存器

我们查看通用定时器框图可以知道PSC预分频器、自动重装寄存器、捕获比较寄存器都有阴影。
这阴影部分就表示各自的影子寄存器。我们软件可以更改的是各自的预装载寄存器
一个是我们可以写入或读出的寄存器,称为 预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为 影子寄存器。在每一次更新事件(比如说溢出)时才把预装载寄存器的内容传送到影子寄存器。通过准备好预装载寄存器,通过溢出的更新事件,会同时把预装载寄存器的内容搬运到影子寄存器当中( 实现多个寄存器设置的同步)。

PSC预分频器的影子寄存器是默认开启的。在编程时对PSC,ARR,CCR写入值,这些直接写入的我称之为预装载寄存器。影子寄存器和预装载寄存器之间会有某种作用关系,我们称之为预装载功能

预加载不使能 :预装载寄存器与影子寄存器直连,立即更新影子寄存器的值。

预加载使能 :      预装载寄存器在更新事件(计数器溢出,比较输出等事件)产生后再更新影子寄存器保护了原来的计数周期不受影响,在更新事件(UEV)产生后再开始新的计数

PWM对齐模式

PWM 边沿对齐模式

向上计数配置
TIMx_CR1 寄存器中的 DIR 位为低的时候执行向上计数。
下面是一个 PWM 模式 1 的例子。当 TIMx_CNT<TIMx_CCRx PWM 信号参考 OCxREF 为高,否
则为低。如果 TIMx_CCRx 中的比较值大于自动重装载值 (TIMx_ARR) ,则 OCxREF 保持为 ’1’
如果比较值为 0 ,则 OCxREF 保持为 ’0’
向下计数的配置
TIMx_CR1 寄存器的 DIR 位为高时执行向下计数。
PWM 模 式 1 , 当 TIMx_CNT>TIMx_CCRx 时参考信号 OCxREF 为低,否则为高。如果
TIMx_CCRx 中的比较值大于 TIMx_ARR 中的自动重装载值,则 OCxREF 保持为 ’1’ 。该模式下不
能产生 0 %的 PWM 波形。

PWM 中央对齐模式

TIMx_CR1 寄存器中的 CMS 位不为 ’00’ 时,为中央对齐模式 ( 所有其他的配置对 OCxREF/OCx
信号都有相同的作用 ) 。根据不同的 CMS 位设置,比较标志可以在计数器向上计数时被置 ’1’ 、在
计数器向下计数时被置 ’1’ 、或在计数器向上和向下计数时被置 ’1’ TIMx_CR1 寄存器中的计数方
向位 (DIR) 由硬件更新,不要用软件修改它。

程序

void TIM3_PWM_Init(u16 arr,u16 psc){  //TIM3 PWM初始化 arr重装载值 psc预分频系数GPIO_InitTypeDef     GPIO_InitStrue;TIM_OCInitTypeDef     TIM_OCInitStrue;TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟(LED在PB0引脚)RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;     // TIM_CH3GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置//    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射,重映射只用于64、100、144脚单片机//当没有重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PA6,PA7,PB0,PB1//当部分重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PB4,PB5,PB0,PB1 (GPIO_PartialRemap_TIM3)//当完全重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PC6,PC7,PC8,PC9 (GPIO_FullRemap_TIM3) TIM_TimeBaseInitStrue.TIM_Period=arr;    //设置自动重装载值TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //预分频系数TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);        //TIM3初始化设置(设置PWM的周期)TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;        // PWM模式1:CNT < CCR时输出有效电平TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能TIM_OC3Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道3 PWM 模式设置TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器TIM_Cmd(TIM3,ENABLE);        //使能TIM3

本例子时使用PB0作为PWM的输出通道。也就是说TIM3_CH3的默认通道时PB0。

第一步、使能GPIOB组、AFIO、TIM3外设时钟

如果硬件上PB0被用作其他的功能模块使用,可以使用重映像功能。本离职中TIM3_CH3只能时PB0.

但是TIM3_CH2如果PA7被其他功能使用掉的话,可以使用重映像映射到其他的端口。

第二步、输出通道端口配置

重映射用不到!

第三步、定时器配置产生频率

查看RCC配置可以知道PCLK2为72MHZ

因为PCLK1的时钟通过2分频设置为36MHZ,所以到TIM2 3 4的时钟频率时36*2 = 72MHZ

这里面的预分频设置就是截图中的红框。

如果设置为7200-1,说明 计数器的时钟频率为72MHZ/7200 =10000HZ 

TIM_Prescaler为什么要减1‌,主要是因为硬件会自动将设置的值加1,以防止预分频器(PSC)的值为0。在STM32中,预分频器(Prescaler)用于对输入时钟信号进行分频,从而降低定时器计数器的计数频率。预分频器的值(TIM_Prescaler)是一个无符号整数,它决定了输入时钟信号要经过多少次计数才会使定时器计数器加1。具体来说,当定时器的预分频器寄存器(TIMx_PSC)中的值为N时,输入时钟信号要经过N + 1个时钟周期,定时器计数器才会加1。因此,为了得到期望的分频系数,需要将计算得到的理论分频系数减1后再赋值给TIM_Prescaler‌

TIM_Period

TIM_Period的作用和设置方法

TIM_Period为什么要减1‌,主要是因为定时器的计数是从0开始的,当计数达到设定的值时才会产生中断或更新事件。因此,为了确保在计数到最后一个值时产生中断,需要将设定的值减1,这样计数器就可以在达到这个减1后的值时产生中断‌

TIM_Period代表定时器的自动重装载值(Auto-reload value),当定时器的计数值达到这个值时,定时器就会产生一个中断或更新事件。在实际使用中,需要将TIM_Period设置为所需计数值减去1,以确保在达到最大计数值时产生中断‌.

如果我们想要产生定周期为100HZ的PWM,我们可以设置为TIMx预分频后的频率/(TIM_Period设置为所需计数)值 -1(即 10000HZ/(100-1))

第四步、PWM输出配置

要特别注意TIM_OC3Init中的3表示的时TIMx定时器中的Channel3的意思。

第五步、使能预装载寄存器

第六步、使能定时器TIM3

第七步、应用中设置捕获比较寄存器

调节占空比

TIM_SetCompare3(TIM3,4500);        //改变比较值TIM3->CCR2达到调节占空比的效果

TIM_SetCompare3中的3同样表示更改的是TIMx的通道3

相关文章:

STM32 PWM脉冲宽度调制介绍

目录 背景 PWM 模式 影子寄存器和预装载寄存器 PWM对齐模式 PWM 边沿对齐模式 向上计数配置 向下计数的配置 PWM 中央对齐模式 程序 第一步、使能GPIOB组、AFIO、TIM3外设时钟 第二步、输出通道端口配置​编辑 第三步、定时器配置产生频率 第四步、PWM输出配置 第…...

WebGPU顶点插槽(Vertex Buffer Slot)使用指南

本文将通过完整代码示例和逐行注释&#xff0c;详细解释WebGPU中顶点缓冲区的配置方法&#xff0c;特别针对shaderLocation参数与着色器的对应关系进行重点说明。 一、顶点数据定义与缓冲区创建 // 定义顶点数据结构&#xff08;逻辑层&#xff09; // 包含位置(position)、颜…...

JSP(学习自用)

一、本质 JSP解析后就是Servlet类的java代码。 二、jsp内嵌java代码 1、声明脚本 用于声明属性和方法。 <%!//声明脚本//用于声明属性和方法public void test(){}String easyName"张三"; %> 2、运行脚本 相当于在service方法中写代码 <% //运行脚本…...

ZYNQ TCP Server PS端千兆网口速率低问题,要修改BSP中LWIP配置参数

用VITIS教程里面 TCP UDP应用工程例程 打算测试PS端千兆网口速率。ZYNQ核心板用黑金的&#xff0c;外部板子自画的网口电路和其它电路。TCP SERVER时 iperf测试速率 只有60~70Mbit/s&#xff1f;然后用UDP SERVER方式&#xff0c;发现能达到 950Mbit/s&#xff1f;&#xff1f;…...

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

&#x1f393; 毕业设计大揭秘&#xff01;想要源码和文章&#xff1f;快来私信我吧&#xff01; Hey小伙伴们~ &#x1f44b; 毕业季又来啦&#xff01;是不是都在为毕业设计忙得团团转呢&#xff1f;&#x1f914; 别担心&#xff0c;我这里有个小小的福利要分享给你们哦&…...

【计算机网络】数据链路层数据帧(Frame)格式

在计算机网络中&#xff0c;数据帧&#xff08;Frame&#xff09; 是数据链路层的协议数据单元&#xff08;PDU&#xff09;&#xff0c;用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议&#xff08;如以太网、PPP、HDLC 等&#xff09;。以下是常见数据帧格式的…...

机器学习PCA和LDA

主成分分析&#xff08;PCA, Principal Component Analysis&#xff09;和线性判别分析&#xff08;LDA, Linear Discriminant Analysis&#xff09;是两种常用的降维方法&#xff0c;它们虽然都用于数据降维&#xff0c;但核心思想和应用场景不同。 PCA&#xff08;主成分分析…...

C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?

C#: String s new String("Hello")无法编译? C# String类型是literal常量&#xff0c;默认不能用new创建&#xff0c;但可以在unsafe下用char *字符串指针创建。 char* charPtr stackalloc char[2]; charPtr[0] H; charPtr[1] \0; String myString new Strin…...

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用...

nlp|微调大语言模型初探索(1),LLaMA-Factory

前言 微调模型通常比从零开始训练一个模型的技术要求低。公司不需要拥有大量的深度学习专家&#xff0c;利用现有的开源工具和库&#xff08;如Hugging Face的Transformers等&#xff09;&#xff0c;中小型公司可以轻松地使用和微调大型模型&#xff0c;从而快速实现AI能力的集…...

c++TinML转html

cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果&#xff08;部分&#xff09;&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6cf6c3e3c821446a84ae542bcc2652d4.png) 前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…...

Gentleman:优雅的Go语言HTTP客户端工具包

gentlemen介绍&#xff0c;特点等 插件驱动架构&#xff1a;Gentleman的核心特点是其插件系统&#xff0c;允许用户注册和重用各种自定义插件&#xff0c;如重试策略或动态服务器发现&#xff0c;以增强HTTP客户端的功能。 中间件层&#xff1a;项目内置了一个上下文感知的层次…...

JDK1.8新特性面试题

lambda表达式 Lambda表达式极大地简化了匿名内部类的创建&#xff0c;促进了函数式编程风格。开发者可以更简洁地定义只有一行代码的函数对象&#xff0c;并将其作为参数传递给方法或者赋值给变量。 三要素&#xff1a; 形式参数、箭头、代码块 &#xff08;形式参数&#xf…...

Windchill-PDM-设置环境

Web 浏览器和 Java 插件版本 请确保 Windchill PDMLink 支持您使用的 Web 浏览器及 Java 插件的版本。PTC 软件对照表内列出了所支持的浏览器和插件。 软件一览表列出了平台、操作系统以及经认证可以在 Windows 和 UNIX 操作系统上与 此版本一起使用的第三方产品的组合。产品和…...

《蓝耘服务器:领先架构、技术创新与行业应用全景解析》

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680; &#x1f340;欢迎使用&#xff1a;小智初学…...

前端【技术方案】重构项目

1. 明确重构目标 优化性能 减少页面加载时间降低资源占用 提升代码可维护性 更规范的代码风格更清晰的代码结构更明确的模块设计 扩展功能 为项目添加新功能改进现有功能 2. 评估项目现状 审查代码 全面检查现有代码&#xff0c;找出代码中的问题&#xff0c;如代码冗余、耦合…...

C#中反射的原理介绍及常见的应用场景介绍

反射&#xff08;Reflection&#xff09;是C#中的一种机制&#xff0c;允许程序在运行时获取类型信息并动态调用其成员。通过反射&#xff0c;程序可以访问程序集、模块、类型及其成员&#xff08;如方法、属性、字段等&#xff09;&#xff0c;并能在运行时创建对象、调用方法…...

uniapp webview嵌入外部h5网页后的消息通知

最近开发了个oa系统&#xff0c;pc端的表单使用form-create开发&#xff0c;form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。移动端使用uniapp开发&#xff0c;但是因为form-create移动端只支持vant&#xff0c;不支持uniapp。官…...

java听书项目

项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...

iOS 获取设备占用内存

获取应用占用内存 获取应用进程占用内存 - (NSUInteger)memoryUsage {task_vm_info_data_t vmInfo;mach_msg_type_number_t count TASK_VM_INFO_COUNT;kern_return_t result task_info(mach_task_self(), TASK_VM_INFO, (task_info_t)&vmInfo, &count);if (result …...

C#功能测试

List 内部元素为引用 src[0]为"11" List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2", Age 2, Description "2"…...

js第八题

题八&#xff1a;滚动弹幕 要求&#xff1a; 1.页面上漂浮字体大小不一、颜色不一&#xff0c;从左向右滚动的弹幕&#xff1b; 2.底部中间有一个发送功能&#xff0c;可以发送新的弹幕&#xff1b; 3.底部的发送部分可以向下收起和弹出。 html <div id"danmu-con…...

第35次CCF计算机软件能力认证 python 参考代码

题目列表1. 密码2. 字符串变换3. 补丁应用4. 通讯延迟5. 木板切割题目列表 第35次CCF计算机软件能力认证 1. 密码 n = int(input()) for _ in range(n):s =...

2025百度快排技术分析:模拟点击与发包算法的背后原理

一晃做SEO已经15年了&#xff0c;2025年还有人问我如何做百度快速排名&#xff0c;我能给出的答案就是&#xff1a;做好内容的前提下&#xff0c;多刷刷吧&#xff01;百度的SEO排名算法一直是众多SEO从业者研究的重点&#xff0c;模拟算法、点击算法和发包算法是百度快速排名的…...

国产FPGA开发板选择

FPGA开发板是学习和开发FPGA的重要工具&#xff0c;选择合适的开发板对学习效果和开发效率至关重要。随着国产FPGA的发展&#xff0c;淘宝上的许多FPGA开发板店铺也开始进行国产FPGA的设计和销售&#xff0c;本文将对国产FPGA和相关店铺做个简单梳理&#xff0c;帮助有需要使用…...

DeepSeek+即梦 做AI视频

DeepSeek做AI视频 制作流程第一步&#xff1a;DeepSeek 生成视频脚本和分镜 第二步&#xff1a;生成分镜图片绘画提示词第三步&#xff1a;生成分镜图片第四步&#xff1a;使用可灵 AI 工具&#xff0c;将生成的图片转成视频。第五步&#xff1a;剪映成短视频 DeepSeek 真的强&…...

【R语言】聚类分析

聚类分析是一种常用的无监督学习方法&#xff0c;是将所观测的事物或者指标进行分类的一种统计分析方法&#xff0c;其目的是通过辨认在某些特征上相似的事物&#xff0c;并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。 方法优点缺点适用场景K-means计算效率高需…...

LVS相关原理

一、LVS集群的体系结构 1.1 LVS简介 LVS 是 Linux Virtual Server 的简称&#xff0c;也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目&#xff0c;它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux标准内核的一部分&#xff0c;在Linux2…...

linux--关于makefile

makefile文件 可以指定编译顺序&#xff0c;这样方便一个项目的多个文件要编译的挨个操作的麻烦。 makefile文件的命名&#xff1a;makefile 或者 Makefile 必须是这俩&#xff0c;系统才能识别 规则的书写语法如下&#xff1a; 一个makefile内可以有多个规则 目标:依赖a 依…...

从2025年起:数字化建站PHP 8.1应成为建站开发的基准线

在数字化浪潮席卷全球的今天,PHP语言仍然保持着Web开发领域的核心地位。根据W3Techs最新统计,PHP驱动着全球78.9%的已知服务端网站。当时间指向2025年,这个拥有28年历史的编程语言将迎来新的发展里程碑——PHP 8.1版本应成为网站开发的最低基准要求,这不仅是技术迭代的必然…...