HAL学习笔记 - 7 定时器之高级定时器

16 篇文章 47 订阅
16 篇文章 17 订阅


高级定时器

高级控制定时器和通用定时器在基本定时器的基础上引入了外部引脚,可以输入捕获和输出比较功能。高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,这些功能都是针对工业电机控制方面。本文主要介绍常用的输入捕获和输出比较功能。

一、功能图

在这里插入图片描述

1. 时钟源

前边讲过高级定时器和通用定时器可采用外部时钟源,外部触发输入ETR结构上文讲过了,这次主要将下,外部输入引脚的结构
在这里插入图片描述
当使用外部输入引脚时钟模式时,时钟信号来自于定时器的输入通道,一般有4个,即TIM_CHx。具体使用哪一路信号由TIM_CCMx配置。经过滤波之后,进行边沿检测,决定是上升沿还是下降沿有效。图中第4步选择触发信号,最后将信号连接到TRGI引脚。然后使能计数器开始计数,外部输入引脚模式的时钟源就配置完成了。

2.时基单元

  • 预分频寄存器(TIM_PSC):设置预分频系数,将预分频时钟(CK_PSC)进行1~65536之间任意值分频,得到计数时钟(CK_CNT)
  • 计数器寄存器(TIM_CNT):存放核心计数器运行时的当前计数值,便于用户实时掌握核心计数器的当前计数值。芯片复位后,默认值为0.
  • 自动重载寄存器(TIM_ARR):为计数器设置计数边界或重载值。比如计数器递增计数时,记到多少发生溢出;递减计数时,从多少开始往下计数
  • 重复计数器寄存器(TIM_RCR):在计数器发生溢出时递减,可以控制更新频率。
    可以看到高级定时器与基本定时器和通用计时器的不同在于多了一个重复计数器RCR。RCR为高级定时器独有。前面三个寄存器都是16 位有效,TIMx_RCR 寄存器是8位有效。
    在这里插入图片描述
    前边的1,2,3步骤和基本、通用定时器相同,此处不再赘述。
    在基本/通用定时器发生上/下溢事件时直接就生成更新事件,但对于高级控制定时器却不是这样,高级控制定时器在硬件结构上多出了重复计数器,在定时器发生上溢或下溢事件是递减重复计数器的值,只有当重复计数器为0 时才会生成更新事件。在发生N+1 个上溢或下溢事件(N 为RCR 的值)时产生更新事件。

3.输入捕获/输出比较通道

每个捕获/比较通道均围绕一个捕获/比较寄存器(包括一个影子寄存器)、一个捕获输入阶段(数字滤波、多路复用和预分频器)和一个输出阶段(比较器和输出控制)构建而成。
输入阶段对相应的 TIx 输入进行采样,生成一个滤波后的信号 TIxF。然后,带有极性选择功 能的边沿检测器生成一个信号 (TIxFPx),该信号可用作从模式控制器的触发输入,也可用作 捕获命令。该信号先进行预分频 (ICxPS),而后再进入捕获寄存器。
输出阶段生成一个中间波形作为基准:OCxRef(高电平有效)。链的末端决定最终输出信号的极性。
捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。始终可通过读写操作访问预装载寄存器。
在捕获模式下,捕获实际发生在影子寄存器中,然后将影子寄存器的内容复制到预装载寄存器中。
在比较模式下,预装载寄存器的内容将被复制到影子寄存器中,然后将影子寄存器的内容与计数器进行比较。

4.输入捕获功能

输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽和测量PWM输入信号的频率和占空比这两种。
输入捕获的大概的原理就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我们需要做额外的处理。
在这里插入图片描述
图中以通道1讲解。由通道采集的TI1信号首先经过输入滤波和边沿检测,得到处理过的信号TI1FP1。图示TI1FP1和TI1FP2实际上是同一信号,由于输出方向不同,因此用不同名称区别。
捕获信号IC1有三个选择:

  • 来自捕获通道1的TI1FP1(直接输入方式)
  • 来自捕获通道2的TI2FP1(间接输入方式)
  • 来自从模式管理器的触发信号TRC
    经过预分频器后得到最终捕获信号IC1PS
    以上完成了一次捕获的流程,其他通道也是如此。
输入捕获示意图

