Cubmx+定时器(输入捕获、输出比较(刹车和死区))+HAL库学习2

目录

目录

1.输入捕获

1.1基础理论

1.1.1输入捕获的简介

1.1.2输入捕获的框图

1.1.3输入模式时序图

1.2cubmx和hal库

1.2.1cubmx配置

1.2.2HAL库函数

1.2.3HAL库输入捕获的API宏

2.输出比较

2.1基础理论

2.1.1.输出比较简介

2.1.2输出比较框图

2.1.3输出比较的时序

2.2cubmx参数配置

2.2.1Counter mode

2.2.2BAK Configuration

2.2.3Break And Dead Time management-Output Configuration

2.2.4Output Compare Channel 1 and 1N

2.3HAL库

2.3.1HAL库功能函数

2.3.2HAL库的API宏定义

1.输入捕获

1.1基础理论

1.1.1输入捕获的简介

  • 就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式, 图中 t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。
  • 在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图15.1.1所示, t1~t2之间,CNT计数的次数等于N*ARR+CCRx2
    有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1 的时间长度,即高电平持续时间。 
  • STM32F4的输入捕获, 简单的说就是通过检测TIMx_CHx 上的边沿信号,在边沿信号发生变(比如上升沿 /下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获
  • 输入捕获模式也可以选择从模式(复位、门控和触发)。
1.1.2输入捕获的框图

以下示例说明了如何在TI1输入出现上升沿时将计数器的值捕获到TIMx_CCR1中。具体操作步骤如下:
  • 滤波器:根据连接到定时器的信号,对所需的输入滤波时间进行编程(如果输入为 TIx 输入,则对 TIMx_CCMRx寄存器中的ICxF位进行编程)。假设信号边沿变化时,输入信号最多在5个内部时钟周期内发生抖动。因此,我们必须将滤波时间设置为大于5个内部时钟周期。在检测到8个具有新电平的连续采样(以 fDTS 频率采样)后,可以确认TI1上的跳变沿。然后向TIMx_CCMR1寄存器中的 IC1F 位写入 0011。
  • 边沿检测 通过在 TIMx_CCER 寄存器中将 CC1P 位和 CC1NP 位写入 0,选择 TI1 上的有效转换边沿(本例中为上升沿)
  • 预分频器分频对输入预分频器进行编程。在本例中,我们希望每次有效转换时都执行捕获操作,因此需要禁止预分频器(向 TIMx_CCMR1 寄存器中的 IC1PS 位写入“00”)
  • CCR1的计数器存储通过将TIMx_CCER寄存器中的CC1E位置1,允许将计数器的值捕获到捕获寄存器中。 如果需要,可通过将 TIMx_DIER寄存器中的CC1IE位置 1来使能相关中断请求,并且/或者通过将该寄存器中的 CC1DE 位置 1 来使能 DMA 请求
  • 选择有效输入 TIMx_CCR1必须连接到TI1 输入 因此向TIMx_CCMR1寄存器中CC1S位写入01。只要CC1S 不等于 00,就会将通道配置为输入模式,并且TIMx_CCR1 寄 存器将处于只读状态
1.1.3输入模式时序图

1.2cubmx和hal库

1.2.1cubmx配置

  • 该里面的参数已经在前面介绍了,这里不多讲了。
1.2.2HAL库函数

(1)读取选定通道输入捕获值

uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel)
TIM_HandleTypeDef: 定时器控制结构体
Channel (选定的通道) :TIM_CHANNEL_1、TIM_CHANNEL_2、TIM_CHANNEL_3 和TIM_CHANNEL_4
返回值:选定通道的捕获值
(2)输入捕获中断回调 +DMA输入捕获完成中断回调
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim),当捕获计数器到寄存器时将会调用该函数
(3)DMA输入捕获半完成中断回调
void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim)
(4)开启输入捕获功能(轮询方式)
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
(5)关闭输入捕获模式 (轮询方式)
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
(6)开启输入捕获功能 (中断方式)
HAL_StatusTypeDef HAL_TIM_IC_Start_IT (TIM_HandleTypeDef *htim, uint32_t Channel)
(7)关闭输入捕获功能(中断方式)
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT (TIM_HandleTypeDef *htim, uint32_t Channel)
(8)开启输入捕获功能 (DMA方式)
HAL_StatusTypeDef HAL_TIM_IC_Start_DMA (TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)
(9)关闭输入捕获功能(DMA方式)
HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA (TIM_HandleTypeDef *htim, uint32_t Channel)
1.2.3HAL库输入捕获的API宏

