目录
目录
2.2.3Break And Dead Time management-Output Configuration
2.2.4Output Compare Channel 1 and 1N
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输入捕获的框图
- 滤波器:根据连接到定时器的信号,对所需的输入滤波时间进行编程(如果输入为 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输出比较的时序
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得到,再由设置的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__)