初级会员

- 积分
- 60
- 金钱
- 60
- 注册时间
- 2020-6-30
- 在线时间
- 19 小时
|
编码器一般分为AB两项,我们可以通过外部下降沿中断检测A项,同时在中断响应函数中检测B项的电平状态,若为高,则累加,若为低,则递减。
中断检测A项的下降沿往往会遇到毛刺干扰,硬件消抖,一般可以加上104电容。软件消抖:在下降沿中断触发时,可以通过延时消抖,这里没有任何问题,
但是大家往往会忽略A项上升沿时产生的错误下降沿抖动,若此时继续检测B项电平,则会导致编码器计数错误。本人设计了一中编码器消抖算法,
实验效果非常好。
中断中代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == Encoder_exti_Pin)
{
HAL_Delay(1); //==使用延时不能过长,否则当电机速度较快时会出错
if(HAL_GPIO_ReadPin(Encoder_exti_GPIO_Port,Encoder_exti_Pin) == GPIO_PIN_RESET) //==核心是这句话,延时过之后,重新检测中断引脚的电平,以保证是正常触发,而不是抖动触发
{
if(HAL_GPIO_ReadPin(Encoder_input_GPIO_Port,Encoder_input_Pin) == GPIO_PIN_SET)
{
if(encoder_inf.Encoder_speed < 0) encoder_inf.Encoder_speed = 0;
encoder_inf.Encoder_accum++;
encoder_inf.Encoder_speed++;
}
else
{
if(encoder_inf.Encoder_speed > 0) encoder_inf.Encoder_speed = 0;
encoder_inf.Encoder_accum--;
encoder_inf.Encoder_speed--;
if(encoder_inf.Encoder_accum <= 1)encoder_inf.Encoder_accum = 1;
}
}
}
}
一点小心得,分享给大家。
|
|