STM32F0x高级定时器之PWM模式

2023-11-10

脉冲宽度调制模式允许您生成一个信号,其频率由TIMx_ARR寄存器的值确定,占空比由TIMx_CCRx寄存器的值决定。

通过在TIMx_CCMRx寄存器的OCxM位中写入'110'(PWM mode 1)或'111'(PWM mode 2),可以在每个通道上独立选择PWM模式(每个OCx输出一个PWM)。您必须通过在TIMx_CCMRx寄存器中设置OCxPE位来启用相应的预装载寄存器,并最终通过在TIMx_CR1寄存器中设置ARPE位来启用自动重装载预加载寄存器(在递增计数中心对齐模式下)。

由于只有当更新事件发生时,预加载寄存器才会传输到影子寄存器,因此在启动计数器之前,您必须通过设置TIMx_EGR寄存器中的UG位来初始化所有寄存器。

OCx极性可使用TIMx_CCER寄存器中的CCxP位进行软件编程。它可以被编程为高电平有效或低电平有效。OCx的输出是由CCxECCxNEMOEOSSIOSSR位(TIMx_CCER和TIMx_BDTR寄存器)的组合来使能的。有关更多详细信息,请参阅TIMx_CCER寄存器说明。

在PWM模式(1或2)下,TIMx_CNT 和 TIMx_CCRx 总是进行比较,以确定TIMx_CCRx ≤ TIMx_CNT还是TIMx_CNT ≤ TIMx_CCRx(取决于计数器的计数方向)。

定时器能够根据 TIMx_CR1 寄存器中的CMS位在边缘对齐模式或中心对齐模式下生成PWM。

PWM边缘对齐模式

向上计数配置

当 TIMx_CR1 寄存器的DIR位为低电平时,递增计数有效。参见第225页的递增计数模式。

在以下示例中,我们考虑PWM模式1。只要TIMx_CNT<TIMx_CCRx,PWM参考信号OCxREF就为高,否则它就变低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR中),则OCxREF保持在1。如果比较值为0,则OCxREF保持在0

图72,显示了TIMx_ARR=8示例中的一些边缘对齐PWM的波形。
图72显示了TIMx_ARR=8示例中的一些边缘对齐PWM的波形
这张图中的CCxIF文中没提到,它的含义如下,由于x代表的是通道,以CC1IF(TIM1_SR中)为例:

如果通道CC1配置为输出:
当计数器的值与比较值匹配时,该标志由硬件置位,但中心对齐模式下有一些例外(参见TIMx_CR1寄存器描述中的CMS位)。它由软件清除。

  • 0: 未匹配
  • 1: 计数器TIMx_CNT的内容与TIMx_CCR1寄存器的内容相匹配。当TIMx_CCR1的内容大于TIMx_ARR的内容时CC1IF位在计数器溢出(递增计数和递增/递减计数模式)或下溢(递减计数模式)时变为高电平

如果通道CC1被配置为输入:
该位由硬件在捕获时设置。它可以通过软件或读取TIMx_CCR1寄存器来清零。

  • 0: 没有发生输入捕获
  • 1: TIMx_CCR1寄存器中已捕捉到计数器值(在IC1上检测到与所选极性匹配的边沿)

这里面CCRx=4时容易理解。但这里有个坑,就是CCRx=8时容易被很多程序员误以为输出会为全'1',看图就知道并不是!所以要输出完全100%的占空比,必须是CCRx > TIMx_ARR

还有要注意的是,当CCRx>8CCRx=0时中断产生的时机,表面上看都是在同一处,其实有点微妙。CCRx>8中断触发的时机是溢出时,也就是计数器计数到ARR的时候,在ARR的后面。而CCRx=0的中断触发时机是计数值与CCRx匹配时,也就是计数值为0的前面。(这是我的个人理解哈,不当之处请指出)

向下计数配置

当TIMx_CR1寄存器中的DIR位为高电平时,递减计数有效。参见第229页的递减计数模式。

在PWM模式1下,只要TIMx_CNT > TIMx_CCRx,参考信号OCxREF就为低电平,,否则变为高电平。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重载值,则OCxREF保持为'1'。在此模式下,0% PWM是不可能的。

PWM中心对齐模式

当TIMx_CR1寄存器中的CMS位不等于'00'时,中心对齐模式有效(所有其余配置对OCxRef/OCx信号具有相同的影响)。根据CMS位的配置,当计数器递增计数、递减计数或同时递增和递减计数时,比较标志被置位。TIMx_CR1寄存器中的方向位(DIR)由硬件更新,不得由软件更改。请参阅第231页的中心对齐模式(向上/向下计数)。

