材料清单
arduino nano(其他型号也可以)、旋转编码器、arduino下载数据线、杜邦线若干。
主要原理
旋转编码器是一种位置传感器,用于确定旋转轴的角度位置。它根据旋转运动产生模拟或数字电信号。
在本篇文章中,我们使用的特定旋转编码器是增量式旋转编码器,它是测量旋转的最简单的位置传感器。该旋转编码器也称为正交编码器或相对旋转编码器,其输出是一系列方波脉冲。(如下图)
前两个引脚(接地和Vcc)用于为编码器供电,通常使用+ 5V电源。除了以顺时针方向和逆时针方向旋转旋钮外,编码器还有一个开关(低电平有效)编码器的按钮在未按下时为高电平,按下时则为低电平,对SW引脚进行电平检测即可判断按钮是否按下。最后它有两个输出引脚,产生脉冲波形。
要详细了解编码器,我们先看看它的工作原理。以下是方波脉冲的产生方式:编码器有一个带有均匀间隔的接触区的磁盘,它们连接到公共引脚C和另外两个独立的接触引脚A和B,如下图所示。
当磁盘逐步开始旋转时,引脚A和B将开始与公共引脚接触,并相应地产生两个方波输出信号。
如果我们只计算信号的脉冲,则可以使用两个输出中的任何一个来确定旋转位置。但是,如果我们想要确定旋转方向,我们需要同时考虑两个信号。
我们可以注意到,两个输出信号相位彼此之间相差90度。如果编码器顺时针旋转,则输出A将在输出B之前;如果编码器逆时针旋转,则输出A将在输出B之后。
进一步地,A信号从高到低或从低到高变化的时刻,我们注意到如果编码器顺时针旋转,那么两个输出信号的值相反;如果编码器逆时针旋转,则输出信号具有相等的值。因此,我们可以轻松地对控制器进行编程以读取编码器的位置和旋转方向。
Let’s get started
电路连接
程序代码
* 电路连接:
* GND-G
* + --5V
* SW-D3:按钮检测
* DT-D4:B信号序列
* CLK-D5:A信号序列
* 参考:https://blog.csdn.net/weixin_42268054/article/details/104415067
*/
#define CLK 5
#define DT 4
#define SW 3
int counter = 0;
int aState;
int aLastState;
int bState;
int bLastState;
int SWState;
int SWLastState;
void setup() {
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW,INPUT_PULLUP);
Serial.begin (9600);
// Reads the initial state of the CLK
aLastState = digitalRead(CLK);
bLastState = digitalRead(DT);
SWLastState = digitalRead(SW);
}
void loop() {
SWState = digitalRead(SW); // 按钮输出状态
aState = digitalRead(CLK); // CLK的输出状态0/1
bState = digitalRead(DT); // DT的输出状态0/1
if (aState != aLastState){ //变化检测
delay(50);//消抖
if (aState != bState) { // 如果A!=B,则表示编码器正在顺时针旋转
counter ++;
}
else{ // 如果A=B,则表示编码器正在逆时针旋转
counter --;
}
Serial.print("num: ");
Serial.println(counter);
}
if (SWState == 0 and SWLastState == 1){
delay(50);//消抖
Serial.println("num: 0");
counter = 0;
while (digitalRead(SW) == 0);//等待按钮抬起
delay(200);
}
// Serial.print("nowSW: ");
// Serial.println(SWState);
aLastState = aState;
SWLastState = SWState;
}
程序运行效果
材料清单
arduino nano(其他型号也可以)、旋转编码器、arduino下载数据线、杜邦线若干。
主要原理
旋转编码器是一种位置传感器,用于确定旋转轴的角度位置。它根据旋转运动产生模拟或数字电信号。
在本篇文章中,我们使用的特定旋转编码器是增量式旋转编码器,它是测量旋转的最简单的位置传感器。该旋转编码器也称为正交编码器或相对旋转编码器,其输出是一系列方波脉冲。(如下图)
前两个引脚(接地和Vcc)用于为编码器供电,通常使用+ 5V电源。除了以顺时针方向和逆时针方向旋转旋钮外,编码器还有一个开关(低电平有效)编码器的按钮在未按下时为高电平,按下时则为低电平,对SW引脚进行电平检测即可判断按钮是否按下。最后它有两个输出引脚,产生脉冲波形。
要详细了解编码器,我们先看看它的工作原理。以下是方波脉冲的产生方式:编码器有一个带有均匀间隔的接触区的磁盘,它们连接到公共引脚C和另外两个独立的接触引脚A和B,如下图所示。
当磁盘逐步开始旋转时,引脚A和B将开始与公共引脚接触,并相应地产生两个方波输出信号。
如果我们只计算信号的脉冲,则可以使用两个输出中的任何一个来确定旋转位置。但是,如果我们想要确定旋转方向,我们需要同时考虑两个信号。
我们可以注意到,两个输出信号相位彼此之间相差90度。如果编码器顺时针旋转,则输出A将在输出B之前;如果编码器逆时针旋转,则输出A将在输出B之后。
进一步地,A信号从高到低或从低到高变化的时刻,我们注意到如果编码器顺时针旋转,那么两个输出信号的值相反;如果编码器逆时针旋转,则输出信号具有相等的值。因此,我们可以轻松地对控制器进行编程以读取编码器的位置和旋转方向。
Let’s get started
电路连接
程序代码
* 电路连接:
* GND-G
* + --5V
* SW-D3:按钮检测
* DT-D4:B信号序列
* CLK-D5:A信号序列
* 参考:https://blog.csdn.net/weixin_42268054/article/details/104415067
*/
#define CLK 5
#define DT 4
#define SW 3
int counter = 0;
int aState;
int aLastState;
int bState;
int bLastState;
int SWState;
int SWLastState;
void setup() {
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW,INPUT_PULLUP);
Serial.begin (9600);
// Reads the initial state of the CLK
aLastState = digitalRead(CLK);
bLastState = digitalRead(DT);
SWLastState = digitalRead(SW);
}
void loop() {
SWState = digitalRead(SW); // 按钮输出状态
aState = digitalRead(CLK); // CLK的输出状态0/1
bState = digitalRead(DT); // DT的输出状态0/1
if (aState != aLastState){ //变化检测
delay(50);//消抖
if (aState != bState) { // 如果A!=B,则表示编码器正在顺时针旋转
counter ++;
}
else{ // 如果A=B,则表示编码器正在逆时针旋转
counter --;
}
Serial.print("num: ");
Serial.println(counter);
}
if (SWState == 0 and SWLastState == 1){
delay(50);//消抖
Serial.println("num: 0");
counter = 0;
while (digitalRead(SW) == 0);//等待按钮抬起
delay(200);
}
// Serial.print("nowSW: ");
// Serial.println(SWState);
aLastState = aState;
SWLastState = SWState;
}
程序运行效果
举报