目录
一、输入捕获简单介绍
1、定时器部分
定时器的输入捕获部分,可以用来测量频率或者计次。旋转编码器测速便是用的这一部分,旋转编码器与电机相联系,便可用定时器的输入捕获来为电机测速。
这是常用方法,还可以用来切换OLED屏幕的界面。用定时器的输入捕获,来获取编码器旋转的数值,当旋转一定角度,我们可以判断此时定时器的计数,来切换OLED屏幕的界面。
切换界面,我一般用的是按钮,看到一个视频,看到UP用这种方法来切换屏幕,感觉很新奇,但是这也有一个缺点,就是占用定时器资源,可以自己考虑取舍。
那么,定时器输入捕获的工作原理是什么?
通过STM32手册所给的框图我们可以看到,输入捕获部分和输出比较部分,用的是同一个寄存器,并且通道也是用的同一个,所以输入捕获和输出比较不能共用。
对于输出比较,是对CNT和CCR的值进行比较,来选择如何输出信号。
而对于输入捕获来说,是当检测到引脚信号跳变,就会将CNT的计数值,寄存到捕获比较寄存器中,也就是让CCR = CNT。
2、输入捕获通道
输入捕获通道,手册有更详细的框图进行介绍。
上面的这些东西,便是我们要对输入捕获结构体要进行的配置。
极性就是选择上升沿触发还是下降沿触发。
预分频,实际上是选择第几次目标变化沿跳变进行触发。若是2分频,上升沿触发,就是两个上升沿触发一次。
使能输出,若有电平跳变,便让CNT的值,锁存在CCR中。
3、其他
输入捕获有个专为测量PWM的频率和占空比的功能,名叫PWMI。
输入捕获的通道1和通道2,还有为编码器配置的接口。
可以不设置定时器的时钟选择,让编码器来控制CNT的自增与自减,以实现对编码器的计次。
二、定时器输入捕获代码部分
想要设置输入捕获功能,可以进行以下步骤
首先使能定时器及其IO口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能IO口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置IO口i,并将其设为浮空输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
配置定时器结构体
TIM_InternalClockConfig(TIM3);//选择内部时钟作为定时器的时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536-1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 60-1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
配置定时器输入捕获通道的结构体
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道1
TIM_ICInitStructure.TIM_ICFilter = 0XF;//选择滤波强度
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//选择极性,上升沿触发
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//选择分频器,不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择直连通道还是交叉,选择直连
TIM_ICInit(TIM3,&TIM_ICInitStructure);
配置输入捕获的通道以及模式
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//选择触发通道
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//选择触发模式,选择从模式,可自动清零CNT
最后使能定时器
TIM_Cmd(TIM3,ENABLE);
三、结语
相当于对江科大视频讲解的笔记,还有很多不足之处。许多地方,是对两个视频的内容进行摘取,然后做的总结,有许多地方很容易忽视。这个笔记只是浅显的介绍了捕获输入,想要真正弄懂,钻研手册还是必不可少的。
最后,贴上完整代码。
void IC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_InternalClockConfig(TIM3);//选择内部时钟作为定时器的时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536-1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 60-1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道1
TIM_ICInitStructure.TIM_ICFilter = 0XF;//选择滤波强度
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//选择极性,上升沿触发
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//选择分频器,不分频
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择直连通道还是交叉,选择直连
TIM_ICInit(TIM3,&TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//选择触发通道
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//选择触发模式,选择从模式,可自动清零CNT
TIM_Cmd(TIM3,ENABLE);
}