图73显示了一个示例中的一些中心对齐PWM波形,其中:

  • TIMx_ARR=8,
  • PWM模式为PWM模式1
  • 当计数器对应于中心对齐模式1(TIMx_CR1寄存器中的CMS=01所选择的)递减计数时,该标志置位。

图73,中心对齐PWM波形(ARR=8)
图73,中心对齐PWM波形(ARR=8)
要理解PWM的中心对齐模式,得先了解定时器的计数模式中的中心对齐模式,看这里(STM32F0x定时器之计数器模式)。

这张图CCRx=4CCRx=7时是容易理解的。剩下的3个存在玄机!!

  • CCRx=8时,有没有发现CMS=10时并不会产生中断,只在下溢时才会产生中断。因为中心对齐模式计数器在计数时分为两个过程,从0升到7为递增计数,从8降至1为递减计数。在递增计数时并没有匹配到比较值8,而在递减计数时匹配到了!这就是关键所在。而且这时CCRx是等于ARR的,不满足在上溢或下溢时自动触发中断的条件。而PWM输出全为1是可以理解的,上升过程都比CCRx小,下降过程 并不比CCRx大,所以全为'1'
  • CCRx>8时,情况不一样了。因为这时CCrx>ARR,中断产生的时机是在上溢或下溢时
    • CMS=10CMS=11时会在上溢时也就是到7的那个地方产生中断,这可以理解。
    • CMS=01时,这里又有一个坑!按照上面寄存器中对CCxIF的描述说是下溢时产生中断,这里千万不要误以为是计数值降到1时产生中断,看图中它是在8的前面产生的中断。这里面容易产生误区,在定时器的计数模式为中心计数时,它下降到1产生下溢事件,是因为这个计数值是与1这个数进行比较的,当小于1时,溢出。但在PWM里面,计数值要与CCRx这个数比较,当它从8开始降的时候,已经发现8<CCRx,认为已经溢出了,所以产生下溢事件!(这是我个人理解)
  • CCRx=0时,不满足CCRx>ARR这个条件,不会在上溢或下溢时产生中断,只能通过匹配产生中断。由于上升阶段能匹配到比较值0,所以 CMS=10CMS=11可以产生中断。但下降只能降到1,匹配不了0,所以CMS=01不能。

使用中心对齐模式的一些提示:

  • 在中心对齐模式下启动时,将使用当前的上下计数配置。这意味着计数器根据写入TIMx_CR1寄存器DIR位的值向上或向下计数。此外,软件不得同时更改DIRCMS位。
  • 在中心对齐模式下运行时,不建议写入计数器,因为这可能会导致意外结果。特别地:
    • 如果在计数器中写入的值大于自动重装载值(TIMx_CNT>TIMx_ARR),则不会更新方向。例如,如果计数器正在向上计数,它将继续向上计数。
    • 如果在计数器中写入0或写入TIMx_ARR值,但未生成更新事件UEV,则方向会更新。
  • 使用中心对齐模式最安全的方法是在启动计数器之前通过软件产生更新(在TIMx_EGR寄存器中设置UG位),而不要在计数器运行时写入计数器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F0x高级定时器之PWM模式 的相关文章

  • JAVA图书管理系统详细代码

    JAVA图书管理系统详细代码 图书管理系统 主函数 图书相关操作 operation包 操作接口 增加图书 借阅图书 删除书籍 显示书籍 退出系统 查找图书 归还书籍 图书及 书架 book包 图书 书架 使用人群 user包 user父类

