输入捕获测量按键时间

输入捕获的知识

        分频值设为1就是不分频 , 2分频就是每两次高电平原状态才能够有一次高电平 

如下

可以在最开始的阶段设置起始位是下降沿还是上升沿

设置输入捕获通道的选择方式,以便正确地读取输入信号的信息。

hal库配置

以下是按键测量时间的具体代码

代码说明都在里面  

#include "main.h"
#include "tim.h"

uint8_t flag = 0    , num =0 , on_val = 0  ,off_val = 0 ;
uint32_t cout = 0 ; 
 

// 使用定时器2 的通道1
// 这里的是正常状态是高电平 , 按下后变成低电平 ,所以这里测的时间长度是低电平的时间长度
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){  // 溢出次计数
if(htim->Instance == TIM2){
                if((flag &0x80) ==  0 ){ // 还没有完成一个周期
    
                        if(flag &0x40){ // 当按键还在按下状态时 也即是低电平
                            num++ ;     
            }
    }    
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ // 捕获中断回调

if(htim->Instance == TIM2){ 
        if((flag &0x80) ==  0  ){ // 还没捕获完成
            if((flag &0x40) ==  0  ){ //下降沿触发
            cout =         HAL_TIM_ReadCapturedValue(&htim2  ,TIM_CHANNEL_1);
            on_val = cout; // 取低电平起始的值
            __HAL_TIM_DISABLE(&htim2); // 失能定时器
            __HAL_TIM_SetCounter(&htim2 , 0 ) ; 
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim2  ,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING); //     
            flag  |= 0x40 ;  // 表示下次该进上升沿了
            __HAL_TIM_ENABLE(&htim2);
    }

            else if(flag & 0x40){ // 上升沿触发
            cout =         HAL_TIM_ReadCapturedValue(&htim2  ,TIM_CHANNEL_1);
            off_val = cout ;// 下降沿取值
            __HAL_TIM_SET_CAPTUREPOLARITY(&htim2  ,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING); // 捕获完成一个周期后重新将极性设为下降沿
            TIM_RESET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4);            //清除原来设置        
            flag |=0x80 ;  // 捕获完成
    }
    }

}
}


void   ic_use(){ // 取值使用
        if(flag& 0x80   ){
            flag = 0 ;  // 清除标志位
        uint32_t temp =     (off_val - on_val)+num *65535/1000; // 这里的除以1000是表示 84mhz的 时钟经过 84分频那个后 就1S计数1000 000  但除以1000后就是1s计数1000个等于1ms一个
            if(temp > 100){
                    printf("%d ms \r\n"  ,temp);
            }
            cout = 0 ;  // 清除数据,为下次做准备
            num = 0; // 清除溢出次数
        }
}

但还有个问题就是有时候按键按下会出现毛刺信号 , 还需要进一步改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值