stm32TIM简介(三)——输入捕获

本文笔者学习stm32过程中强化学习效果所写,同时希望对大家有所帮助,若有错误恳请指正,谢谢!!!!

stm32的TIM简介(一)——定时器中断-CSDN博客

stm32TIM简介(二)——输出比较和PWM-CSDN博客

IC(Input Capture)输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数.

每个高级定时器和通用定时器都拥有4个输入捕获通道.
可配置为PWMI模式,同时测量频率和占空比.
可配合主从触发模式,实现硬件全自动测量.

频率测量方法

测频法

闸门时间T内,对上升沿计次,得到N,则频率𝑓𝑥=𝑁 / 𝑇

注意:该方法适用于测量的频率较高的信号

测周法

注意:该方法适用于测量的频率较低的信号

两个上升沿内,以标准频率fc计次,得到N ,则频率𝑓𝑥=𝑓𝑐 / 𝑁

中界频率:令测周法和测频法两个公式中的N相等,联立解得频率为

把这个频率称为中界频率。

输入捕获通道(以通用定时器的捕获比较通道的输入部分为例)

框图介绍

1.TI1是滤波器的输入引脚,f(DTS)是滤波器的采样时钟源,经过滤波器后产生滤波后的信号TI1F.

2.之后将滤波后的信号通过边沿检测器来捕获上升沿或下降沿,用CCER寄存器的CC1P位来选择极性,最终得到触发信号TI1FP1通过数据选择器进入后续的捕获电路。

3.此外TI1FP1还可以通向从模式电路,实现CNT的清零。

CCMR1寄存器中的CC1S位可以用来选择输入到后续电路的触发信号,ICPS位进行分频的选择,由CCER中的CC1E来控制输出的使能或失能。

CCMR1中的ICF可以控制滤波器的参数(如下图所示),滤波器的采样频率越低,采样次数越多得到的数据越准确;

主从触发模式 

1.主模式可以将定时器内部的信号映射到TRGO引脚上,用于触发别的外设

2.从模式可以接收其他外设或者自身外设的信号,用于控制自身定时器的运行,也就是被别的信号控制

3.触发源选择用于选择从模式的信号源,选择一个指定的信号输出到TRGI上,由TRGI触发从模式。

主模式的选择见下图

从模式的选择

 测量频率的工作方式(以上升沿检测为例)

测量一个周期内CNT的数值并将该值赋给CCR寄存器以后清零CNT寄存器,由𝑓𝑥=𝑓𝑐 / 𝑁公式即可得到测量信号的频率。

注意:CNT的最大值就是ARR寄存器的最大值,一般为65535

PWMI模式测量的工作原理

从上升沿开始计数到下一个上升沿时把CNT的值赋给CCR1寄存器,并清零CNT寄存器,

在第一个下降沿时把CNT的值赋给CCR2寄存器,不清零CNT的值。

由CCR2/CCR1即可得到占空比的值。

初始化代码示例(输入捕获基本模式)定时器3为例

将下图相关器件配置并连接即可

1.外设时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

2. 与该定时器相关的IC的GPIO口初始化

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

3.定时器选择内部时钟源

TIM_InternalClockConfig(TIM3);

 4.时基单元的初始化

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);

5.输入捕获单元初始化

TIM_ICInitTypeDef TIM_ICStructure;
TIM_ICStructure.TIM_Channel=TIM_Channel_1;
TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3,&TIM_ICStructure);

6.主从模式的配置

	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);

7.开启定时器

TIM_Cmd(TIM3,ENABLE);

完整代码如下

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,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_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	TIM_ICInitTypeDef TIM_ICStructure;
	TIM_ICStructure.TIM_Channel=TIM_Channel_1;
	TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
	TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
	TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
	TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
	TIM_ICInit(TIM3,&TIM_ICStructure);
	
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	TIM_Cmd(TIM3,ENABLE)

PWMI初始化代码示例

基本操作以上述初始化代码相似,只需要对IC初始化进行升级,代码如下

	TIM_ICInitTypeDef TIM_ICStructure;
	TIM_ICStructure.TIM_Channel=TIM_Channel_1;
	TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
	TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
	TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
	TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
	TIM_PWMIConfig(TIM3,&TIM_ICStructure);

完整代码如下

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,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_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=65536-1;//ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	TIM_ICInitTypeDef TIM_ICStructure;
	TIM_ICStructure.TIM_Channel=TIM_Channel_1;
	TIM_ICStructure.TIM_ICFilter=0XF;//滤波频率
	TIM_ICStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
	TIM_ICStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
	TIM_ICStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
	TIM_PWMIConfig(TIM3,&TIM_ICStructure);
	
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	TIM_Cmd(TIM3,ENABLE);

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值