通道宏定义:

TIM_CHANNEL_1、TIM_CHANNEL_2、TIM_CHANNEL_3和TIM_CHANNEL_4

分频器宏定义:

TIM_ICPSC_DIV1、TIM_ICPSC_DIV2、TIM_ICPSC_DIV4、TIM_ICPSC_DIV8
  • 设置CCER寄存器中选定通道输入捕获极性

_HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)
_HANDLE__:TIM_HandleTypeDef 定时器总控结构体
_CHANNEL__:决定 哪个通道,通道1/2/3/4
_POLARITY__:设置极性,设置上升沿、下降沿和双边沿
  • 清除CR1寄存器中URS位

_HAL_TIM_URS_DISABLE(__HANDLE__)
_HANDLE_:TIM_HandleTypeDef 定时器总控结构体
  • 置位CR1寄存器中URS位
_HAL_TIM_URS_ENABLE(__HANDLE__)
_HANDLE_:TIM_HandleTypeDef 定时器总控结构体
  •  获取CCRx寄存器值

​​​​​_HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__)

_HANDLE_:TIM_HandleTypeDef 定时器总控结构体
_CHANNEL__:通道数
返回值:CCRx寄存器的值(0x0000 ~ 0xFFFF)
  • 设置CCRx寄存器值  
_HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
_HANDLE_:TIM_HandleTypeDef 定时器总控结构体
_CHANNEL_: 哪个通道
_COMPARE__:写入 CCRx寄存器的值(0x0000 ~ 0xFFFF)
  • 设置CCMRx寄存器中输入捕获分频值 

 

_HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__)
_HANDLE_:TIM_HandleTypeDef 定时器总控结构体
_CHANNEL_: 哪个通道
_ICPSC__:分频器

2.输出比较

2.1基础理论

2.1.1.输出比较简介

  • 输出比较模式下翻转功能作用是: 当计数器的值等于捕获/比较寄存器影子寄存器的值时, OC1REF发生翻转,进而控制通道输出(OCx)翻转 。通过翻转功能实现输出PWM的具体原理如下:PWM频率由自动重载寄存器(TIMx_ARR)的值决定,在这个过程中,只要自动重载寄存器的值不变,那么PWM占空比就固定为 50%。我们可以通过捕获/比较寄存器(TIMx_CCRx) 的值改变PWM的相位。
  • 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平 (OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。
  • 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。
  • 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。
  • 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位
  • 选择DMA请求功能),则产生一个DMA请求。 TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。 在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。
2.1.2输出比较框图

  • BRK

    • BRK上的输入信号为BKIN引脚上输入信号。所用比较器(4或7)输出的逻辑或。

    • 禁止PWM信号或者设置为预定义安全状态。

    • 极性选择和滤波特性可用。

  • BRK ACTH

    • 它可连至比较器(1、2、3、5、6)输出、

    • CSS、PVD输出、SRAM奇偶校验错误。

    • 极性选择和滤波特性不可用。它始终为高电平有效。

  • BRK2

    • 的输入信号为BKIN2引脚上输入信号和所选比较器输出(C0MP1、2、3、4、5、6、7)的逻辑或

    • 极性选择和滤波特性可用。

    • 禁止PWM信号

2.1.3输出比较的时序

输出比较模式的配置步骤:
1. 选择计数器时钟(内部,外部,预分频器)。
2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中。
3. 如果要产生一个中断请求,设置CCxIE位。
4. 选择输出模式,例如: 要求计数器与CCRx匹配时翻转OCx的输出引脚,设置OCxM=011置OCxPE = 0禁用预装载寄存器 置CCxP = 0选择极性为高电平有效置CCxE = 1使能输出
5. 设置TIMx_CR1寄存器的CEN位启动计数器TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx的影子寄存器只能在发生下一次更新事件时被更新

