1.消抖的意义
消抖是指在信号传输或者控制过程中,由于各种原因引起的信号抖动或者干扰,需要进行处理以确保信号的准确性和稳定性。消抖时间可以根据不同产品设置不同的时间,常用的消抖方式有延时或者滤波。使用延时消抖应避免阻塞,如:_NOP();while();的使用,这种延时方式会占用大量的单片机资源,在实时性要求较高的场合下使用往往会打乱运行逻辑,造成数据错误等;非阻塞的延时大多用系统定时器来封装,时基一般设置为1ms(如果时基过小,频繁的时钟中断会占用太多的系统资源,尤其是对于低功耗的mcu来讲,这会大大减少其使用寿命),中断函数内部计数变量一直自加,通过对计数标志的判断来实现延时的目的。
2.键盘消抖
对于键盘消抖,一般可以通过软件或者硬件的方式进行处理。在软件层面,可以设置一个时间窗口,在这个时间窗口内只接受第一个按键信号,后续的按键信号会被忽略。具体的时间窗口设置可以根据实际情况进行调整,一般在几十毫秒。
3.按键消抖
对于按键消抖,也可以采用类似的方法进行处理。在硬件层面,可以使用电容或者电阻等元件来进行消抖。这些元件可以通过滤波或者延时的方式来确保只有稳定的按键信号被传递。
4.电机消抖
对于电机消抖,主要是指在电机启动或者停止时可能会产生的震动或者抖动。这种情况下,可以通过控制电机的加速度和减速度来减少抖动。同时,也可以通过机械设计上的改进来减少电机的震动,一般设置在一百到几百毫秒。
使用systick 非阻塞延时(参考博主STM32实现延时(Systick+Tim)_stm32定时器延时-CSDN博客)
//systick定时器初始化
void SystickInit(void)
{
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
SysTick_Config(rcc_clocks.HCLK_Frequency / 1000);
}
实现微秒级延时
void TIM3Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启时钟
TIM_TimeBaseInitStruct.TIM_Period = 0xffff; //装载计数值
TIM_TimeBaseInitStruct.TIM_Prescaler = 42 - 1; //装载预分频值,1us
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //预分频值为1
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数方式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); //进行定时器配置
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
// 微秒延时
void delay_us(uint16_t us)
{
u16 tp1;
u16 tp2;
u16 dif;
tp1 = TIM3->CNT;
while(1)
{
tp2 = TIM3->CNT;
dif = tp2 - tp1;
if(dif >= us)
break;
}
}
非阻塞消抖示例
if(!SbTouchKeyLock) //避免多次触发长按功能
{
Su16TouchKeyCnt++; //按下计时
if(Su16TouchKeyCnt >= 20) //大于20ms才算按下,以此来延时消抖,并且不会阻塞系统
{
SbKeyShortPressFlag = 1; //已有短按
}
//-------------------------------------------------------------------
if(Su16TouchKeyCnt >= 2000) //长按2s后,取消短按/锁住长按
{
SbTouchKeyLock = 1;
SbKeyShortPressFlag = 0;//取消短按
//长按标志/长按任务
}
}
//--------------------------------------------------------------------
// 电机消抖
//-------------------------------------------------------------------
if(MotorCurrent > MaxCurrent)
{
if(++MotorCurrentCnt>100)
{
MotorCurrent=MaxCurrent;
SetBit(bx,v)
}
}
else if(MotorCurrentCnt)
{
MotorCurrentCnt--;
}
总之,消抖的具体设置时间需要根据实际情况进行调整,以确保信号的准确性和稳定性。