STM32定时器系列 - STM32定时器输出比较

2023-11-19

STM32 定时器除了基本计数定时功能外,还对外扩展了输入、输出通道,从而可以实现输入捕获、比较输出功能。

比较输出[Compare Output]功能:定时器通过对预设的比较值与定时器的值做匹配比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲模式、强制输出等。一般来说,STM32的通用定时器和高级定时器都具有比较输出功能,不同的定时器可能通道数量上有差异。

或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。因为比较输出的基本特征是计数器CNT的值与比较寄存器CCR的值作比较,计数器数据变化意味着时间流逝,当计数器记到与比较值相等或向匹配时,也就表示相应时间段的过去。

具体应用到STM32定时器,在比较输出模式下,当捕获比较单元监测到计数器CNT的值与CCR寄存器值数字相等时,将根据相应的输出比较输出模式实现相应输出。比较输出功能主要靠捕获比较单元实现,同时定时器输出单元与时基单元协同配合。

捕捉比较单元有个重要的寄存器,捕捉比较寄存器CCR ,它由影子寄存器/预装载寄存器组成。用户访问时,访问预装载寄存器。预装载功能可以开启或关闭。由OCxPE@TIMx_CCMR控制。
需要修改的预装数据立即生效时将预装功能关闭。
需要修改的数据不影响当前周期的计数或波形输出时,我们就打开其预装功能。

比较输出流程:

在这里插入图片描述

捕获/比较通道的输出部分(通道1至3)

在这里插入图片描述
在这里插入图片描述
当定时器的比较输出单元检测到计数器CNT的值与捕获比较寄存器CCR的值发送匹配事件时,定时器的比较输出单元会根据比较输出模式输出相应的信号,该信号我们称之为 中间参考信号,即OCxREF。

该OCxREF源与输出模式控制器,并硬件约定高电平为有效电平 它经过极性选择后,在经过输出控制电路输出到到管脚。当极性选择位 CCxP = 0 时。高电平为OCx的有效输出电平,当CCxP = 1时,低电平作为OCx的有效输出。

也就是说:OCxREF 信号只是一个中间参考信号,并非最终输出信号,最终输出端OCx的 Active state【有效状态】/ inactive state【无效状态】所对应的电平取决于极性选择控制位CCxp/CCxNP。

也就是最终的输出需要由2个信号来控制,一个是 OCxREF中间参考信号,用来确定有效信号和与无效信号,另一个CCxP用来控制,有效信号或者无效信号的高电平和低电平。
在这里插入图片描述
在这里插入图片描述
总结为一张表:

OC1REF CC1P 功能 OC1 描述
0 0 OC1高电平有效 0(低电平) 无效
1 OC1低电平有效 1(高电平) 无效
1 0 OC1高电平有效 1(高电平) 有效
1 OC1低电平有效 0(低电平) 有效

比较输出事件:

  • 当核心计数器的值CNT与比较寄存器CCR 的数值匹配时发生比较输出事件
  • 相应通道的比较输出标志位CCxIF@TIMx_SR被置位
  • 触发比较中断 (如果CCxIE@TIMx_DIER被置位使能)
  • 触发DMA请求 (CCxDE@TIMx_DIER CCDS@TIMx_CR2 使能允许)
  • 比较输出事件也可以软件方式产生。通过操作TIMx_EGR@CCxG位来实现

对于这些比较输出有关的事件,我们需要做到心中有数。因为在我们定时器中,往往需要基于相关事件来开展我们的应用开发。比如基于比较输出事件,做脉冲波形频率或占空比的变更、做脉冲个数的统计、做DMA的请求等等。。

另外,TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx的影子寄存器只能在发生下一次更新事件时被更新)。
下图给出了一个例子。

在这里插入图片描述

输出比较模式预览

在这里插入图片描述
总的来讲,这几个比较输出模式,我们有必要对它们的各自输出特征做基本了解,它是我们做比较输出应用时的基础。比方不同比较输出模式,结合不同的计数模式,相应的输出特征是什么。

边沿对齐PWM输出波形示例【Up Counting + PWM mode1】:

以下以PWM模式1为例。只要 TIMx_CNT < TIMx_CCRx。PWM的参考信号 OCxREF便为高电平,否则为低电平。
如果 TIMx_CCRx中的比较值大于自动重装载值(TIM_ARR中),则OCxREF保持为“1”,如果比较值为“0”,则OCxREF保持为“0”。
在这里插入图片描述

中心对齐PWM输出波形示例【Center aligned Mode + PWM1】

在这里插入图片描述

PWM输出频率计算:

定时器比较输出最常见的应用就是PWM输出,即脉宽调制输出。这里简单介绍下PWM输出波形参数的计算。

以计数器向上计数、PWM1为例:

