STM32学习笔记——TIM输入捕获

  • 当通道输入引脚出现指定电平跳变时,当前计数器(CNT)的值将被锁存捕获比较寄存器(CCR)中。这可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。
  • 每个高级定时器和通用定时器都具有4个输入捕获通道。
  • 输入捕获模式可配置为PWMI(PWM输入)模式,同时测量信号的频率和占空比。
  • 可配合主从触发模式,实现硬件全自动测量。

输入捕获是接收外部信号,执行CNT锁存到CCR的动作。

 频率测量

输入捕获是测周法。

电路部分

异或门:当三个引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转,3个引脚电平都相同为0,3个引脚中有高有低为1。如果有两个输出引脚,选上面就异或输出,下面就当异或门没用。

经过滤波后信号有两路,可以直接经过TI1FP1引脚输入通道1,也可以通过TI1FP2输入到通道2。

这样交叉连接可以实现两个通道(IC)对一个引脚(CH)进行捕获,就可以同时测量频率和占空比。

 

 CCR每捕获一次CNT的值都需要对CNT进行一次清零操作。

主从触发模式

主模式是将定时器内部的信号映射到TRGO引脚,用于触发其他外设。

从模式是根据触发源的信号去触发自身定时器的一些操作。

而上面的清零操作就可以用从模式的清零。TI1FP1输出上升沿,CCR1就捕获CNT的值,而上升沿也触发从模式使CNT清零。这样CCR1的值就是一个周期的值,也就是N。

预分频器里的就是驱动CNT的标准频率,标准频率 fc= 72M / 预分频系数

所以测量频率 =  fc / N

若将TI1FP2输出下降沿,CCR2捕获CNT的值,那么CCR2的值就是一个周期的高电平的值。

所以占空比 = CCR2 / CCR1

 代码部分

 IC.c

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	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_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1 ;
	TIM_ICInitStruct.TIM_ICFilter = 0xF;	//滤波采样频率
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;	//分频器频率,不分频每次都触发
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;	//直连通道
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	//配置主从模式
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);	//从模式
	
	TIM_Cmd(TIM3,ENABLE);
}

uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);
	
}

若测占空比,要配置好另一个通道,而下面这个函数会自动配置相应的通道。1和2,3和4。

	TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);	//配置通道2,自动配置成相反模式
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值