旋转编码器原理与 Arduino 实战:从基础到步进电机控制
增量式旋转编码器工作原理
编码器内部圆盘有等间距触点,公共引脚 C 与 A、B 两路输出接触,产生**相位相差 90° 的方波**(正交编码)。
- 顺时针:A 超前 B → A 变化时 B 为相反电平
- 逆时针:A 滞后 B → A 变化时 B 为相同电平
只需检测 A 的跳变沿,读取 B 电平即可判断方向并计数。
Arduino 基础读取代码
#define outputA 6
#define outputB 7
int counter = 0;
int aLastState;
void setup() {
pinMode(outputA, INPUT);
pinMode(outputB, INPUT);
Serial.begin(9600);
aLastState = digitalRead(outputA);
}
void loop() {
int aState = digitalRead(outputA);
if (aState != aLastState) { // 检测到脉冲
if (digitalRead(outputB) != aState) counter++; // 顺时针
else counter--; // 逆时针
Serial.print("Position: "); Serial.println(counter);
}
aLastState = aState;
}
模块自带按键(按下接地),可扩展复位/确认功能。典型分辨率 30 脉冲/圈。
进阶应用:编码器控制步进电机角度
结合 A4988 驱动,编码器每格对应 1.8°(全步)或细分后更小角度。代码中累计 angle 变量,正转调用 rotateCW(),反转调用 rotateCCW(),LCD 实时显示当前角度。
void rotateCW() {
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH); delayMicroseconds(2000);
digitalWrite(stepPin, LOW); delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH); delayMicroseconds(2000);
digitalWrite(stepPin, LOW); delayMicroseconds(2000);
}
可用于手动微调平台、CNC 手轮、机械臂示教器等场景。
制造工艺
- Arduino + MPU6050 姿态控制舵机:SG90 与 MG996R 精准跟随实战
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
- Blynk + Arduino 读取 DHT11 温湿度数据教程
- 热敏电阻测温轻松上手:Arduino 分步实战教程
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- Arduino 连接 NMEA-0183 设备全攻略:从硬件接线到协议解析
- Arduino Modbus 从机开发全攻略:基于 RS485 扩展板的分步实现指南
- 语音控制 LED:Arduino Micro + BitVoicer Server 语音识别实战
- 自制 AI 助手机器人:Arduino 与 Python 协同实现语音交互与肢体动作
- 树莓派 3 + Arduino 驱动 NeoPixel 灯带:Web 网页端炫彩动画控制器
- 精通 C# Queue:Enqueue、Dequeue 与先进先出操作全解析