在这里插入图片描述
假设上升沿捕获,递增计数模式。第一次捕获时,在中断回调函数中保存Tb时刻的捕获值,在中断处理中定时器保持运行;第二次捕获时,在中断回调函数中保存Td时刻的捕获值。将两次捕获值相减,再乘以计数时间可计算出信号周期。

计算公式

P e r i o d ( s ) = D i f f ∗ ( P S C + 1 ) T I M _ C L K ( H z ) Period(s) =\dfrac{Diff*(PSC+1)}{TIM\_CLK(Hz)} Period(s)=TIM_CLK(Hz)Diff(PSC+1) F r e q ( H z ) = T I M _ C L K D i f f ∗ ( P S C + 1 ) Freq(Hz) =\dfrac{TIM\_CLK}{Diff*(PSC+1)} Freq(Hz)=Diff(PSC+1)TIM_CLK
其中Diff表示捕获差值,当待测信号不大于一个完整计数周期时。假设两次连续的捕获值分别为CCRx_1和CCRx_2,则捕获差值可以按照如下方法计算:

  • 如果CCRx_1 < CCRx_2:捕获值 = CCRx_2 - CCRx_1
  • 如果CCRx_1 > CCRx_2:捕获值 = (ARR + 1 - CCRx_1)+ CCRx_2
    如果待测信号大于定时器的一个完整计数周期,则需要结合定时器的更新中断次数来计算捕获差值。

PWM输入模式

在这里插入图片描述
当使用PWM输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用PWM输入的时候最多只能使用两个输入通道(TIx)。
此模式是输入捕获模式的一个特例。其实现步骤与输入捕获模式基本相同,仅存在以下不同之处:

  • 两个ICx信号被映射至同一个TIx输入
  • 这两个ICx信号在边沿处有效,极性相反
  • 选择两个TIxFP信号之一作为触发输入,对应的为周期。另一路则为占空比。并将从模式控制器配置为复位模式。

如可以通过以下步骤对应用于TI1的PWM的周期和占空比进行测量:

  1. CCR1选择TI1作为有效输入
  2. 选择TI1FP1的有效极性为上升沿
  3. CCR2选择TI1作为有效输入
  4. 选择TI1FP2的有效极性为下降沿
  5. 选择TI1FP1作为有效触发输入,则TI1FP1信号对应的为周期
  6. 将从模式控制器配置为复位模式
  7. 使能捕获
PWM输入模式时序图

在这里插入图片描述
PWM信号由输入通道TI1 进入,配置TI1FP1为触发信号,上升沿捕获。当上升沿的时候IC1 和IC2 同时捕获,计数器CNT 清零,到了下降沿的时候,IC2 捕获,此时计数器CNT 的值被锁存到捕获寄存器CCR2 中,到了下一个上升沿的时候,IC1 捕获,计数器CNT 的值被锁存到捕获寄存器CCR1 中。其中CCR2 测量的是脉宽,CCR1 测量的是周期。
从软件上来说,用PWM输入模式测量脉宽和周期更容易,付出的代价是需要占用两
个捕获寄存器。

5.输出比较功能

