TIM输入不捕获-STM32

这篇具有很好参考价值的文章主要介绍了TIM输入不捕获-STM32。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TIM输入捕获-STM32

IC(Input Capture) 输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
每个高级定时器和通用定时器都拥有4个输入捕获通道可配置为PWMI模式,同时测量频率和占空比可配合主从触发模式,实现硬件全自动测量
TIM输入不捕获-STM32
输出比较和输入捕获的区别:
输出比较,引脚是输出端口;输入捕获,引脚是输入端口。
输出比较,是根据CNT和CCR的大小关系来执行输出动作;输入捕获,是接收到输入信号,执行CNT锁存到CCR的动作。
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
一般我们可以根据分辨率的要求,先确定好ARR;比如分辨率,1%就足够了,那ARR给100-1,这样PSC决定频率,CCR决定占空比。
TIM输入不捕获-STM32
第一步,RCC开启时钟,把GPIO和TIM的时钟打开
第二步,GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或者浮空输入模式
第三步,配置时基单元,让CNT计数器在内部时钟的驱动下自增运行
第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数;用一个结构体就可以统一进行配置了
第五步,选择从模式的触发源。触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了
第六步,选择触发之后执行的操作。执行Reset操作,这里也是调用一个库函数就行了
调用TIM_Cmd函数,开启定时器。

当我们需要读取最新一个周期的频率时,直接读取CCR寄存器,然后按照fc/N,计算一下就行了。
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
TIM输入不捕获-STM32
测试频率

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
		
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM3);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//周期,ARR自动重装器的值 范围0~65536 设置为最大值,防止溢出
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;//PSC预分频器的值 范围0~65536 最后1Mhz
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	//第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道 选择TIM3的通道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);
	
	//第五步,选择从模式的触发源。触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	
	//第六步,选择触发之后执行的操作。执行Reset操作,这里也是调用一个库函数就行了
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	//调用TIM_Cmd函数,开启定时器
	TIM_Cmd(TIM3,ENABLE);
}

//函数返回的是最新"个周期的频率值,单位是Hz
//Freq = CK_PSC / (PSC + 1) / (ARR + 1) 
//CK_PSC= 72MHz    PSC + 1 =100
uint32_t IC_GetFreq(void)
{
	return 10000000/(TIM_GetCapture1(TIM3)+1);
}

TIM输入不捕获-STM32文章来源地址https://www.toymoban.com/news/detail-433045.html

#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
		
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM3);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//周期,ARR自动重装器的值 范围0~65536 设置为最大值,防止溢出
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;//PSC预分频器的值 范围0~65536 最后1Mhz
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	//第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道 选择TIM3的通道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_PWMIConfig(TIM3,&TIM_ICInitStruct);//在函数里,会自动把剩下的一个通道初始化成相反的配置
//	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//选择通道 选择TIM3的通道1
//	TIM_ICInitStruct.TIM_ICFilter = 0xF;//用来配置输入捕获的滤波器。数越大滤波效果越好
//	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;//上升沿触发
//	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//配置分频器,不分频
//	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//配置数据选择器,交叉输入
//	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	//第五步,选择从模式的触发源。触发源选择为TI1FP1,这里调用一个库函数,给一个参数就行了
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
	
	//第六步,选择触发之后执行的操作。执行Reset操作,这里也是调用一个库函数就行了
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
	
	//调用TIM_Cmd函数,开启定时器
	TIM_Cmd(TIM3,ENABLE);
}

//函数返回的是最新"个周期的频率值,单位是Hz
//Freq = CK_PSC / (PSC + 1) / (ARR + 1) 
//CK_PSC= 72MHz    PSC + 1 =100
uint32_t IC_GetFreq(void)
{
	return 10000000/(TIM_GetCapture1(TIM3)+1);
}

//获取占空比
//Duty = CCR / (ARR + 1)
uint32_t IC_GetDuty(void)
{
	//高电平的计数值存在CCR2里;整个周期的计数值存在CCR1里;用CCR2/CCR1,就能得到占空比了
	return (TIM_GetCapture2(TIM3)+1)*100/(TIM_GetCapture1(TIM3)+1);//范围是0%~100%
}

到了这里,关于TIM输入不捕获-STM32的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM-32:TIM输入捕获—输入捕获模式测频率/PWMI模式同时测量频率和占空比

    IC(Inpute Capture)输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配合PWMI模式,同时测量频率和占空比 可配

    2024年02月13日
    浏览(34)
  • STM32 TIM输入捕获测频率占空比库函数

    目录 一、输入捕获初始化函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit 二、主从触发模式对应函数 TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 三、配置分频器函数 TIM_SetIC1Prescaler TIM_SetIC2Prescaler TIM_SetIC3Prescaler TIM_SetIC4Prescaler 四、读取CCR函数 TIM_GetCapture1 TIM_GetCapture2 TIM_GetCap

    2024年02月20日
    浏览(35)
  • STM32单片机(六)TIM定时器 -> 第六节:TIM输入捕获练习(输入捕获模式测频率和PWMI模式测频率占空比)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(42)
  • STM32—TIM:基本定时器(输入捕获:测频率、周期)(标准库)

     频率测量:  频率中界频率:适用测周法                                                           频率中界频率:适用测频法 第一步:配置GPIO,TIM的时基单元              在配置TIM的时基单元参数有些许不同。 初始化输入捕获单元:void TIM_ICInit();   配置触发

    2024年02月13日
    浏览(50)
  • STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月19日
    浏览(56)
  • 【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

    旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的脉冲个数。 旋转编码器广泛用于电机、或者角度传感器,STM32的定时器可以直接接入这两个波形获取到信息。 前两个引脚(接地和Vcc)

    2024年02月13日
    浏览(50)
  • (十九)STM32——输入捕获

    目录 学习目标 成果展示 内容 获取 配置 代码 总结          本节内容我们要介绍的是输入捕获,其实也和定时器那部分知识是有关系的,所谓输入捕获,通俗一点来讲,其实就是通过检测上升沿和下降沿来计算你的输入持续时间。具体怎么去检测和捕获呢?我们来慢慢

    2024年02月02日
    浏览(29)
  • STM32——输入捕获

    下图指定电平跳变是指上升沿和下降沿,可以通过程序配置,发生电平跳变时,输入捕获电路会让当前CNT计数器的值锁存到CCR,锁存CCR的意思就是把当前CNT的值读出来,写入CCR中。 (1).4个输入捕获和输出比较通道,共用4个CCR寄存器,CH1-CH4,4个通道和引脚也是共用的,所以对

    2024年02月04日
    浏览(45)
  • STM32 输入捕获模式测频率

    单片机学习! 目录 文章目录 前言 一、输入捕获测频率配置步骤 二、代码示例及注意事项 2.1 RCC开启时钟 2.2 GPIO初始化 2.3 配置时基单元 2.4 配置输入捕获单元 2.5 选择从模式的触发源 2.6 配置从模式为Reset 2.7 开启定时器 总结         博文介绍如何配置输入捕获电路来测

    2024年03月10日
    浏览(43)
  • STM32定时器-输入捕获

    输入捕获工作过程 一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMxCCRx)里面,完成一次捕获。 步骤1:设置输入捕获滤波器(通道1为例) 输入捕获1滤

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包