输入捕获的知识
分频值设为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; // 清除溢出次数
}
}
但还有个问题就是有时候按键按下会出现毛刺信号 , 还需要进一步改进。