stm32学习 输入捕获

本文介绍了如何使用STM32的TIM模块进行频率测量,包括测频法和测周法的应用,以及如何配置TIM输入捕获单元、从模式触发和GPIO接口,以实现在高频信号下计算占空比和捕获时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

频率测量:测频法--适用于高频信号

                  测周法--用{f{c}}^{}的频率在两个上升沿内记数得周期为\frac{N}{^{_{f}}c},取反即为频率

                中界频率--上下两式N相等时求解fx得出,fm用于选取用测频法/侧周法

采用测周法:

ICXPS信号每触发一次 ,计数寄存器CNT转存入CCR一次,两次触发计数即可反应周期

   TI1 -->滤波(fDTS为滤波器采样频率)-->捕获上升沿/下降沿

从模式

TIM_SelectInputTrigger 

从模式选择信号源-->选择从模式功能(从模式中可以设置硬件自动完成计数器清零)

 上升沿触发CCR1捕获(同时触发从模式,对CNT先存入CCR1再清零),周期 =    fc / CCR1

下降沿触发CCR2捕获

通过CCR2即可得到高电平时间,进而可得占空比(PWMI模式)

每个滤波器和边缘检测器可以输出两路信号,可以设置TI1FP1-->IC1进入捕获通道1,TI2FP1-->IC2进入捕获通道1(直连通道)

捕获通道配置为交叉通道:即选择另一通道信号进入:TI1FP2-->IC2进入捕获通道2,同理对TI2输入。(交叉通道)

即可选择两通道一个引脚输入,也可以一个通道由两个引脚输入。

输入捕获配置顺序:

1、配置RCC时钟,开启GPIO与TIM

2、GPIO配置:输入模式(上拉或者浮空)AF_PP

3、TIM时基单元配置

//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源滤波器采样分频系数选择
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//0~65535重装载值ARR,给最大值防止溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//0~65535预分频值PSC
	//1mhz计数标准频率
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计数器才有
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);//此处初始化完成后会立刻产生更新事件,导致立刻进入中断,所以需要置中断标志位为0

4、配置输入捕获单元(滤波器、极性、直连通道/交叉通道、分频器)

	//配置输入捕获单元
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_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(TIM4, &TIM_ICInitStructure);

 5、从模式触发源(TRGI)选择(文中为TI1FP1),选择从模式功能

	//从模式触发源选择TI1FP1
	TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);
	
	//从模式,设置为reset功能,每触发一次高电平就重新开始计数
	TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
	

6、TIM_Cmd使能时钟

双通道捕获获取占空比:

void IC_int(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	TIM_InternalClockConfig(TIM4);
	
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟源滤波器采样分频系数选择
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//0~65535重装载值ARR,给最大值防止溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//0~65535预分频值PSC
	//1mhz计数标准频率
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级计数器才有
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);//此处初始化完成后会立刻产生更新事件,导致立刻进入中断,所以需要置中断标志位为0
	
	//配置输入捕获单元
	//CH1配置
	TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_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(TIM4, &TIM_ICInitStructure);
	//CH2配置
//		TIM_ICInitTypeDef TIM_ICInitStructure2;
//	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
//	TIM_ICInitStructure.TIM_ICFilter = 0xF;					
//	TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Falling;//下降沿
//	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;//接受通道配置为交叉通道即接受TI1FP2信号
//	TIM_ICInit(TIM4, &TIM_ICInitStructure);
//以上代码,等价于
	TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);//自动把通道初始化为相反的配置
	
	
	
	//从模式触发源选择TI1FP1
	TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);
	
	//从模式,设置为reset功能,每触发一次高电平就重新开始计数
	TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
	
		TIM_Cmd(TIM4, ENABLE);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值