-1.编码器基础
正转:A相上升沿时B相低电平,A相下降沿时B相高电平
即:A0-1时B0,A1-0时B1,此时A不等于B
反转:A相上升沿时B相高电平,A相下降沿时B相低电平
即:A0-1时B1,A1-0时B0,此时A=B
0.参数
5-24V,树莓派的5V可用
400脉冲,0-500mm
测量轮周长50mm
分辨率=测量轮周长/脉冲数=50/400=0.125(mm/脉冲)
即每脉冲对应0.125mm
红线接VCC
黑线接GND(0V)
绿线为A相
白线为B相
1.接线图
2.代码,能跑
//Arduino拉线式编码器,两相
//由于Arduino uno外部中断只有2 3口,因此选择2 3引脚进行控制
#define APin 3//Encoder的A相引脚,绿线
#define BPin 2//Encoder的B相引脚,白线
volatile long count=0;//定义计数变量
void setup()
{ Serial.begin(9600);
//设置编码器引脚为输入
pinMode(APin, INPUT_PULLUP);
pinMode(BPin, INPUT_PULLUP);
//为引脚添加中断函数
attachInterrupt(digitalPinToInterrupt(APin),count_A,CHANGE);//当电平发生改变时触发中断函数
//attachInterrupt(中断引脚,中断函数,CHANGE)
//CHANGE: 当引脚电平发生变化时触发中断服务程序
}
void loop()//闭循环
{
Serial.print("the number of pulse of encoder:");
Serial.println(count);
Serial.print("距离");
Serial.println(count*0.125);
//初始count=0;
}
void count_A()//定义中断函数 ——编码器计数函数
{int a=digitalRead(APin);//将高低电平转化为int型数值
int b=digitalRead(BPin);
if(a==b)
//a为上升沿的时 b为1 或者a为下降沿时 b为0
{
count++;//顺时针转动,对应拉线传感器往外拉出
}else{
//a为上升沿的时 b为0 或者a为下降沿时 b为1
count--;//逆时针转动,对应拉线传感器向内缩回
}
}