定时器输入捕获

 借用江协科技ppt:

介绍:

 

 

检测到左边的通道123,某一个发生电平翻转(与其他通道电平不同)会通过输入滤波器,可以去到ICx->预分频器->由输入捕获/输出比较寄存器(再一定时间里计数)得到计数值返回到CNT计数器里(CNT由内部标准时钟驱动)->下一个上升沿来前CNT先清零 (配置从模式复位清零,由硬件执行清零)                 

 *(频率不要太小,频率太低计数有可能会溢出(超过计数范围65535) )

通道1和2都可以实现直连或级联,例如TI1->TI1FP1    TI1->TI1FP2                                                   通道3和4也一样。

(由上升沿开始)一个引脚可以 控制两个捕获单元,一个上升沿触发(测频率),一个下降沿触发(间接占空比),实现PWMI模式(可以测出频率和占空比)

基本结构:

先打开定时器和gpio时钟 ->gpio初始化->配置时基单元->配置IC模式(PWMI)->选择触发源->选择从模式

代码:

#include "stm32f10x.h"                  // Device header

void IC_Init()
{ //打开时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	TIM_InternalClockConfig(TIM3);//*定时器一定有时钟
	//GPIO配置
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU ;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 ;  //PA6为TIM_CH1
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period = 65536 -1 ;//要保证不会溢出
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1 ;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);

  //配置IC(输入捕获)	
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1 ; //CH1对应通道1/2
	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_PWMIConfig(TIM3,&TIM_ICInitStruct);//PWMI模式,1对2,上对下,直对交
	
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//触发源
	
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//从模式
  
	TIM_Cmd(TIM3,ENABLE);//开启定时器

}

uint32_t IC_GetFreq()
{
   return 1000000/(TIM_GetCapture1(TIM3)+1);//读取频率
}

uint32_t IC_GetDuty()
{
	return   (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);//读取占空比
}

在时基单元中的计数寄存器和预分频器,可以认为先有分频,才有计数。预分频器为72 -1 .时钟频率就为1MHz=1us,每过1us->计数器+1

定时器输入捕获是指利用定时器的外部事件计数功能来测量输入信号的频率、周期或者脉冲宽度等参数。配置定时器输入捕获通常涉及到设置定时器工作模式、中断、输入通道选择以及捕获比较值等。以STM32为例,以下是使用HAL库配置定时器输入捕获的一个简单示例: 1. 初始化定时器 首先,需要初始化定时器,配置定时器的时钟源、预分频器、计数模式等。例如: ```c TIM_HandleTypeDef htim; // 定义定时器句柄 void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim.Instance = TIM3; // 定时器实例 htim.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000U) - 1U; // 预分频器,设定计数频率为1MHz htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式 htim.Init.Period = 0xFFFF; // 自动重装载值 htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频因子 htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 禁用自动重载预装载 if (HAL_TIM_Base_Init(&htim) != HAL_OK) { // 初始化错误处理 } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim, &sClockSourceConfig) != HAL_OK) { // 配置时钟源错误处理 } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig) != HAL_OK) { // 配置主从模式错误处理 } } ``` 2. 配置定时器输入捕获通道 接下来,配置输入捕获通道的相关参数,包括通道、边沿检测等: ```c void MX_TIM3_IC_Init(void) { TIM_IC_InitTypeDef sConfigIC = {0}; sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; // 上升沿捕获 sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; // 不分频 sConfigIC.ICFilter = 0; // 不使用滤波器 if (HAL_TIM_IC_Init(&htim) != HAL_OK) { // 初始化错误处理 } if (HAL_TIM_IC_ConfigChannel(&htim, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { // 配置通道错误处理 } } ``` 3. 启动定时器捕获 最后,启动定时器,并使能捕获中断(如果需要): ```c void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { // 捕获回调函数 if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { // 读取捕获值 uint32_t capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 处理捕获到的数据 } } void HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { // 启动中断模式的定时器输入捕获 if (HAL_TIM_IC_Start_IT(htim, Channel) != HAL_OK) { // 启动错误处理 } } // 在合适的地方调用初始化和启动函数 MX_TIM3_Init(); MX_TIM3_IC_Init(); HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_1); ``` 以上代码展示了如何使用HAL库来配置STM32的定时器进行输入捕获。需要注意的是,具体的配置参数应根据实际的应用场景和硬件特性进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值