1.TIM输入捕获简介
- 当检测到电平跳变时,CNT的值将被锁存到CCR寄存器(捕获/比较寄存器)
- PWMI模式专门用来测PWm的占空比和频率
频率测量
(需要注意stm32测频率也只能测量数字信号,如果要测量一个正弦波,还需要搭建一个数字预处理电路)
-
测频法和测周法的原理(PWM频率=CK_PSC / (PSC + 1) / (ARR + 1))
-
测频法:定义一个T,如1s,在1s的时间内,有多少个周期,就是多少HZ 公式:fx=N/T
-
测周法:周期的倒数就是频率,测出一个周期的时间,再取倒数,就是频率(测量时间的方法:定时器计次,使用一个已知频率fc的计次时钟,来驱动计数器,从一个上升沿开始计,计数器从0开始,一直计到下一个上升沿,停止,计一个数的时间是1/fc,计N个数,时间就是N/fc,N/fc就是周期,再取一个倒数,就得到公式fx=fc/N)
-
-
中界频率:测频率法的N=测周法的N,两者误差相等
如何在不同情况下正确选择测频法和测周法呢?所以 多高算高频,多低算低频 ,我们有以下一个参数来考量:中界频率,测频法和测周法误差相等的频率点。由于两种方法的误差都与N的正负1误差有关,所以当两种方法计次的N相同时,两种方法的误差也就相同。
T 是测频法的闸门时间,f c是测频法的标准频率。
-
测频法和测周法的区别
-
测频法适合高频信号(因为若N很小,误差会很大)。在闸门时间内,尽量多出现一些上升沿,有助于减小误差。测频法,数据更新慢,比较稳定。
-
测周法适合测量低频信号(周期比较长,计次就会比较多,有助于减少误差),测一个周期就能出现结果,而一般待测信号频率都比较大,故结果更新较快
-
2.输入捕获电路
-
异或门的逻辑:当输入引脚任何一个有电平跳变时,输出引脚就是产生一次电平反转(本质上是为了三项无刷电机服务)
-
详细流程:输入信号来到了输入滤波器和边沿检测器(极性选择)。输入滤波器可以对信号进行滤波,避免一些高频的毛刺信号误触发;边沿检测器就是和外部中断一样,可以选择高电平触发或者低电平触发,当出现指定的电平时,边沿检测电路就会触发后续电路执行动作。设计了两套滤波和边沿检测电路,第一套电路经过滤波和极性选择得到TI1FP1,输入给通道1的后续电路。第二套电路,经过另一个滤波和极性选择,得到TI1FP2,输入给通道2的后续电路,同理,下面TI2信号进来,也经过两套滤波和极性选择得到TI2FP1输入通道1和TI2FP2输入通道2。可以进行交叉连接,例如CH1引脚输入给通道2,CH2引脚输入给通道1,进行交叉连接的目的是两个:1.一个通道灵活切换两个引脚,可以灵活切换后续捕获电路的输入,2.两个通道同时捕获一个引脚,可以把一个引脚的输入,同时映射到两个捕获单元,这也是
PWMI模式的经典结构,实现两个通道(IC)对一个引脚(CH)进行捕获,就可以同时测量频率和占空比。可以选择各自独立连接,也可以选择进行交叉连接。另外还有一个TRC信号,也可选择作为捕获部分的输入,TRC信号来源于最上面,设计也是为了无刷电机的驱动。 -
- 注意,TI3和TI4没有接入到触发控制器中
输入捕获通道1的细化框图
- 引脚进来,先经过一个滤波器,滤波器的输入是TI1就是CH1的引脚,输出的TI1F就是滤波后的信号
- FDTS是滤波器的采样时钟来源
- CCMR1寄存器里的ICF位可以控制滤波器的参数
- 滤波器的工作原理就是:以采样频率对输入信号进行采样,当连续N个值都为高电平,输出才为高电平,当连续N个值都为低电平,输出才为低电平,如果信号出现高频抖动,导致连续采样N个值不全都一样,那输出就不会变化,这样就可以达到滤波的效果。采样频率越低,采样个数N越大,滤波效果就越好。在实际应用中,如果波形噪声比较大,就可以把IC1F位参数设置大一点来过滤噪声。(采样频率越低,采样个数N越大,滤波效果越好)
- 滤波之后的信号通过边沿检测器。捕获上升沿或者下降沿
- CC1P位可以进行极性选择
- 最终得到TI1FP1触发信号,通过数据选择器,进入通道1后续的捕获电路。
- CCMR寄存器的CC1S位可以对数据选择器进行选择;CCMR寄存器的ICPS位可以配置分频器,可以选择不分频、2分频、4分频、8分频;CCMR寄存器的CC1E位,控制输出使能或失能。如果使能了输出,输入端产生指定边沿信号,经过层层电路,就可以最后将CNT的值转运到CCR里来,每捕获一次CNT的值,都要把CNT清0一下,以便于下一次的捕获,从模式控制器就可以在捕获之后自动完成CNT的清零工作
- 每捕获一次CNT的值,都要将CNT清零,
- 如何自动清零CNT: TI1FP1信号和TI1F_ED边沿信号,都可以通向从模式控制器,比如TI1FP1信号的上升沿触发捕获,还可以同时触发从模式,这个从模式里就有电路,可以自动完成CNT的清零。从模式自动完成CNT的清零。
3.主从触发模式
-
主模式可以将定时器内部的信号映射到TRGO引脚,用于触发其他外设的操作; 从模式可以接收其他外设或自身外设的一些信号(触发源),用于触发自己的一些操作(定时器的运行);
-
主从模式:定时器先选择触发源、从模式。当触发源被激活则执行相应从模式。 -
主从模式优点是硬件自动触发一些功能,不需要通过软件判断触发源,减少软件使用资源。
4.基本结构图
1.输入捕获基本结构
-
该结构只使用了一个通道因此目前只能测频率(或只能测占空比)
-
步骤:
- 首先,配置时基单元,启动寄存器,则CNT就会在预分频之后的时钟驱动下不断自增。使用测周法用CNT来计数,间接实现计时的功能。经过预分频后的时钟频率,就是测周法的标准频率fc。之后,GPIO输入一个待测的方波信号,经过滤波器和边沿检测选择TI1FP1为上升沿触发,之后数据选择器选择直连通道,分频器选择不分频。
- 当TI1FP1出现上升沿之后,CNT的值就会被CCR1转运捕获;同时触发源选择模块选择TI1FP1为触发信号,从模式选择复位操作,触发CNT清零(先后顺序是:先转运CNT的值到CCR,再触发从模式给CNT清零。或者是非阻塞的同时转移:CNT的值转移到CCR,同时0转移到CNT里面去,总之是先捕获,再清零)。
- 当电路不断工作时,CCR1中的值始终是最新一个周期的计数值,即测周法的计次数 N。所以,当我们想读取信号的频率时,只需要读取CCR1得到N,再计算fc/N就得到频率了。当不需要读取时,整个电路全自动的测量,不需要占用任何软件资源。
-
注意:
- CNT的计数值是有上限的。由于ARR最大为65535,故CNT最大也只能计65535个数。如果信号频率太低,CNT的计数值可能会溢出。
- 从模式的触发源选择中有TI1FP1和TI2FP2,但是没有TI3和TI4的信号。所以如果要使用从模式自动清零CNT,就必须使用通道1或通道2作为输入。 对于通道3和通道4,就只能开启捕获中断,在中断中手动清0了(程序会处于频繁中断的状态,比较占用软件资源)。
2.PWMI基本结构图(PWM输入模式,测占空比)
- PWMI模式使用两个通道同时捕获一个引脚,可以同时测量周期和占空比,相比前面输入捕获,下面多了一个TI1FP2的通道。
- 步骤:
- 首先TI1FP1配置上升沿触发,触发捕获和清零CNT,正常的捕获周期,再来一个TI1FP2,配置为下降沿触发,通过交叉通道去触发通道2的捕获单元(
原理:最开始上升沿CCR1捕获同时清零CNT,之后CNT一直加,然后在下降沿时刻触发CCR2捕获,这时CCR2的值就是CNT从上升沿到下降沿的计数值也就是高电平期间的计数值,CCR2捕获并不触发CNT清零,所以CNT继续加,直到下一次上升沿,CCR1捕获周期并CNT清零,这样执行之后CCR1就是一整个周期的计数值,CCR2就是高电平期间的计数值,用CCR2/CCR1就是占空比,以上就是PWMI模式使用两个通道来捕获频率和占空比的思路。另外也可以两个通道同时捕获第一个引脚的输入)
- 首先TI1FP1配置上升沿触发,触发捕获和清零CNT,正常的捕获周期,再来一个TI1FP2,配置为下降沿触发,通过交叉通道去触发通道2的捕获单元(
//输入捕获就是CCR=cnt
c_value1a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//通道1,总时间
c_value1b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//通道2,高电平时间
A_Duty=(c_value1b/c_value1a)*100;//占空比
5.TIM编码器接口
- 如果一个定时器,配置为了编码器接口模式,基本上就干不了其他活了,c8t6只有4个定时器
- CH3和CH4不能接编码器
1. 正交编码器
-
正交编码器一般可以测量位置,或带有方向的速度值,有2个信号输出引脚,A相和B相。 当编码器的旋转轴旋转起来时,A相和B相会输出方波信号,转的越快,方波的频率就越高,频率代表速度。
-
当A,B相的边沿出现上升还是下降,对于另一相的状态,正转和反转相反。另外一相用来作参考获得方向
-
每个定时器只有一个编码器接口,基本定时器没有编码器接口。
2. 编码器输出部分
- 编码器输出部分控制CNT计数时钟,和计数方向,输出执行流程是,如出现了边沿信号,并且对应另一相的状态为正转,则控制CNT自增,否则控制CNT自减。**内部72Mhz时钟和时基单元初始化设置的计数方向,并不会使用。 **
3.编码器结构基本结构
- 输入捕获前2个通道,通过GPIO接入编码器A,B相,通过滤波器和边沿检测和极性选择,产生TI1FP1,TI1FP2,通向编码器接口,编码器接口通过预分频器控制CNT计数器的时钟。同时编码器接口还根据编码器的旋转方向,控制CNT计数的方向,编码器正转时,CNT自增,编码器反转时,CNT自减。 这里ARR有效,设置为最大量程65535,利用补码的特性,很容易得到负数。
- 这里的极性选择,不是边沿的极性选择,而是高低电平的极性选择,判断高低电平输入会不会反转
4.工作模式
- 这里TI1FP1,TI1FP2就是编码器的A,B相。
- 总结:正转的状态都向上计数,反转的状态都向下计数。
6.HAL库的配置
-
在使用 HAL 库(硬件抽象层)进行输入捕获时,通常会使用定时器的输入捕获功能来捕获外部信号的边缘(上升沿或下降沿)。在回调函数中,您需要根据捕获的事件来判断并处理相应的逻辑。以下是一个基本的示例,展示如何在 HAL 库中编写输入捕获的回调函数。
-
示例代码
假设您使用 STM32 微控制器,并且已经配置了一个定时器以进行输入捕获。以下是一个简单的回调函数示例:
#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim2; // 定时器句柄
volatile uint32_t captureValue; // 捕获值
volatile uint8_t captureReady = 0; // 捕获标志
// 输入捕获回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) { // 检查是哪个定时器
captureValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 读取捕获值
captureReady = 1; // 设置捕获标志
}
}
// 主函数或其他初始化函数
int main(void) {
HAL_Init();
// ... 其他初始化代码 ...
// 启动输入捕获
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 启动定时器的输入捕获中断
while (1) {
if (captureReady) { // 检查是否有新的捕获值
captureReady = 0; // 清除标志
// 处理捕获值
// 例如,计算频率或时间间隔
}
}
}
代码说明
-
定时器句柄:
TIM_HandleTypeDef htim2;用于存储定时器的状态和配置。 -
捕获值和标志:
captureValue用于存储捕获的时间戳,captureReady是一个标志,用于指示是否有新的捕获值可用。 -
回调函数:
HAL_TIM_IC_CaptureCallback是 HAL 库提供的输入捕获回调函数。当定时器捕获到边缘时,该函数会被自动调用。htim->Instance == TIM2用于判断当前触发的定时器是否是我们配置的定时器。HAL_TIM_ReadCapturedValue用于读取捕获的值。- 设置
captureReady标志,以便在主循环中处理捕获值。
-
主循环:在主循环中,检查
captureReady标志,如果为真,则处理捕获值并重置标志。
注意事项
- 确保在配置定时器时,正确设置了输入捕获的通道和极性(上升沿或下降沿)。
- 在使用中断时,确保中断优先级设置正确,以避免丢失捕获事件。
- 根据具体的应用需求,您可能需要在回调函数中添加更多的逻辑,例如计算频率、时间间隔等。
总结
在 HAL 库中,输入捕获的回调函数主要用于处理捕获到的信号边缘。通过检查定时器实例和读取捕获值,可以实现对外部信号的有效监测和处理。根据具体的应用需求,您可以在回调函数中添加更多的逻辑来满足您的需求。