极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 64290|回复: 17

求助:霍尔编码器的用法

[复制链接]
发表于 2016-7-11 21:53:04 | 显示全部楼层 |阅读模式
我用的是

这种编码器测速,




按照图片是上升沿触发中断,我用

int OUT1=2;

attachInterrupt(digitalPinToInterrupt(OUT1),COUNT1,RISING);


void COUNT1()
{
   if(digitalRead(PinDir)==LOW)
    {
      flag=0x7F;//电机当前转向为正转,则转向标志为0x7F
    }
   //如果编码器码盘的正交编码板OUTA脉冲信号下跳沿中断时,
  //正交编码板OUTA为高电平,则当前电机转向为反转。
   else
    {
     flag=0xFF; //电机当前转向为反转,则转向标志为0xFF
    }  

    if((millis()-time_delay) > 5)
    {
       if(flag==0x7F)
         c1++;
       else
         c1--;
     }
  time_delay=millis();
      
}


这样 应该  FLAG 会 随着 电机 正反转 表现为 高电平1 或是 低电平0 的,但是一直都是1 ,也就是  flag 为  255, 无论怎么转马达方向,都没用!!

请问是什么原因?!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-7-16 16:28:44 | 显示全部楼层
164335413 发表于 2016-7-15 10:54
速度和位置都可以,只是用作位置的话,会需要限位开关或者手动校准零点。

那建议你不要用霍尔,霍尔的精度不够,增量式光电编码器效果要要些。
回复 支持 0 反对 1

使用道具 举报

发表于 2016-7-12 20:15:09 | 显示全部楼层
  1. void ENCODER_L()
  2. {
  3.   if (micros() - ECL_timer > 1000)
  4.   {
  5.     if (direct_LR & 0x01)
  6.       count_L++;
  7.     else
  8.       count_L--;
  9.     ECL_timer = micros();
  10.     FLAG |= ENCL;
  11.   }
  12. }

  13. void ENCODER_R()
  14. {
  15.   if (micros() - ECR_timer > 1000)
  16.   {
  17.     if (direct_LR & 0x02)
  18.       count_R++;
  19.     else
  20.       count_R--;
  21.     ECR_timer = micros();
  22.     FLAG |= ENCR;
  23.   }
  24. }
复制代码
怎么把这里改成AB相的
回复 支持 反对

使用道具 举报

发表于 2016-7-14 17:32:19 | 显示全部楼层
只是用来测速度吗?与编码器的使用方式是类似的。
回复 支持 反对

使用道具 举报

发表于 2016-7-15 10:53:18 | 显示全部楼层
好奇吖斌 发表于 2016-7-12 20:15
怎么把这里改成AB相的

void Code1()
{  
  //为了不计入噪音干扰脉冲,
   //当2次中断之间的时间大于5ms时,计一次有效计数
  if((millis()-time1)>1)
    if(digitalRead(PinB_left) == LOW)
  //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,
      count1 ++; // 编码器码盘计数加一
    else if(digitalRead(PinB_left) == HIGH)
      count1 --;
  if(count1>1000)
    count1 =1000;
  else if(count1 < -1000)
    count1 = -1000;
  time1 = millis();
}
//**/ 右侧车轮电机的编码器码盘计数中断子程序
void Code2()
{  
  if((millis()-time2)>1)
  {
    if(digitalRead(PinB_right) == LOW)
  //当编码器码盘的OUTA脉冲信号下跳沿每中断一次,
      count2 ++; // 编码器码盘计数加一
    else if(digitalRead(PinB_right) == HIGH)
      count2 --;
  }
  if(count2>1000)
    count2 =1000;
  else if(count2 < -1000)
    count2 = -1000;
  time2 = millis();  
}
这种可以。
回复 支持 反对

使用道具 举报

发表于 2016-7-15 10:54:15 | 显示全部楼层
PINKWALKMAN 发表于 2016-7-14 17:32
只是用来测速度吗?与编码器的使用方式是类似的。

速度和位置都可以,只是用作位置的话,会需要限位开关或者手动校准零点。
回复 支持 反对

