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

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

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

相关文章

Java面试第二山!《计算机网络》!

在 Java 面试里&#xff0c;计算机网络知识是高频考点&#xff0c;今天就来盘点那些最容易被问到的计算机网络面试题&#xff0c;帮你轻松应对面试&#xff0c;也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别&#xff1f;在…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线&#xff0c;试用了下阿里云和腾讯云的deepseek服务&#xff0c;在回答经典数学问题9.9和9.11谁大时&#xff0c;发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…

蓝桥杯单片机基础部分——单片机介绍部分

前言 这个部分是额外的&#xff0c;我看我有的学弟学妹基础比较差&#xff0c;对板子上面的模块不太熟悉&#xff0c;这里简单的介绍一下 蓝桥杯单片机 这个就是蓝桥杯单片机的板子&#xff0c;它的主控芯片是&#xff08;IAP15F2K61S2&#xff09;&#xff0c;这里就对他常用…

百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元

在当今数字化时代&#xff0c;搜索引擎作为互联网信息获取的核心工具&#xff0c;正经历着前所未有的变革。据悉&#xff0c;2025年2月16日&#xff0c;百度搜索和文心智能体平台宣布全面接入DeepSeek和文心大模型的最新深度搜索功能&#xff0c;搜索用户可免费使用DeepSeek和文…

redis解决高并发看门狗策略

当一个业务执行时间超过自己设定的锁释放时间&#xff0c;那么会导致有其他线程进入&#xff0c;从而抢到同一个票,所有需要使用看门狗策略&#xff0c;其实就是开一个守护线程&#xff0c;让守护线程去监控key&#xff0c;如果到时间了还未结束&#xff0c;就会将这个key重新s…

【koa】05-koa+mysql实现数据库集成:连接和增删改查

前言 前面我们已经介绍了第二阶段的第1-4点内容&#xff0c;本篇介绍第5点内容&#xff1a;数据库集成&#xff08;koamysql&#xff09; 也是第二阶段内容的完结。 一、学习目标 在koa项目中正常连接数据库&#xff0c;对数据表进行增删改查的操作。 二、操作步骤 本篇文章…

aws(学习笔记第二十八课) aws eks使用练习(hands on)

aws(学习笔记第二十八课) 使用aws eks 学习内容&#xff1a; 什么是aws eksaws eks的hands onaws eks的创建applicationeks和kubernetes简介 1. 使用aws eks 什么是aws eks aws eks的概念 aws eks是kubernetes在aws上包装出来 的新的方式&#xff0c;旨在更加方便结合aws&…

IM聊天系统架构实现

一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制&#xff1b; 1、重连机制&#xff08;服务端下线&#xff09; 服务端下线&#xff0c;客户端netty可以感知到&#xff0c;在感知的方法中进行重连的操作&#xff0c;注意重连可能连接到旧的服务器继续报错&…

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

KubeadmContainerd部署k8s(v1.28.2)集群&#xff08;非高可用版&#xff09; KubeadmContainerd部署k8s高可用版本 文章目录 KubeadmContainerd部署k8s(v1.28.2)集群&#xff08;非高可用版&#xff09;一.环境准备1.服务器准备2.环境配置3.设置主机名4.修改国内镜像源地址5.配…

HarmonyOS进程通信及原理

大家好&#xff0c;我是学徒小z&#xff0c;最近在研究鸿蒙中一些偏底层原理的内容&#xff0c;今天分析进程通信给大家&#xff0c;请用餐&#x1f60a; 文章目录 进程间通信1. 通过公共事件&#xff08;ohos.commonEventManager&#xff09;公共事件的底层原理 2. IPC Kit能…

移动通信发展史

概念解释 第一代网络通信 1G 第二代网络通信 2G 第三代网络通信 3G 第四代网络通信 4G 4g网络有很高的速率和很低的延时——高到500M的上传和1G的下载 日常中的4G只是用到了4G技术 运营商 移动-从民企到国企 联通-南方教育口有人 电信 铁通&#xff1a;成立于 2000 年…

CAS单点登录(第7版)10.多因素身份验证

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 多因素身份验证 概述 多因素身份验证 &#xff08;MFA&#xff09; 多因素身份验证&#xff08;Multifactor Authentication MFA&#xff09;是一种安全机制&#xff0c;要求用户提供两种…

#渗透测试#批量漏洞挖掘#Fastjson 1.2.24 远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Fastjson 1.2.24 远程命令执行漏洞综合分析…

【设计模式】 代理模式(静态代理、动态代理{JDK动态代理、JDK动态代理与CGLIB动态代理的区别})

代理模式 代理模式是一种结构型设计模式&#xff0c;它提供了一种替代访问的方法&#xff0c;即通过代理对象来间接访问目标对象。代理模式可以在不改变原始类代码的情况下&#xff0c;增加额外的功能&#xff0c;如权限控制、日志记录等。 静态代理 静态代理是指创建的或特…

动态规划

简介 动态规划最核心两步&#xff1a; 状态表示&#xff1a;dp[i]代表什么状态转移方程&#xff1a;如何利用已有的dp求解dp[i] 只要这两步搞对了&#xff0c; 就完成了动态规划的%95 剩下的就是细节问题&#xff1a; dp初始化顺序&#xff08;有时是倒序&#xff09;处理边…

【论文笔记】On Generative Agents in Recommendation

论文信息 标题&#xff1a; On Generative Agents in Recommendation 会议&#xff1a; SIGIR 24 —— CCF-A 作者&#xff1a; An Zhang, Yuxin Chen, Leheng Sheng 文章链接&#xff1a; On Generative Agents in Recommendation 代码链接&#xff1a; On Generative Agents…

【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】

需求说明 软件功能需求&#xff1a;反向代理功能&#xff08;描述&#xff1a;apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 业务应用等多个web资…

【深度学习】如何一步步实现SGD随机梯度下降算法

如何一步步实现SGD随机梯度下降算法 文章目录 如何一步步实现SGD随机梯度下降算法SGD随机梯度下降算法的作用MNIST_SAMPLE数据集SGD算法的七大步骤Step1. 初始化模型参数Step2. 计算预测值predictionsStep3. 计算损失lossStep4. 计算梯度gradientsStep5. 更新模型参数Step6. 重…

Flutter 3.29.0 新特性 CupertinoNavigationBar 可配置bottom属性

Flutter 3.29版本优化了开发流程并提升了性能&#xff0c;对 Impeller、Cupertino、DevTools 等进行了更新。 CupertinoNavigationBar和CupertinoSliverNavigationBar现在接受底部小部件&#xff0c;通常是搜索字段或分段控件。 例如本小节内容就是放置了一个输入框&#xff…

Vue 3最新组件解析与实践指南:提升开发效率的利器

目录 引言 一、Vue 3核心组件特性解析 1. Composition API与组件逻辑复用 2. 内置组件与生命周期优化 3. 新一代UI组件库推荐 二、高级组件开发技巧 1. 插件化架构设计 2. 跨层级组件通信 三、性能优化实战 1. 惰性计算与缓存策略 2. 虚拟滚动与列表优化 3. Tree S…