输出比较功能用于控制输出波形,定时器通过将预设的比较值与计数器的值做匹配比较,以实现各类输出,如PWM输出,单脉冲输出等。预设的比较值存放在CCR中。
输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道X(x=1,2,3,4)设置为匹配时输出有效电平、将通道X设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1 和PWM2 这八种模式,具体使用哪种模式由寄存器CCMRx 的位OCxM[2:0]配置。其中PWM模式是输出比较中的特例,使用的也最多。
在这里插入图片描述

  1. 比较寄存器:当计数器CNT 的值跟比较寄存器CCR 的值相等的时候,输出参考信号OCxREF 的信号的极性就会改变,其中OCxREF=1(高电平)称之为有效电平,OCxREF=0(低电平)称之为无效电平,并且会产生比较中断CCxI,相应的标志位CCxIF(SR 寄存器中)会置位。然后OCxREF 再经过一系列的控制之后就成为真正的输出信号OCx/OCxN。
  2. 死区发生器
    在生成的参考波形OCxREF的基础上,可以插入死区时间,用于生成两路互补的输出信号OCx 和OCxN,死区时间的大小具体由BDTR 寄存器的位DTG[7:0]配置。死区时间的大小必须根据与输出信号相连接的器件及其特性来调整。
  3. 输出控制
    在这里插入图片描述
    在输出比较的输出控制中,参考信号OCxREF 在经过死区发生器之后会产生两路带死区的互补信号OCx_DT 和OCxN_DT(通道1~3 才有互补信号,通道4 没有,其余跟通道1~3 一样),这两路带死区的互补信号然后就进入输出控制电路,如果没有加入死区控制,那么进入输出控制电路的信号就直接是OCxREF。
    进入输出控制电路的信号会被分成两路,一路是原始信号,一路是被反向的信号,具体的由寄存器CCER 的位CCxP 和CCxNP 控制。经过极性选择的信号是否由OCx 引脚输出到外部引脚CHx/CHxN 则由寄存器CCER 的位CxE/CxNE 配置。
    如果加入了断路(刹车)功能,则断路和死区寄存器BDTR 的MOE、OSSI 和OSSR这三个位会共同影响输出的信号。
    输出比较的输出信号最终是通过定时器的外部IO 来输出的,分别为CH1/2/3/4,其中前面三个通道还有互补的输出通道CH1/2/3N。
    *4. 断路功能
    断路功能就是电机控制的刹车功能,使能断路功能时,根据相关控制位状态修改输出信号电平。在任何情况下,OCx 和OCxN 输出都不能同时为有效电平,这关系到电机控制常用的H 桥电路结构原因。
    断路源可以是时钟故障事件,由内部复位时钟控制器中的时钟安全系统(CSS)生成,也可以是外部断路输入IO,两者是或运算关系。
    系统复位启动都默认关闭断路功能,将断路和死区寄存器(TIMx_BDTR)的BKE 为置1,使能断路功能。可通过TIMx_BDTR 寄存器的BKP 位设置设置断路输入引脚的有效电平,设置为1 时输入BRK 为高电平有效,否则低电平有效。

PWM输出模式

脉冲宽度调制( PWM)是一种对模拟信号电平进行数字编码的方法。广泛应用于电机控制、灯光的亮度调节、功率控制等领域。

占空比计算公式

D u t y = ( T o n P r e i o d ) ∗ 100 % Duty =(\dfrac{Ton}{Preiod})*100\% Duty=(PreiodTon)100%
其中Period为周期表示一个完整PWM波形所持续的时间;Duty为占空比,表示高电平持续时间(Ton)与周期时间(Period)的比值

PWM信号电压调节原理

不同占空比的PWM信号等效于不同的平均电压。平均电压 = 峰值*占空比
在这里插入图片描述
PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器ARR 的值决定,占空比由比较寄存器CCR 的值决定。脉宽调制的实质就是修改高电平的持续时间。

PWM输出的两种模式
  • PWM模式1:递增计数时,当TIMx_CNT(当前计数值) <TIMx_CCR(捕获/比较值)时,通道输出有效电平,否则为无效电平。递减计数时,则刚好相反。
  • PWM模式2:递增计数时,当TIMx_CNT(当前计数值) <TIMx_CCR(捕获/比较值)时,通道输出无效电平,否则为无效电平。递减计数时,则刚好相反。
    即递增计数模式下,高电平有效时,PWM模式1下的CCR用于控制高电平持续时间;PWM模式2下的CCR用于控制低电平持续时间。形成互补输出。
通道结构

每个定时器具备1~4个独立的通道,各个通道具有独立的输入捕获单元、捕获/比较寄存器和输出比较单元,但共享一个时基单元,所有每个通道可以选择作为输入捕获或者输出比较功能,但只能二选一。每个定时器都有对应的GPIO引脚作为通道的输入/输出引脚,具体查阅数据手册。

PWM输出模式工作原理

初始输出高电平,匹配CCR时输出为低,匹配ARR时输出为高;则CCR控制PWM信号的占空比,ARR控制了PWM信号的周期。具体参数计算公式如下:
P e r i o d ( s ) = ( A R R + 1 ) ∗ ( P S C + 1 ) T I M _ C L K ( H z ) Period(s) =\dfrac{(ARR+1)*(PSC+1)}{TIM\_CLK(Hz)} Period(s)=TIM_CLK(Hz)(ARR+1)(PSC+1) D u t y = ( C R R A R R + 1 ) ∗ 100 % Duty =(\dfrac{CRR}{ARR+1})*100\% Duty=(ARR+1CRR)100%
如下例子,假设预分频时钟CK_PSC为100MHz,产生周期为1ms,占空比为47.5%的PWM信号
在这里插入图片描述
周期为1ms,可以设置PSC=99,ARR = 999;根据占空比可算出CRR=475

