标题: 关于中空编码器读脉冲问题 [打印本页]

作者: 一夜暴富    时间: 2021-8-11 20:48
标题: 关于中空编码器读脉冲问题
我的想法是通过外部中断来判断脉冲数但转动一次却总是进入了两次外部中断,导致本来应该走一步的情况却走了两步。

硬件消抖电路大概是这样的。
用示波器测试,黄色代表中断触发,绿色代表输入脉冲信号,如果中断触发,中断引脚的电平就进行一次翻转
结果如图
即明明只是一个上升沿信号,中断却触发了两次,一次升高一次下降


中断代码大致如上
希望各位可以提供一些解题思路


作者: lkc8210    时间: 2021-8-11 20:48
在中断中用while()是什么神仙写法?
中断是用来处理突发/快速的信号
所以中断中的代码越简单越好

而消抖电路也好像有点问题
不转时电容充满当开路
SW_A点为5V
转动时SW_A点接地,瞬间0V
电容对地放电
再转多少少
SW_A点接不接地,电容开始充电当短路
于是SW_A点被两个10k电阻分压得2.5V产生第一次上升沿
电容慢慢充满,电流减少,SW_A点电压慢慢上升
型成第二次上升沿
参考一下别人的消抖电路吧





另外如果转动速度不快
可以不用中断
详情请参考我的贴子:一定位一脉冲的EC11旋转编码器最简洁的单片机驱动代码



作者: Y_G_G    时间: 2021-8-11 21:45
不知道你那是什么
EC11是这样的:
使用定时器,1mS或者500uS判断一下A和B的状态
只要判断哪个先出现低电平而已
如果是静止状态电平不固定,那就判断哪个先出现电平变化
步数不同,方法也不同

作者: wulin    时间: 2021-8-12 08:10
楼主的硬件和软件都不对


  1. #include "reg51.h"

  2. sbit SW_A=P3^3;
  3. //sbit SW_B=P3^2;

  4. unsigned char num;

  5. void main()
  6. {
  7.         INT0 = 1;
  8.         IT0 = 1;                    //设置INT0下降沿中断
  9.         EX0 = 1;                    //使能INT0中断
  10.         EA = 1;
  11.        
  12.         while(1);
  13. }

  14. void exint0() interrupt 0       //INT0中断入口
  15. {
  16.    if(!SW_A)
  17.         {
  18.                 if(num<100)num++;       
  19.         }
  20.         else
  21.         {
  22.                 if(num>0)num--;
  23.         }
  24. }
复制代码




作者: man1234567    时间: 2021-8-12 09:28
楼主的仪器的确有些高大上




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1