使用Arduino控制N20微齿轮电机与编码器

大家好!在嵌入式开发的学习过程中,微型电机的精准控制是小型智能设备开发的核心技能之一。今天我想和大家分享如何使用 Arduino 操控 N20 微齿轮编码电机 —— 这款电机体积小巧,但金属齿轮箱直接集成在输出轴上,使其相对于自身体积而言能输出极高的扭矩,是小型机器人、智能小车等项目的理想选择。N20 微型金属齿轮电机分为带编码器和不带编码器两种型号,本文我会聚焦带编码器的版本,详细讲解编码器的工作原理、电机与 Arduino 的连接方式,以及如何通过编码器向 Arduino 反馈电机转速。
1
拆解 N20 微齿轮电机的编码器组件

这两颗 CC6101 霍尔效应传感器呈一定夹角,安装在固定于电机后轴的圆形磁铁上方。当电机旋转时,后轴的磁铁同步转动,霍尔效应传感器会实时检测磁铁的运动状态,并在 C1 和 C2 端子产生对应的电信号输出,这也是编码器能反馈转速的核心原理。
2
N20 微齿轮电机的电路讲解

编码器组件安装在电机背面,其 PCB 板直接焊接在电机的电源端子上。从编码器的内部电路图来看,核心元件包含这些:
- Q1、Q2:两颗 CC6101 霍尔效应传感器;
- R1、R2、R3:三个阻值为 3.3 千欧姆的电阻;
- D1:一颗 LED 指示灯。
3
N20 微齿轮编码电机的端子功能详解

要实现电机与 Arduino 的正确对接,首先得理清各端子的作用,我整理了关键端子的功能说明:
- M1、M2:电机电源端子,接入电源的正负极方向直接决定电机的旋转方向;
- GND:公共接地端,需与 Arduino、电机驱动器的接地端保持共地;
- C1:编码器 A 相输出端,是编码器反馈信号的核心端子之一;
- C2:编码器 B 相输出端,与 C1 配合可判断电机转向并计算转速;
- VCC:编码器的供电端,需接入 5V 直流电源。
4
N20 微齿轮编码电机与 Arduino 的硬件连接

我必须提醒大家:绝对不能将电机直接连接到 Arduino 的引脚!因为 Arduino 引脚的驱动能力不足以带动电机,还可能烧毁主控板。因此我选择 L293D 电机驱动器作为中间驱动模块,具体的连接思路是:
- Arduino 的数字引脚连接 L293D 的控制端,用于输出电机转向、启停的控制信号;
- L293D 的功率输出端连接电机的 M1、M2 端子,为电机提供驱动电流;
- 电机的 C1、C2 端子直接连接 Arduino 的数字引脚,用于读取编码器的反馈信号;
- 电机编码器的 VCC 接 5V 电源、GND 接公共地,确保整个系统供电和接地统一。
5
N20 电机编码器脉冲数的计算方法

要通过编码器值精准计算电机转速或转动圈数,必须先明确脉冲数的换算逻辑。我实测并整理了这款电机的核心参数:
编码器每旋转一圈能产生 28 个脉冲,而电机输出轴的旋转圈数需要结合齿轮比计算 —— 输出轴每旋转一圈,对应的编码器脉冲数 = 编码器每转脉冲数 × 齿轮比。以齿轮比 100:1 的 N20 电机为例,输出轴每转一圈的脉冲数 = 28×100=2800 个脉冲 / 转。掌握这个换算关系,后续才能通过编码器数值精准把控电机的转速和转动位置。
(注:我会在后续文章中分享基于 PID 算法的 N20 电机位置控制,本文的基础代码仅实现电机正反转控制,并通过串口监视器输出编码器数值 —— 电机正向转动时编码器值递增,反向转动时数值递减,帮助大家理解编码器的基础反馈逻辑。)
#define MotFwd 3 // Motor Forward pin
#define MotRev 4 // Motor Reverse pin
int encoderPin1 = 2; //Encoder Output 'A' must connected with intreput pin of arduino.
int encoderPin2 = 3; //Encoder Otput 'B' must connected with intreput pin of arduino.
volatile int lastEncoded = 0; // Here updated value of encoder store.
volatile long encoderValue = 0; // Raw encoder value
void setup() {
pinMode(MotFwd, OUTPUT);
pinMode(MotRev, OUTPUT);
Serial.begin(9600); //initialize serial comunication
pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);
digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
//call updateEncoder() when any high/low changed seen
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
}
void loop() {
for (int i = 0; i <= 500; i++){
digitalWrite(MotFwd, LOW);
digitalWrite(MotRev, HIGH);
Serial.print("Forward ");
Serial.println(encoderValue);
}
delay(1000);
for (int i = 0; i <= 500; i++){
digitalWrite(MotFwd, HIGH);
digitalWrite(MotRev, LOW);
Serial.print("Reverse ");
Serial.println(encoderValue);
}
delay(1000);
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue --;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue ++;
lastEncoded = encoded; //store this value for next time
}
总结
- N20 微齿轮编码电机的核心是通过霍尔传感器检测磁铁转动,在 C1/C2 端子输出 A/B 相信号反馈转速;
- 需借助 L293D 驱动器连接 Arduino 与电机,不可直接将电机接 Arduino 引脚;
- 输出轴每转脉冲数 = 编码器单转脉冲数(28)× 齿轮比,是精准控制电机的核心参数。
0
0
0
qq空间
微博
复制链接
分享 更多相关项目
猜你喜欢
评论/提问(已发布 0 条)
0