测试的实物连接图如下,测试的视频在连接图之后:int Led =4; //定义LED 接口
int coderPin = 10;
void setup()
{
pinMode(Led, OUTPUT);
pinMode(coderPin, INPUT);
digitalWrite(coderPin,HIGH);
Serial.begin(9600);
}
void loop()
{
val = digitalRead(coderPin);
if (val==HIGH)
{
digitalWrite(Led, HIGH);
}
else
{
digitalWrite(Led,LOW );
}
}
读出来的数据放到matlab里面做成图,图形如下左上角是DT引脚的输出点图,右上角是CLK引脚的输出点图,左下角是DT引脚和CLK引脚数据和到一起的点图,右下角是DT引脚输出值与CLK引脚输出值的和的图。好像也看不出来什么东西。int Led =4; //定义LED 接口
int coderPin = 10;
int dtPin=11;
int clkPin=12;
int val=0;
void setup()
{
pinMode(Led, OUTPUT);
pinMode(coderPin, INPUT);
digitalWrite(coderPin,HIGH);
pinMode(dtPin, INPUT);
pinMode(clkPin, INPUT);
Serial.begin(9600);
}
void loop()
{
val = digitalRead(coderPin);
Serial.print(val);
val = digitalRead(dtPin);
Serial.print(",");
Serial.print(val);
val = digitalRead(clkPin);
Serial.print(",");
Serial.println(val);
}
这时候只有在转动旋转编码器的时候才会有数据向串口输出,将输出的数据整理为图形如下,下图是顺时针时获取到的数据图形,红色的是CLK引脚的输出值,蓝色的是DT引脚的输出,可以看到这两个引脚的输出大部分时候都是相反的,CLK为0时,对应位置的DT输出大部分为1://定义引脚连接
int CLK = 2;
int DT = 11;
const int interrupt0 = 0;
void setup()
{
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
attachInterrupt(interrupt0, ClockChanged, CHANGE);//设置中断0的处理函数,电平变化触发
Serial.begin(9600);
}
void loop()
{
}
//中断处理函数
void ClockChanged()
{
int clkValue = digitalRead(CLK);//读取CLK引脚的电平
int dtValue = digitalRead(DT);//读取DT引脚的电平
Serial.print(clkValue);
Serial.print(",");
Serial.println(dtValue);
}
//定义引脚连接
#define CW_START_CLK 0
#define CW_START_DT 0
#define CW_END_CLK 1
#define CW_END_DT 1
#define CCW_START_CLK 0
#define CCW_START_DT 1
#define CCW_END_CLK 1
#define CCW_END_DT 0
int CLK = 2;//CLK->D2
int DT = 11;//DT->D3
int SW = 10;//SW->D4
const int interrupt0 = 0;// Interrupt 0 在 pin 2 上
int count = 0;//计数值
int lastCLK = 0;//CLK历史值
int stage = -1; //两个阶段,0,开始,1,进行
void setup()
{
pinMode(SW, INPUT);
digitalWrite(SW, HIGH);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
attachInterrupt(interrupt0, ClockChanged, CHANGE);//设置中断0的处理函数,电平变化触发
Serial.begin(9600);
}
void loop()
{
if (!digitalRead(SW) && count != 0) //读取到按钮按下并且计数值不为0时把计数器清零
{
count = 0;
Serial.print("count:");
Serial.println(count);
}
}
//中断处理函数
void ClockChanged()
{
int clkValue = digitalRead(CLK);//读取CLK引脚的电平
int dtValue = digitalRead(DT);//读取DT引脚的电平
if ((clkValue == CW_START_CLK) && (dtValue == CW_START_DT))
{
if (stage == -1)
{
stage = 0;
}
else if (stage == 1)
{
stage = 0;
count++;
Serial.print("count:");
Serial.println(count);
}
}
else if ((clkValue == CW_END_CLK) && (dtValue == CW_END_DT))
{
if (stage == 0)
{
stage = 1;
}
}
else if ((clkValue == CW_START_CLK) && (dtValue == CCW_START_DT))
{
if (stage == -1)
{
stage = 0;
}
else if (stage == 1)
{
stage = 0;
count--;
Serial.print("count:");
Serial.println(count);
}
}
else if ((clkValue == CCW_END_CLK) && (dtValue == CCW_END_DT))
{
if (stage == 0)
{
stage = 1;
}
}
}