STM32F103C8T6片上外设笔记2——定时器输入捕获

目录

一、输入捕获简单介绍

1、定时器部分

2、输入捕获通道

3、其他

二、定时器输入捕获代码部分

三、结语


一、输入捕获简单介绍

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值