STM32输入捕获

参考正点原子视频

STM32PWM工作过程

在这里插入图片描述
一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx里面),完成一次捕获。

步骤一:设置输入捕获滤波器

以通道一为例:
在这里插入图片描述

1)当滤波器连续采样到N次个有效电平时,认为一次有效的输入电平。
2)该数字滤波器实际上是个事件计数器,它记录到N个事件后会产生一个输出的跳变。
例如:当f(CK_INT) = 72MHz, CKD[1:0] = 01时,选择f(DTS) = f(CK_INT)/2 = 36MHz;
而ETF[3:0] = 0100,则采样频率f(SAMPLING) = f(DTS) / 2 = 18MHz, N = 6,此时高于3MHz的信号
将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。

看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下:
问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?
问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么?

带着这两个问题,我们来分析一下,下面以TIM3为例:
首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图
TIM3_CH1(PA.6) ----> TI1(外部信号) -------> 输入滤波器IC1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1
从上面的过程可以知道,
1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。
2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和 IC1是同一个信号。

借助这两点分析,我假设的滤波器的工作原理是:
问题1猜测答案:当滤波器连续采样到N次个有效电平时,就输出这个有效电平。
问题2猜测答案:当滤波器没有连续采样到N次个有效电平时,再从0开始计数,输出一直保持上一次输出的有效电平。例如:滤波器上一次输出是高电平,本次连续采样到N-1个高低平,但第N是个低电平,那么滤波器仍然保持上次输出的高电平,并重新开始计数,记录1次低电平,如果在其后采样的N-1个也是低电平,此时滤波才输出低电平,于是一个下降沿才出现在IC1上。

在这里插入图片描述

步骤二:设置输入捕获极性

以通道一为例:
在这里插入图片描述
CC1P:输入/捕获1输出极性

CC1通道配置为输出:

0:OC1高电平有效

1:OC1低电平有效

CC1通道配置为输入:

该位选择是IC1还是IC1的反相信号作为触发或捕获信号。

0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。

1:反相:捕获发生在IC1的下降沿;当用作外部触发器时,IC1反相。

步骤三:设置输入捕获映射通道

通道一为例:
在这里插入图片描述
CC1S[1 : 0]:捕获/比较1选择
这2位定义通道的方向(输入/输出),及输入脚的选择:

  • 00:CC1通道被配置为输出:
  • 01:CC1通道被配置为输入,IC1映射在TI1上
  • 10:CC1通道被配置为输入,IC1映射在TI2上
  • 11:CC1通道被配置为输入,IC1映射在TRC上。此模式仅工作在内部触发器输入被选中时(由TIMx_SMCR寄存器的TS位选择)。

注:CC1S仅在通道关闭时(TIMx_CCER寄存器的CC1E=‘0’)才是可写的

步骤四:设置输入捕获分频器

通道一为例:
在这里插入图片描述
IC1PSC[1:0]:输入/捕获1预分频器
这2位定义了CC1输入(IC1)的预分频系数。一旦CC1E=‘0’(TIMx_CCER寄存器中),则预分频器复位。

  • 00:无预分频器,捕获输入口上检测到的每一个边沿都触发一次捕获
  • 01:每2个事件触发一次捕获
  • 10:每4个事件触发一次捕获
  • 11:每8个事件触发一次捕获

CC1E:输入/捕获1输出使能

CC1通道配置为输出:

  • 0:关闭 - OC1禁止输出
  • 1:开启 - OC1信号输出到对应的输出引脚

CC1通道配置为输入:
该位决定了计数器的值是否能捕获TIMx_CCR1寄存器

  • 0:捕获禁止
  • 1:捕获使能

步骤五:捕获到有效信号可以开启中断

在这里插入图片描述

输入捕获通道初始化函数:

void TIM_ICInit(TIM_TypeDef* TIMx, TIMICInitTypeDef* TIM_ICInitStruct);

结构体

typedef struct
{
	uint16_t TIM_Channel;// 捕获通道1~4
	uint16_t TIM_ICPolarity;// 捕获极性
	uint16_t TIM_ICSelection;// 映射关系
	uint16_t TIM_ICPrescaler;// 分频系数
	uint16_t TIM_ICFilter;// 滤波器
}TIM_ICInitTypeDef

TIM5

TIM5_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM5_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM5_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM5_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM5_ICInitStruct.TIM_ICFilter = 0x00;
TIM_ICInit(TIM5, &TIM5_ICInitStruct);
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值