|
使用STM8S003做两个编码器的四倍频采集。有时候会一直不停的进入中断,导致串口不能进入串口接收中断,数据不能交互。
stm8又不像32一样可以清除中断标志位之类的。请教各位有什么办法解决这个问题。
当进入外部中断死循环的时候 示波器检测不到编码器有脉冲信号输出的
//这是中断的初始化
void Encoder_X_GPIO_Init(void)
{
GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_IN_FL_IT);//B
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_FL_IT);//A
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_FALL);
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);//B
GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_IN_FL_IT);//A
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_FALL);
GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_OUT_PP_HIGH_FAST);//B
}
外部中断里面就是对AB进行识别方向,以便对脉冲数进行加减的
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
{
if (!GPIO_ReadInputPin(GPIOC, GPIO_PIN_7))
{
XEnCoderA = 0 ;
if (!GPIO_ReadInputPin(GPIOC, GPIO_PIN_6))
{
XEnCoderB = 0 ;
}
else if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_6))
{
XEnCoderB = 1 ;
}
}
else if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_7))
{
XEnCoderA = 1 ;
if (!GPIO_ReadInputPin(GPIOC, GPIO_PIN_6))
{
XEnCoderB = 0 ;
}
else if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_6))
{
XEnCoderB = 1 ;
}
}
if (!GPIO_ReadInputPin(GPIOC, GPIO_PIN_5))
{
YEnCoderA = 0 ;
if (!GPIO_ReadInputPin(GPIOC, GPIO_PIN_4))
{
YEnCoderB = 0 ;
}
else if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_4))
{
YEnCoderB = 1 ;
}
}
else if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_5))
{
YEnCoderA = 1 ;
if (!GPIO_ReadInputPin(GPIOC, GPIO_PIN_4))
{
YEnCoderB = 0 ;
}
else if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_4))
{
YEnCoderB = 1 ;
}
}
MotorX_phase_check();
MotorY_phase_check();
// en_change = 1;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|