PWM输出方波信号,信号的频率有TIMx的计数时钟频率和TIMx_ARR这个寄存器决定。输出信号的占空比由TIMx_CRRx寄存器和TIMx_ARR寄存器的值所决定。
占空比 = (TIMx_CRRx / (TIMx_ARR+1))* 100%。
频率 = CK_PSC / ((PSC + 1) * (ARR + 1)。

单脉冲模式

单脉冲模式(OPM)是上述模式的一个特例,在这个模式下,计数器可以在一个激励信号的触发下启动,并且可在一段可编程的延时后产生一个脉宽可编程的脉冲。

可以通过从模式控制器启动计数器。可以在输出比较模式或PWM模式下生成波形,将 TIMx_CR1 寄存器中的 OPM 位置1,既可以选择单脉冲模式。这样发,发生下一次更新事件 UEV时,计数器将自动停止。

只有当比较值与计数器初始值不同时,才能正确产生一个脉冲。启动前(定时器等待触发时),必须如下配置:

  • 递增计数模式下:CNT<CCRxARR(特别注意,0<CCRx)
  • 递减计数模式下:CNT>CCRx
原理:

计数器启动后,在下一个更新事件来临之前的时间段内实现固定个数的脉冲输出。当下一个更新事件来临时计数器停止计数。输出的脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值和计数模式有关。

实现方式

使用OC比较输出或PWM输出模式。

启动

计数器的启动可以通过自身软件使能启动,也可以将定时器配置在触发从模式经过触发启动。

在这里插入图片描述
例如:你需要在从TI2输入脚上检测到一个上升沿开始,延迟tDELAY之后,在OC1上产生一个长度为tPULSE的正脉冲。
假定TI2FP2作为触发1:

  • 置TIMx_CCMR1寄存器中的CC2S=01,把TI2FP2映像到TI2。
  • 置TIMx_CCER寄存器中的CC2P=0,使TI2FP2能够检测上升沿。
  • 置TIMx_SMCR寄存器中的TS=110,TI2FP2作为从模式控制器的触发(TRGI)。
  • 置TIMx_SMCR寄存器中的SMS=110(触发模式),TI2FP2被用来启动计数器。 OPM的波形由写入比较寄存器的数值决定(要考虑时钟频率和计数器预分频器)
  • tDELAY由TIMx_CCR1寄存器中的值定义。
  • tPULSE由自动装载值和比较值之间的差值定义(TIMx_ARR - TIMx_CCR1)。
  • 假定当发生比较匹配时要产生从0到1的波形,当计数器达到预装载值时要产生一个从1到0的波形;首先要置TIMx_CCMR1寄存器的OC1M=111,进入PWM模式2;根据需要有选择地使能预装载寄存器:置TIMx_CCMR1中的OC1PE=1和TIMx_CR1寄存器中的ARPE;然后在TIMx_CCR1寄存器中填写比较值,在TIMx_ARR寄存器中填写自动装载值,设置UG位来产生一个更新事件,然后等待在TI2上的一个外部触发事件。本例中,CC1P=0。

在这个例子中,TIMx_CR1寄存器中的DIR和CMS位应该置低。
因为只需要一个脉冲,所以必须设置TIMx_CR1寄存器中的OPM=1,在下一个更新事件(当计数器从自动装载值翻转到0)时停止计数。

比较输出应用时的几个注意点

  1. 高级定时器相比通用定时器,它增加了主输出使能控制位,【MOE@timx_bdtr】,如果该位置零的话,此时OCx端没有波形输出;

  2. 高级定时器相比通用定时器,它增加了刹车控制机制,BKE@timx_bdtr】,如果使能了刹车控制并触发有效刹车电平,此时OCx端没有波形输出;

  3. 高级定时器相比通用定时器,使用互补输出时增加了死区插入机制,【DTG@timx_bdtr】,若插入的死区时间过大,当超过有效输出电平宽度时,会导致OCx/OCxN一端或两端没有变化的波形输出;

  4. 高级定时器的互补输出在OCxREF出来后、在极性选择之前,二者是互补的,经过极性选择后是否互补取决于两互补通道的极性选择。极性的选择最终由实际驱动电路需求决定的。

  5. 定时器的所有输出通道可以独立自由设置,如禁用/开启、输出模式选择、极性安排等。但高级定时器的做互补输出时,他们共用相同输出模式和CCR值。

  6. 对于通用定时器的Ocx通道,当使能该通道时,Ocx输出=OCxREF+极性;当禁用该通道时,Ocx的输出=0。

  7. 对于高级定时器Ocx/OCxN互补通道,没法同时实现实现有效输出。注意区分有效电平、无效电平与最终输出端的高、低电平。

  8. 对于高级定时器来说,Ocx/OCxN的输出除了跟输出使能位有关外,跟其它多个控制位【MOE/OSSI/OSSR/CCxP/CCxNP】有关。各个系列的STM32参考手册中有个Ocx/OcxN互补通道输出控制表格可以查看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32定时器系列 - STM32定时器输出比较 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • 【深度学习】yolov5 tag7.0 实例分割 从0到1的体会,从模型训练,到量化完成,bug避坑

    这里记录下yolov5 tag7 0的实例分割 因为也用过paddle家族的实例分割 能够训练出来 但是开放restiful api时遇到点小问题 还是yolov爽啊 通过这篇博文 您可以一步步的搭建自己的分割网络 文章目录 前言 一 小试
  • maxwell小白入门

    执行同步binlog数据命令路径 maxwell安装目录下执行启动命令 增量同步命令 bin maxwell config conf meituan 文件目录 具体配置文件名 properties daemon 采集历史数据 bin max
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • @FeignClient注解属性

    FeignClient value run product fallback ProductClientServiceFallBack class FeignClient name runClient url localhost 8001
  • Python安装(MacOS )

    1 打开网址 Welcome to Python org 2 点击下载 downloads 2023年7月3日 最新版本 3 11 4 点击macOS 如图所示 点击会跳转到另一个界面 下滑至末尾 点击即可安装 64位的 3 得到一个pkg
  • GLSL常见函数[转]

    radians x 角度转弧度 degrees x 弧度转角度 sin x 正弦函数 传入值为弧度 三角函数与js相同 有cos余弦函数 tan正切函数 asin反正弦 acos反余弦 atan反正切等 pow x y xy exp x e
  • STM32F429通用定时器(TIM)

    目录 一 通用定时器是什么 1 计数模式 2 工作过程 编辑 3 内部时钟选择 二 通用定时器HAL库函数流程 三 小实验程序要求 四 代码实现 1 TIM h 2 TIM c 3 main c 一 通用定时器是什么 通用定时器包含一个 1
  • nginx 处理header 全攻略

    公司的网站要加入动态加速 一个直接的问题是经过转发 客户端请求的头被改了一部分 remote addr这个被改成了自定义的True Client IP 为了不改动已有的程序 需要在nginx那转发的时候把这个头重新打到Remote Addr
  • 代码随想录算法训练营第二十四天|理论基础 77. 组合

    理论基础 其实在讲解二叉树的时候 就给大家介绍过回溯 这次正式开启回溯算法 大家可以先看视频 对回溯算法有一个整体的了解 题目链接 文章讲解 代码随想录 视频讲解 带你学透回溯算法 理论篇 回溯法精讲 哔哩哔哩 bilibili 77 组合
  • nvm安装(Windows篇)

    nvm node version manager node版本管理工具 通过将多个node 版本安装在指定路径 然后通过 nvm 命令切换时 就会切换我们环境变量中 node 命令指定的实际执行的软件路径 使用场景 比如我们手上同时在做好几
  • 使用python抓包并分析后存入数据库,或直接分析tcpdump和wireshark抓到的包,并存入数据库

    准备工作 抓包首先要用到scapy包 安装scapy包 pip install scapy 在python代码中引用scapy包 from scapy all import 为了省事 直接import 你也可以根据你的需求去导入你想用到的
  • 网络安全之基础名词

    网络安全必备基础名词 1 IP地址 1 1 IP地址是什么 1 2 为什么要用IP地址呢 1 3 IP地址的构成 分类 格式 1 3 1 构成 1 3 2 IP地址的分类和格式 2 域名 2 1 什么是域名 2 2 域名访问实例 2 3 域
  • mysql根据某个字段去重数据,使用any_value函数和group by函数

    mysql根据某个字段去重数据 使用any value函数和group by函数 简单例子 sql分析 解决方式 参考资料 简单例子 sql分析 原sql SELECT rt name procActivityName rt ID proc
  • Zabbix5.0之邮件告警

    前言 依据zabbix5 0监控Nginx服务状态 当出现故障 或者异常关闭时 zabbix第一时间通过邮件通知到相关人员进行处理 以下文档并不讲述zabbix5 0部署 需要部署zabbix5 0的可参考 CentOS7 部署zabbix
  • k8s、docker关联目录占用空间太大

    今天突然磁盘满了 查看了一下 都是k8s docker关联的目录占用太大 var lib docker overlay2和 data registry docker registry v2 blobs sha256 使用第一种方式删除了悬空
  • appimage文件怎么安装_Linux应用安装有福啦!和苹果Mac一样方便的单文件安装

    自从用了苹果macbook 和windows基本上就再见了 苹果系统的稳定性太出色了 使用完合上盖子放十天半个月的没一点问题 一叫就醒 一醒就能接着工作 windows系统不行 要么睡了叫不醒 要么叫醒后电脑突然弹出个错误提示 甚至还可能蓝
  • 按where条件用expdp导出表

    按where条件用expdp导出表 情况1 情况2 其他说明 情况1 emp main表需要根据sendtime字段导出2018年的数据 参数文件emp main par的内容如下 tables emp main dumpfile emp
  • CentOs7.4 搭建 svn HTTP服务器

    一 通过yum安装svn yum y install mod dav svn yum y install subversion 通过如下命令查看svn 的安装位置 rpm ql subversion 二 创建版本目录库 此仅为目录 为后面创
  • 简单LSTM代码讲解

    仅供本人参考 错了概不负责 part1 图源 https www zhihu com question 41949741 answer 309529532 我们在使用tf nn rnn cell BasicLSTMCell时 有一个要自己设
  • STM32定时器系列 - STM32定时器输出比较

    STM32 定时器除了基本计数定时功能外 还对外扩展了输入 输出通道 从而可以实现输入捕获 比较输出功能 比较输出 Compare Output 功能 定时器通过对预设的比较值与定时器的值做匹配比较之后 并依据相应的输出模式从而实现各类输出