多通道输出

定时器的每个通道都可以输出PWM信号,对于同一个定时器而言,它的多个通道共享同一个自动重载寄存器,因此可以输出占空比不同,但周期相同的PWM信号。如图所示CH1的占空比为47.5%,CH2的占空比为70%,周期均为1ms。
在这里插入图片描述

二、使用步骤

1.输入捕获模式

1)输入捕获模式的数据类型和接口函数

输入捕获初始化结构体
/**
  * @brief  TIM Input Capture Configuration Structure definition
  */
typedef struct
{
  uint32_t  ICPolarity;  /*设置输入信号的捕获边沿 */

  uint32_t ICSelection;  /*选择输入通道 */

  uint32_t ICPrescaler;  /*设置输入信号的预分频系数,取值为1、2、4、8 */

  uint32_t ICFilter;     /*设置输入信号的滤波器长度,取值范围0x0~0xF */
} TIM_IC_InitTypeDef;
接口函数
/* Timer Input Capture functions **********************************************/
HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim);
/* Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
/* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
//捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
//捕获值读取函数
uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel);

2)示例-信号测量

(1)任务分析

利用定时器 的捕获通道来测量一个外部脉冲信号的周期和频率,外部脉冲信号利用引脚引入。假设CPU最大频率为100MHz。
配置两个定时器,使用通用计时器皆可。一个设置为输入捕获模式,采用上升沿触发。
另一个设置为PWM输出模式,输出一个频率为100KHz,占空比50%的方波
采用前后台编程模式。在输入捕获中断回调函数中,设置测量完成标志,主程序中检测该标志,一旦置位则计算信号的周期和频率,并清除标志位。减少中断打断时间,将计算放入主程序进行。

(2)分配引脚

给两个定时器的通道分别分配一个引脚

(3)配置定时器
  1. 输入捕获定时器时钟源为内部时钟,选择通道1为输入捕获模式,捕获通道为直接输入模式
    时基单元部分预分频系数为0,自动重载值为最大值,这样可以使用最大测量频率范围。
    通道部分采用默认配置,上升沿,直接输入模式,不分频不滤波
    使能定时器全局中断
  2. PWM输出定时器时钟源也为内部时钟,选择通道1为PWM输出
    时基单元部分PSC为99,ARR设为9,则通过定时时间公式得知,PWM信号周期为10us。
    通道部分设置捕获/比较值为5,表示PWM信号占空比为50%。
(4)代码编写
  1. 定义用户变量
uint32_t Diff        = 0;//存放捕获差值
uint8_t  MeasureFlag = 0;//测量完成标志,0表示未完成,1完成
uint8_t  CapIndex    = 0;//捕获指示:0表示没有开始捕获,1表示完成1次捕获
uint32_t CapVal1     = 0;//存放第一次捕获值
uint32_t CapVal2     = 0;//存放第二次捕获值
  1. 初始化代码
    启动两个定时器
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
  1. 应用代码
    在主程序中,首先判断测量完成标志,再根据捕获值大小关系,进入计算差值,再计算信号周期和频率。最后清除测量完成标志,并再次开启输入捕获。由于输入采用不分频不滤波,则直接由差值和内部时钟频率计算即可。
  2. 捕获中断回调函数
    在其中判断定时器句柄实例,进一步判断捕获通道,判断捕获指示,如为0存放第一次捕获值,并修改捕获指示;如为1则存放第二次捕获值,并暂停捕获,重置捕获指示,置位测量完成标志。
    其中用到
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

2.PWM输出模式

1)输出比较模式的数据类型和接口函数

输出比较初始化结构体
/**
  * @brief  TIM Output Compare Configuration Structure definition
  */
typedef struct
{
  uint32_t OCMode;        /*!设置定时器输出比较模式,如PWM1模式 */

  uint32_t Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register.
                               This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

  uint32_t OCPolarity;    /*!< Specifies the output polarity.
                               This parameter can be a value of @ref TIM_Output_Compare_Polarity */

  uint32_t OCNPolarity;   /*!< Specifies the complementary output polarity.
                               This parameter can be a value of @ref TIM_Output_Compare_N_Polarity
                               @note This parameter is valid only for timer instances supporting break feature. */

  uint32_t OCFastMode;    /*!< Specifies the Fast mode state.
                               This parameter can be a value of @ref TIM_Output_Fast_State
                               @note This parameter is valid only in PWM1 and PWM2 mode. */


  uint32_t OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.
                               This parameter can be a value of @ref TIM_Output_Compare_Idle_State
                               @note This parameter is valid only for timer instances supporting break feature. */

  uint32_t OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.
                               This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State
                               @note This parameter is valid only for timer instances supporting break feature. */
} TIM_OC_InitTypeDef;