2.2cubmx参数配置

2.2.1Counter mode

 

  • 中心对齐模式分为1/2/3,三个模式分别对应向下计数标志位置1、向上计数标志位置1和向上向下计数标志位都被置1。
2.2.2BAK Configuration

  • 刹车就是关闭输出,当输入的电平为刹车的电平时,PWM就停止输出

  • BRK Polarity是选择BRK的刹车有效电平,也就是选择BKIN管脚作为刹车输入的有效电平。BRK Polarity为High时,BKIN管脚收到上升沿电平后会停止输出PWM波信号;BRK Polarity为Low时,BKIN管脚收到下降沿电平后会输出PWM波信号

  • 刹车输入开关(Active-Break-Input)使能后, BKIN管脚就被征用了,不管后面设置是否使能BRK刹车输入

2.2.3Break And Dead Time management-Output Configuration

  • Automatic Output State:该功能主要是MOE和AOE位,当该参数为enable时,此时如果刹车发生此时输出通道输出空闲电平,当刹车取消时,输出通道重新恢复PWM输出。当该参数为disable时,此时如果刹车发生此时输出通道输出空闲电平,当刹车取消时,输出通道还是输出空闲电平
  • OSSR不使能,当互补输出正反两路的一路使能输出而另一路没有使能输出,没有使能输出的一路则输出半关闭高阻态,可以使用内部上下拉控制管脚状态。OSSR使能,当互补输出正反两路的一路使能输出而另一路没有使能输出,没有输出的一路则输出全关闭高阻态,内部上下拉无效

  • OSSI使能后,用于设定刹车后的管脚状态输出。OSSI不使能,刹车后的管脚输出半高阻态,(注意:该两个参数要配置多个寄存器位来使用并且如果使用ST的HAL需要改变HAL库的属性

  • LOCK:配置该参数的level为1/2/3,不同的level对寄存器的保护作用强度不同。表示改寄存器不能在程序中更改。

  • Dead Time:设置改参数注意十进制和十六进制转换为二进制,再经过中文参考手册的寄存器说明来设置。先通过时钟分频CKD得到t_{DTS},再由设置的Dead Time的参数得到最终的死区时间。下图是正点原子的死区设置(非常完美)

2.2.4Output Compare Channel 1 and 1N

  • 冻结模式(Frozen):输出的GPIO口不会比较输出结果,依旧维持原本的输出状态

  • 强制有效模式(Forced Active):输出的GPIO口不会比较输出结果,强制输出通道为有效电平

  • 强制无效模式(Forced Inactive):输出的GPIO口不会比较输出结果,强制输出通道为无效电平

  • 匹配时有效模式(Active Level on match):当计数器值和比较寄存器值相等时,输出有效电平

  • 匹配时无效模式(Inactive Level on match):当计数器值和比较寄存器值相等时,输出无效电平

  • 匹配时翻转电平(Toggle on match):当计数器和寄存器值相等相等时,将翻转当前的电平,即有效变无效,无效变有效。

  • Pulse:即CRR比较器的值

  • Output compare preload:预装载寄存器CRR。当选择enable时写入CRR的值只保存在预装载寄存器的值而没有保存在载影子寄存器CRR中。在下一次到达CNT=CRR后再被写入

  • CH Polarity和CHN Polarity:当选择互补通道时,通道1已经反相无需再设置高和低

  • CH Idle State和CHN Idle State:当刹车时,该参数就是刹车时的输出电平。

2.3HAL库

2.3.1HAL库功能函数

(1)刹车中断回调

void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); 该函数即当发生刹车时,将会调用该函数
(2)输出匹配中断回调(DMA方式不用这个)
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); 该函数即为当发生CNT=CRR比较时,将会调用该函数
2.3.2HAL库的API宏定义
(1)关闭CCMRx寄存器中输出比较预装载使能
_HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__)
(2)开启CCMRx寄存器中输出比较预装载使能
_HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__)
(3)获取CR1寄存器时钟分频因子
_HAL_TIM_GET_CLOCKDIVISION(__HANDLE__)
(4)设置CR1寄存器时钟分频因子
_HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值