使用道具 举报

发表于 2016-7-15 11:33:38 | 显示全部楼层
本帖最后由 好奇吖斌 于 2016-7-15 11:34 编辑
164335413 发表于 2016-7-15 10:53
void Code1()
{  
  //为了不计入噪音干扰脉冲,


我在做平衡小车,遇到好多问题,新手入门,都不怎么会这些东西。帮我看看这个Nano平衡小车http://pengzhihui.xyz/2015/12/09/nano/,我是按照这个做的,我用的是AB相编码器,教程是单相,不会改程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-7-15 13:16:29 | 显示全部楼层
明白了,里面的 digitalRead(PinB_left) ==LOW 需要根据实际现象来确定是HIGH还是LOW
  1. void ENCODER_L()
  2. {
  3.   if (micros() - ECL_timer > 1000)
  4.   {
  5.     if (digitalRead(PinB_left) == LOW)
  6.       count_L++;
  7.     else
  8.       count_L--;
  9.     ECL_timer = micros();
  10.     FLAG |= ENCL;
  11.   }
  12. }

  13. void ENCODER_R()
  14. {
  15.   if (micros() - ECR_timer > 1000)
  16.   {
  17.     if (digitalRead(PinB_right) == LOW)
  18.       count_R++;
  19.     else
  20.       count_R--;
  21.     ECR_timer = micros();
  22.     FLAG |= ENCR;
  23.   }
  24. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2016-7-18 09:40:16 | 显示全部楼层
PINKWALKMAN 发表于 2016-7-16 16:28
那建议你不要用霍尔,霍尔的精度不够,增量式光电编码器效果要要些。

看用于什么地方,一圈11和一圈340,精度当然差很多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-10 17:49:09 | 显示全部楼层
好奇吖斌 发表于 2016-7-15 11:33
我在做平衡小车,遇到好多问题,新手入门,都不怎么会这些东西。帮我看看这个Nano平衡小车http://pengz ...

哈哈,我也是在看这个代码,我也无法实现 彻底的平衡,也就是 角度环,速度环,方向环这三个互相作用下的平衡,你可以加我Q 175279857 一起探讨一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-10 17:50:31 | 显示全部楼层
164335413 发表于 2016-7-18 09:40
看用于什么地方,一圈11和一圈340,精度当然差很多。

我现在改用 334线的 光电 AB相 编码器, 比霍尔的明显精准的多了,但是我毕竟还是没有实现 楼上那位兄台的 NANO 平衡车的功能
回复 支持 反对

使用道具 举报

发表于 2016-10-9 19:05:23 | 显示全部楼层
楼主问题解决了吗?怎么用霍尔传感器来测速?新人求助
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-5 15:56:00 | 显示全部楼层
星空为我而闪耀 发表于 2016-10-9 19:05
楼主问题解决了吗?怎么用霍尔传感器来测速?新人求助

然并卵,我是想做平衡车
回复 支持 反对

使用道具 举报

发表于 2017-2-14 09:56:13 | 显示全部楼层
164335413 发表于 2016-7-15 10:53
void Code1()
{  
  //为了不计入噪音干扰脉冲,

你好,我询问下,if(digitalRead(PinB_right) == LOW)  count2 ++ 能理解,FALLING触发中断, 其中“else   if(digitalRead(PinB_right) == HIGH)   count2 --” 也是FALLING中断触发,低电平,哪里来的高电平 ?
回复 支持 反对

使用道具 举报

发表于 2017-2-14 13:10:53 | 显示全部楼层
ignore 发表于 2017-2-14 09:56
你好,我询问下,if(digitalRead(PinB_right) == LOW)  count2 ++ 能理解,FALLING触发中断, 其中“else ...

这是AB相的码盘,A作为中断触发,B作为方向判断如果pinB是HIGH就认为是正转,如果是LOW就认为是反转。AB相相差1/4个周期或者 1+1/4个周期。一楼额时序图你看一下,应该能理解。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 08:02 , Processed in 0.061222 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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