STM32 TIM1高级定时器RCR重复计数器的理解

TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1TIM8,下面看标准外设库的TIM结构体的封装;

typedef struct
{
uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock.
This parameter can be a number between 0x0000 and 0xFFFF */ uint16_t TIM_CounterMode; /*!< Specifies the counter mode.
This parameter can be a value of @ref TIM_Counter_Mode */ uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */ uint16_t TIM_ClockDivision; /*!< Specifies the clock division.
This parameter can be a value of @ref TIM_Clock_Division_CKD */ uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;

可以看到uint8_t TIM_RepetitionCounter将暂存RCR寄存器的值,从后面注释可以得知;

RCR寄存器中的值会递减到0,在允许更新事件UEV发生的情况下,则TIM的更新事件UEV就会产生;

如果设置RCR的值为N,那么PWM模式下,更新事件将会在弟N+1个周期发生;

下面根据PWM模式加以区分;

  • 边沿模式edge-aligned mode,延迟PWM周期数量和N相同;
  • 中央对齐模式center-aligned mode,延迟PWM周期数量等于N2\cfrac{N}{2}2N​;

更新事件UEV会在当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时产生

下面看STM32参考手册中的一张图;



从图中不难发现;

中央对齐模式下:

  • RCR = 0,更新事件没有延迟;
  • RCR = 1,更新事件延后了半个PWM周期;
  • RCR = 2, 更新事件延后了一个PWM周期;
  • RCR = 3,更新事件延后了cfrac32cfrac{3}{2}cfrac32个PWM周期;

    因此,中央对齐模式center-aligned mode,更新事件延迟的PWM周期数量等于RCR2\cfrac{RCR}{2}2RCR​;

RCR 寄存器的范围是 0~0xFF;

边沿对齐模式下:

  • RCR = 0,更新事件没有延迟;
  • RCR = 1,更新事件延后了一个PWM周期;
  • RCR = 2, 更新事件延后了两个PWM周期;
  • RCR = 3,更新事件延后了三个PWM周期;

    因此,边沿对齐模式延迟的PWM周期数量等于RCRRCRRCR;

这么一来,TIM中的UEV的使用就变得非常灵活。

实际的应用中,对于STM32芯片的ADC的转换启动,一般分为软件启动或外部触发事件启动。其中外部触发事件启动,可以是定时器触发事件或EXTI引脚信号。在很多应用场合,比如电机、电源、变频器等应用中,ADC的采样点可能会有很严格的时间要求,如果采样点选择错误,可能会给整个控制系统造成严重不良后果。这里针对STM32的定时器周期性地触发ADC采样的实现方式做个简要介绍。

这里以STM32F1的TIMER1 触发ADC注入通道的转换为例【当然,规则通道也可以使用定时器触发】。我们可以利用定时器更新事件或比较输出信号作为ADC的触发使能信号。根据STM32F1参考手册查表得知,可以使用TIM1的TRGO事件或通道CH4的捕捉事件来触发注入通道的ADC转换。

1、使用TIM1 TRGO来触发ADC

// 选择Tim1更新事件作为TRGO

TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);

//设定T1_TRGO作为ADC触发源

ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;

特别提醒:经常有人忘记配置上面红色语句,那就相当于使用了默认的TRGO信号。但对于一个定时器来讲,可以作为TRGO的信号很多,有时默认的并非你要的信号。

2、利用TIM1 CH4的比较事件来触发ADC

这里就是选择OC4REF信号作为TRGO输出来触发ADC.

// 选择OC4REF作为TRGO;

TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC4Ref);

//设定T1_TRGO作为ADC触发源

ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;

相比上面第一种方法,ADC采样时间点更为灵活可调,不仅仅局限于定时器的更新事件。

            图一:间隔触发ADC采样点

有时候,我们可能需要多个周期才需进行一次AD触发采样及相关计算。如果时间是基于更新时刻又是定时周期的倍数,较为方便的办法就是使用定时器里的重复计数器,使用更新事件作为TRGO。软件设置就是在上面第一种方法的基础上增加一句对重复计数器TIMx_RCR的设置。图一的蓝色箭头即为此种情况的触发点设定。基本配置如下:

//配置重复计数器为2次

TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;

// 选择Tim1更新事件作为TRGO

TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);

//设定T1_TRGO作为ADC触发源

ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;

如果要实现跨周期非更新时间点采样和计算,即上图中绿色箭头所指的情形。我们可以考虑使用多次采样配合中断进行计数的方式或者引入其它定时器进行分频后来灵活处理。

STM32 TIM1高级定时器RCR重复计数器的理解的更多相关文章

  1. STM32 TIM1高级定时器配置快速入门

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 重点内容 时基单元 计 ...

  2. STM32 TIM高级定时器死区时间的计算

    STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...

  3. 高级定时器TIM1&TIM8

                                               高级定时器 初识stm32高级定时器:      (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...

  4. Stm32高级定时器(四)

    Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...

  5. Stm32高级定时器(三)

    Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...

  6. Stm32高级定时器(一)

    Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...

  7. Stm32高级定时器(二)

    Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...

  8. stm32高级定时器的应用——spwm

    用过stm32定时器的朋友都知道,定时器的CCR寄存器,可以用来配置PWM的输出,但同样也可以用来配置spwm.废话不多说,直接上代码. 首先,你得考虑一下几个因素: 1.同步调制还是异步调制.  2 ...

  9. Stm32高级定时器(转自:luowei_memory)

    1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波形 增量正交编码器驱动电机获 ...

随机推荐

  1. Sprint 2 : ios图形界面设计与代码整合

    这周我们主要focus在personal photo experience 项目的ios图形界面设计与代码整合工作上. 工作进度: 1. 图形界面设计方面:兆阳和敏龙基本已经将ios手机客户端的雏形界 ...

  2. docker环境常用命令

    Ubuntu 安装docker及docker-compose 安装: apt-get install docker apt-get install docker-compose 启动docker环境: ...

  3. asp.net core identity学习1

    ASP.NET Identity 学习 创建一个Asp.net core mvc项目 添加Nuget包: Microsoft.EntityFrameworkCore.SqlServer 3.1.3 M ...

  4. C# WCF 之优势及特性

    Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...

  5. LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  6. 学习web前端的免费12个学习网站,等你来撩

    我相信很多人刚喜欢web前端或者刚刚接触web前端的时候,都不愿意去花钱去培训或者买资料去学习,因为不知道自己会不会学好,或者只是一时脑热,所以就选择免费的去学习基础.编程学习 很多人包括一些企业家, ...

  7. vector做形参时的三种传参方式

    vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...

  8. Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!

    目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...

  9. tp5中“前置操作”和“钩子函数”的区别

    1.实行顺序: 以下都是标为删除前的操作: 点击删除  ->  前置操作  ->  删除方法(用模型删除)  ->  触发钩子函数(删除)  ->  删除成功 2.传入的参数: ...

  10. Linux 设置秘钥登录(SSH免密连接)

    Secure Shell 协议,简称 SSH,是一种加密网络协议,用于客户端和主机之间的安全连接,并支持各种身份验证机制,目前最实用的身份验证机制就是基于密码的身份验证和基于公钥的身份验证两种.Lin ...