对于PWM输出模式来讲,只需设置模式,Pulse,OCPolarity,OCFastMode(默认不使能)四个参数,其他默认即可。

接口函数
/* Timer PWM functions ********************************************************/
HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim);
/* Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
/* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
/**
**
  * @brief  Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.
  * @param  __HANDLE__ TIM handle.
  * @param  __CHANNEL__ TIM Channels to be configured.
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
  * @param  __COMPARE__ specifies the Capture Compare register new value.
  * @retval None
  */
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
   ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\
   ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\
   ((__HANDLE__)->Instance->CCR6 = (__COMPARE__)))

2)示例-呼吸灯

(1)任务分析

利用定时器的PWM输出模式来输出一个PWM信号控制LED灯亮灭。周期20ms,占空比从0%开始,步进值为20%,递增到100%后又从0开始,并重复整个过程。假设CPU最大频率为100MHz,占空比修改的时间间隔为100ms.
定义两个变量占空比和步进值来控制占空比。
配置定时器,设置为PWM输出模式,PWM信号周期为20ms,根据公式可以设置PSC为9999,ARR为199。占空比从0开始,则CCR初值为0,主程序循环中调用宏函数__HAL_TIM_SET_COMPARE修改CCR的值,从0开始,根据公式算得20%占空比时,CCR值为40,则步进值为40,100%占空比时,CCR为200,即最大值为200。并重复此过程

(2)分配引脚

配置LED引脚和定时器通道输出引脚。

(3)配置定时器
  1. 输入捕获定时器时钟源为内部时钟,选择通道1为PWM输出模式1
    时基单元部分预分频系数为9999,自动重载值为199,表示PWM信号周期为20ms。
    通道部分Pulse为CCR值,设置为0。其他参数采用默认配置,使用PWM模式1,使能CCR寄存器的预装载功能,关闭快速输出模式,输出有效电平为高电平。
(4)代码编写
  1. 定义用户变量
uint16_t Duty = 0;//占空比
uint16_t Step = 40;//步进值
  1. 初始化代码
    启动定时器通道
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
  1. 应用代码
    在主程序的while循环中写for循环,在for循环中修改占空比,使用HAL_Delay(100)延时100ms。如想双向变换,可再增加一个反向for循环来改变步进值。

总结

至此,将定时器的常用功能学习了一遍,后续在ADC和DAC模块与电机控制时,还需再深入学习定时器的其他高级功能。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用HAL定时器进行按键检测时,可以采用轮询模式或中断模式。在轮询模式下,可以使用HAL_TIM_Base_Start函数启动定时器,然后在while循环中不断检测按键状态。这种方式需要在每次检测按键之间添加适当的延时来进行消抖,以防止误检测。然而,这种方式会长时间占用单片机的CPU资源,效率较低。\[3\] 另一种方式是使用外部中断加定时器的方式实现按键检测。首先,需要设置外部中断触发方式,并计算预分频系数psc和计数值大小arr来确定定时器的时间。然后,在外部中断回调函数中打开定时器,让其开始计数。当定时器溢出时,关闭定时器,并再次检测按键IO口的电平值。这种方式可以消除按键的抖动,并且不会长时间占用CPU资源,提高了处理器的效率。\[1\] 另外,还可以使用状态机加定时器中断的方式检测按键。将状态切换的代码写在定时器中断服务回调函数中,在主函数中判断按键的有效状态,并发送脉冲来获取计数值。这种方式也可以消除按键的抖动,并提高处理器的效率。\[2\] #### 引用[.reference_title] - *1* *3* [STM32 CubeMx HAL库外部中断检测按键,定时器延时消抖](https://blog.csdn.net/DIVIDADA/article/details/128364061)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [HAL学习笔记 - 7 定时器之基本定时器](https://blog.csdn.net/kouqi627/article/details/115353077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值