求助:霍尔编码器的用法
我用的是这种编码器测速,
按照图片是上升沿触发中断,我用
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, 无论怎么转马达方向,都没用!!
请问是什么原因?!
164335413 发表于 2016-7-15 10:54 static/image/common/back.gif
速度和位置都可以,只是用作位置的话,会需要限位开关或者手动校准零点。
那建议你不要用霍尔,霍尔的精度不够,增量式光电编码器效果要要些。 void ENCODER_L()
{
if (micros() - ECL_timer > 1000)
{
if (direct_LR & 0x01)
count_L++;
else
count_L--;
ECL_timer = micros();
FLAG |= ENCL;
}
}
void ENCODER_R()
{
if (micros() - ECR_timer > 1000)
{
if (direct_LR & 0x02)
count_R++;
else
count_R--;
ECR_timer = micros();
FLAG |= ENCR;
}
}怎么把这里改成AB相的 只是用来测速度吗?与编码器的使用方式是类似的。 好奇吖斌 发表于 2016-7-12 20:15 static/image/common/back.gif
怎么把这里改成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();
}
这种可以。 PINKWALKMAN 发表于 2016-7-14 17:32 static/image/common/back.gif
只是用来测速度吗?与编码器的使用方式是类似的。
速度和位置都可以,只是用作位置的话,会需要限位开关或者手动校准零点。 本帖最后由 好奇吖斌 于 2016-7-15 11:34 编辑
164335413 发表于 2016-7-15 10:53 static/image/common/back.gif
void Code1()
{
//为了不计入噪音干扰脉冲,
我在做平衡小车,遇到好多问题,新手入门,都不怎么会这些东西。帮我看看这个Nano平衡小车http://pengzhihui.xyz/2015/12/09/nano/,我是按照这个做的,我用的是AB相编码器,教程是单相,不会改程序 明白了,里面的 digitalRead(PinB_left) ==LOW 需要根据实际现象来确定是HIGH还是LOWvoid ENCODER_L()
{
if (micros() - ECL_timer > 1000)
{
if (digitalRead(PinB_left) == LOW)
count_L++;
else
count_L--;
ECL_timer = micros();
FLAG |= ENCL;
}
}
void ENCODER_R()
{
if (micros() - ECR_timer > 1000)
{
if (digitalRead(PinB_right) == LOW)
count_R++;
else
count_R--;
ECR_timer = micros();
FLAG |= ENCR;
}
} PINKWALKMAN 发表于 2016-7-16 16:28 static/image/common/back.gif
那建议你不要用霍尔,霍尔的精度不够,增量式光电编码器效果要要些。
看用于什么地方,一圈11和一圈340,精度当然差很多。 好奇吖斌 发表于 2016-7-15 11:33 static/image/common/back.gif
我在做平衡小车,遇到好多问题,新手入门,都不怎么会这些东西。帮我看看这个Nano平衡小车http://pengz ...
哈哈,我也是在看这个代码,我也无法实现 彻底的平衡,也就是 角度环,速度环,方向环这三个互相作用下的平衡,你可以加我Q 175279857 一起探讨一下 164335413 发表于 2016-7-18 09:40 static/image/common/back.gif
看用于什么地方,一圈11和一圈340,精度当然差很多。
我现在改用 334线的 光电 AB相 编码器, 比霍尔的明显精准的多了,但是我毕竟还是没有实现 楼上那位兄台的 NANO 平衡车的功能 楼主问题解决了吗?怎么用霍尔传感器来测速?新人求助 星空为我而闪耀 发表于 2016-10-9 19:05
楼主问题解决了吗?怎么用霍尔传感器来测速?新人求助
然并卵,我是想做平衡车 164335413 发表于 2016-7-15 10:53
void Code1()
{
//为了不计入噪音干扰脉冲,
你好,我询问下,if(digitalRead(PinB_right) == LOW)count2 ++ 能理解,FALLING触发中断, 其中“else if(digitalRead(PinB_right) == HIGH) count2 --” 也是FALLING中断触发,低电平,哪里来的高电平 ? 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个周期。一楼额时序图你看一下,应该能理解。
页:
[1]
2