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


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

拆解 N20 微齿轮电机的编码器组件

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


2

N20 微齿轮电机的电路讲解

编码器组件安装在电机背面,其 PCB 板直接焊接在电机的电源端子上。从编码器的内部电路图来看,核心元件包含这些:

  1. Q1、Q2:两颗 CC6101 霍尔效应传感器;
  2. R1、R2、R3:三个阻值为 3.3 千欧姆的电阻;
  3. D1:一颗 LED 指示灯。
3

N20 微齿轮编码电机的端子功能详解

要实现电机与 Arduino 的正确对接,首先得理清各端子的作用,我整理了关键端子的功能说明:

  1. M1、M2:电机电源端子,接入电源的正负极方向直接决定电机的旋转方向;
  2. GND:公共接地端,需与 Arduino、电机驱动器的接地端保持共地;
  3. C1:编码器 A 相输出端,是编码器反馈信号的核心端子之一;
  4. C2:编码器 B 相输出端,与 C1 配合可判断电机转向并计算转速;
  5. VCC:编码器的供电端,需接入 5V 直流电源。


4

N20 微齿轮编码电机与 Arduino 的硬件连接

我必须提醒大家:绝对不能将电机直接连接到 Arduino 的引脚!因为 Arduino 引脚的驱动能力不足以带动电机,还可能烧毁主控板。因此我选择 L293D 电机驱动器作为中间驱动模块,具体的连接思路是:

  1. Arduino 的数字引脚连接 L293D 的控制端,用于输出电机转向、启停的控制信号;
  2. L293D 的功率输出端连接电机的 M1、M2 端子,为电机提供驱动电流;
  3. 电机的 C1、C2 端子直接连接 Arduino 的数字引脚,用于读取编码器的反馈信号;
  4. 电机编码器的 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

}


总结

  1. N20 微齿轮编码电机的核心是通过霍尔传感器检测磁铁转动,在 C1/C2 端子输出 A/B 相信号反馈转速;
  2. 需借助 L293D 驱动器连接 Arduino 与电机,不可直接将电机接 Arduino 引脚;
  3. 输出轴每转脉冲数 = 编码器单转脉冲数(28)× 齿轮比,是精准控制电机的核心参数。



阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报