搜索
bottom↓
回复: 12

STM8S003做两个编码器的四倍频采集,会在外部中断不停的循环

[复制链接]

出0入18汤圆

发表于 2017-4-25 14:17:44 | 显示全部楼层 |阅读模式
使用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》

出0入0汤圆

发表于 2017-4-25 14:41:22 | 显示全部楼层
不是有编码器模式嘛

出0入18汤圆

 楼主| 发表于 2017-4-25 14:53:08 | 显示全部楼层
只有一个编码器接口  所以就懒得用  直接都用外部中断了 频率也不高 就是一个直线的光栅尺

出0入0汤圆

发表于 2017-4-25 14:53:38 | 显示全部楼层
编码器是需要用编码器模式才好搞,编码器线数多时候外部中断检测不是很现实,特别你这还用到两个编码器

出0入18汤圆

 楼主| 发表于 2017-4-25 15:00:11 | 显示全部楼层
亽亼 发表于 2017-4-25 14:53
编码器是需要用编码器模式才好搞,编码器线数多时候外部中断检测不是很现实,特别你这还用到两个编码器 ...

这个是没问题的 我上午摇了一个上午  出现三次通信失败  每次检查都是 一直在外部中断里面蹦跶  导致串口进不去中断(外部中断优先级高于串口中断)
modbus就连接不上了

出0入21汤圆

发表于 2017-4-25 15:51:02 | 显示全部楼层
这样用光栅尺的脉冲不会丢步?

出0入0汤圆

发表于 2017-4-25 16:09:36 | 显示全部楼层
himan 发表于 2017-4-25 15:00
这个是没问题的 我上午摇了一个上午  出现三次通信失败  每次检查都是 一直在外部中断里面蹦跶  导致串口 ...

不知你有没有用示波器看过你的编码器信号,之前有个客户给了个电机,那个编码器完全就是个大坑,信号跳动非常厉害

出0入18汤圆

 楼主| 发表于 2017-4-25 16:34:36 | 显示全部楼层
qd118118 发表于 2017-4-25 15:51
这样用光栅尺的脉冲不会丢步?

不会呀  50mm的距离  四倍频之后 从0到50  妥妥的50000个脉冲

出0入18汤圆

 楼主| 发表于 2017-4-25 16:36:00 | 显示全部楼层
亽亼 发表于 2017-4-25 16:09
不知你有没有用示波器看过你的编码器信号,之前有个客户给了个电机,那个编码器完全就是个大坑,信号跳动 ...

看了   光栅尺静止的时候  信号比较稳定  后面还有74HC14非门整形

出0入21汤圆

发表于 2017-4-25 18:58:25 | 显示全部楼层
himan 发表于 2017-4-25 16:34
不会呀  50mm的距离  四倍频之后 从0到50  妥妥的50000个脉冲

003的编码器模式花了不少时间才搞定(我只会用寄存器编程),早知如此还是用中断口简单多了,另外比如说1秒行程200毫米的速度,读数可靠吗?

出0入18汤圆

 楼主| 发表于 2017-4-25 21:48:44 | 显示全部楼层
qd118118 发表于 2017-4-25 18:58
003的编码器模式花了不少时间才搞定(我只会用寄存器编程),早知如此还是用中断口简单多了,另外比如说1 ...

看你光栅尺的线数喽  频率快的话 肯定不行的  我只要是双光栅尺才使用的中断  单光栅尺我使用的是编码器接口

出0入0汤圆

发表于 2017-4-26 08:08:36 | 显示全部楼层
尽量用编码器接口吧

出0入0汤圆

发表于 2017-4-26 13:00:25 | 显示全部楼层
用cpld也很简单!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 17:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表