【STM32】输入捕获实验原理

目录

输入捕获原理框架:

输入捕获实验工作原理:

1、滤波:

 2、设置捕获极性:

3、设置输入捕获映射通道:

4、预分频:

 5、中断开启:

输入捕获有关库函数及操作:

1.通道初始化函数:TIM_ICInit

2.通道极性设置:TIM_OCxPolarityConfig;

3.获取当前通道捕获值:TIM_GetCapturex;

4.GPIO配置函数:GPIO_Init;

5.中断服务函数:


输入捕获原理框架:

输入捕获实验工作原理:

输入捕获的工作原理:预设分频系数,和捕获沿,检测定时器通道输入的边沿信号,当信号发生跳变并且满足预设条件时,将定时器当前值寄存器CNTx的值存入捕获比较寄存器CCRx中。

捕获过程

捕获的过程大致可以细分为五个步骤:滤波、设定捕获极性、捕获通道设定、预分频、中断设置

1、滤波:

上面的图为滤波步骤的工作设置。滤波简单来说就是将一些杂的波过滤,获得我们所需要的波。

例如我们捕获实验需要特定周期捕获高电平的信号,但是在低电平处发生抖动,导致原本是低电平的地方就有一些高的信号,所以我们要对这些信号进行剔除。

例子

剔除的方法也很简单,就是多次检测,如果每一次检测的结果都为需要的结果,那么我们就认为这个高电平是有效的,而我们设置的信号触发后单次采样的采样的频率f DTS。但是这个频率总得有个来源吧,于是我们使用定时器的时钟频率CK_INT作为它的来源。而定时器TIMx_CCMRx的ICF位就用于选择配置滤波器,但是f DTS与f INT之间的关系的配置需要使用。 TIMx_CRx位去配置:

TIMx_CRx寄存器配置单次采样频率

 而设置需要的采样次数x则由TIMx_CCMR1寄存器的IC1F位来配置:

 2、设置捕获极性:

 这部分主要是用于设置捕获的是上升的信号沿还是下降的信号沿,它是由CCER的CC1P位来配置的。所谓上升沿,就是由低电平变成高电平的瞬间,下降沿就是由高电平变成低电平的瞬间。我们可以设置需要捕获哪一个时候的变化。

3、设置输入捕获映射通道:

 设置输入捕获映射通道,换句话说就是同一个定时器的不同通道捕获到的信号需不需要互换的的设置,它们如果交换那么关系如下图:

通道信号交换

它是由TIMx_CCMR1寄存器的CC1S位配置的,一般情况下,我们就只需要设置那个通道捕获到信号就由那个通道对于设备处理即可。

4、预分频:

 预分频是设置记录到几次上升沿才触发一次捕获。它是由TIMx_CCMR1寄存器的ICPS位来配置的。例如,如果我们设置每2次上升沿触发1次捕获,那么下图可以触发一次捕获

 5、中断开启:

这个就是开启相应的通道中断,它由TIMx_DIER寄存器配置;

输入捕获有关库函数及操作:

输入捕获的一般步骤有:

  • 使能时钟
  • 配置GPIO口
  • 配置定时器
  • 配置输入捕获通道
  • 配置捕获中断
  • 使能定时器
  • 编写中断服务函数

1.通道初始化函数:TIM_ICInit

NVIC_Init(&NVIC_InitStructure);

这个函数与我们PWM之前的函数类似,都是用于初始化定时器通道、配置定时器中断的工作模式的。这里我们用到了它的参数结构体的5个成员:

    TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;
  	TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  	TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  	TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  	TIM5_ICInitStructure.TIM_ICFilter = 0x00;

第一个成员: TIM_Channel,这个成员就是指定工作的通道;

第二个成员:TIM_ICPolarity,这个成员用来配置我们是采用上升沿捕获还是下降沿捕获;

第三个成员:TIM_ICSelection,这个成员用来配置是否要将输入捕获通道映射到其它的通道,一般选择不用映射,直接direct现在的通道;

第四个成员:TIM_ICPrescaler,这个成员用来配置分频系数;

第五个成员:TIM_ICFilter,这个成员用来配置滤波的次数;

2.通道极性设置:TIM_OCxPolarityConfig;

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

这个函数用于配置通道的极性,即上升沿捕获还是下降沿捕获。

3.获取当前通道捕获值:TIM_GetCapturex;

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);

这个函数用于获取当前我们通道捕获到的数值,即捕获比较寄存器存放的值

4.GPIO配置函数:GPIO_Init;

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

GPIO的配置函数与前面GPIO的配置函数所需要做的类似,只不过需要具体去修改几个特定的参数:
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

    GPIO_ResetBits(GPIOA,GPIO_Pin_0);

GPIO的选择模式要选择为输入模式,并且要将GPIO的默认电平改为低电平。

5.中断服务函数:

捕获中断函数内部实现逻辑

  • 16
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值