随机推荐

  • Mac os安装SEAL

    cmake的选项可以参考 https github com microsoft SEAL optional debug and release modes 视频参考 https www youtube com watch v 7vJJMU2
  • Mqtt客户端多种配置可设

    基于QTmqtt客户端多种配置 效果图 主要功能 配置功能 网络检测 调试功能 发布主题 移植本客户端 前提条件 编译前的修改确认 编译 移植mqtt客户端到你的工程 源码方式 库的方式 接口说明 互动实例 最近项目上要用到mqtt 当然了
  • 常见元件、封装、尺寸、表面处理等

    参考 https www bilibili com read cv11024927 from search spm id from 333 337 0 0 参考 https www bilibili com read cv18413169
  • LLVM IR / LLVM指令集入门

    本文基于LLVM 12官方文档的LLVM Language Reference Manual 以学习笔记为主 所以本文会摘录一些常见 常用的指令 对于一些更加深层次的指令属性 特性 待我对LLVM有更深的理解再单独写文章记录 1 LLVM
  • wxWidgets编程指南

    这是关于wxWidgets的C 编程指南 wxWidgets是一个跨平台的GUI开发工具包或开发框架 当然它也可开发非GUI应用程序 学习完本指南 你就会使用wxWidgets编写一些小程序了 目录 目录 wxWidgets简介 wxWid
  • c语言窗口内鼠标位置,Gtk获取窗口内光标

    获取指针绝对坐标和窗口内的相对坐标 方法一 直接调用函数获得 int ax ay absolutely postition int wx wy The absolutely position of the left up corner of
  • React-路由懒加载

    路由的懒加载 将路由组件进行分包 可以提升首页的加载速度 提高用户的转化率 引入 import React lazy Suspense from react import BrowserRouter as Router NavLink Ro
  • dataframe中分行

    dataframe中对某一个cell进行分行 在工作中遇到类似下面的数据 index names 0 延 t诞 t蜒 1 奄 t掩 t淹 t俺 2 彦 t颜 t谚 3 央 t秧 t映 t殃 4 扬 t杨 t汤 t场 t肠 任务 需要对每个c
  • Sql语句整理(一)

    1 WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行 2 GROUP BY 子句用来分组 WHERE 子句的输出 3 HAVING 子句用来从分组的结果中筛选行 对于可以在分组操作之前或之后应用的任何搜索条件 在 WHERE
  • 关于智慧城市的中对智慧的理解

    自2010年IBM提出智慧城市概念以来 国内许多单位 政府 企业 纷纷提出建设 智慧 XX 口号 到底什么才能成为智慧 相比智能 区别在哪 有一类人认为智慧城市是运用信息和通信技术手段感测 分析 整合城市运行核心系统的各项关键信息 从而对包
  • tf.truncated_normal的用法

    tf truncated normal shape mean stddev shape表示生成张量的维度 mean是均值 stddev是标准差 这个函数产生正太分布 均值和标准差自己设定 这是一个截断的产生正太分布的函数 就是说产生正太分布
  • [JavaSE]变量与类型

    来到新的篇章 最近开始从C语言的学习跳转到JAVA了 以后大概都是更新java的篇章 本文章我们讲述java中的变量与类型 目录 1 整型变量 2 长整型变量 3 双精度浮点型变量 4 单精度浮点型变量 5 字符类型变量 6 字节类型变量
  • Python多行注释/取消注释快捷键

    step1 选中需要注释注释的所有代码 step2 按快捷键 系统 快捷键 Mac command Windows Linux Ctrl 取消注释同理 选中所有代码按快捷键 如果选中的代码中有注释有无注释 则会全部当做无注释加上注释
  • 必须要学的SQL Server 的常用语句(满满的干货),拿走不谢~~~

    文章目录 前言 一 基本常用语句 二 连接和分组 三 进阶级语句 函数 1 CASE WHEN 2 DATEDIFF 3 select嵌套 4 CAST 转换类型 5 GETDATE 函数 6 DISTINCT 总结 前言 前几天做项目的时
  • MS COCO数据集介绍

    本文直接从实用型角度介绍下coco数据集 以coco2014为例 下载资源以后 得到以下目录 annotations中存放的是一大堆json文件 注 带person和face的是我自己制作的json文件 截图时懒得删除 可以忽略 想了解如何
  • MPLS防环及IGP与LDP同步,理论+实战,两分钟全部掌握

    一 MPLS环路检测 LSP的防环是通过IGP路由防环的 只有IGP路由表中的下一跳分配的标签才会放入LFIB 只要IGP路由表没有环路 那么LSP也没有环路 LDP环路检测机制 1 距离向量法 标签绑定报文中记录路径信息 既标签交换路由器
  • 【Linux之Shell脚本实战】监控系统的磁盘空间使用率

    Linux之Shell脚本实战 监控系统的磁盘空间使用率 一 脚本要求 二 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 三 编写disk sh脚本 1 创建脚本目录 2 编写disk sh脚本 3 执行测试脚本 四 查看脚本执
  • redis哨兵模式及主从配置

    例 现有3台服务器 需要配置1主1从3哨兵 服务器1 103 162 37 166 主 redis6380 哨兵1 sentinel26380 服务器2 103 162 37 167 从 redis6380 哨兵2 sentinel2638
  • 03-用Jupyter编写数学公式

    用jupyter编写数学公式 Contents 1 两种数学模式 2 空格 3 上标和下标 4 命令 5 符号 6 头标 7 括号 8 字体及其选项 9 转义字符 10 等式对齐 11 分段函数 12 一点总结 13 附录1 数学符号表 1
  • STM32F0x高级定时器之PWM模式

    脉冲宽度调制模式允许您生成一个信号 其频率由TIMx ARR寄存器的值确定 占空比由TIMx CCRx寄存器的值决定 通过在TIMx CCMRx寄存器的OCxM位中写入 110 PWM mode 1 或 111 PWM mode 2 可以在