Skip to content Skip to footer

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

使用Arduino控制N20微齿轮电机与编码器JAYJAY原创 发布时间: 2026-01-22 15:34:46 | 0 0 0 0ArduinoArduinoN20 微齿轮电机编码器电机L293D电机转速控制大家好!在嵌入式开发的学习过程中,微型电机的精准控制是小型智能设备开发的核心技能之一。今天我想和大家分享如何使用 Arduino 操控 N20 微齿轮编码电机 —— 这款电机体积小巧,但金属齿轮箱直接集成在输出轴上,使其相对于自身体积而言能输出极高的扭矩,是小型机器人、智能小车等项目的理想选择。N20 微型金属齿轮电机分为带编码器和不带编码器两种型号,本文我会聚焦带编码器的版本,详细讲解编码器的工作原理、电机与 Arduino 的连接方式,以及如何通过编码器向 Arduino 反馈电机转速。1 拆解 N20 微齿轮电机的编码器组件 这两颗 CC6101 霍尔效应传感器呈一定夹角,安装在固定于电机后轴的圆形磁铁上方。当电机旋转时,后轴的磁铁同步转动,霍尔效应传感器会实时检测磁铁的运动状态,并在 C1 和 C2 端子产生对应的电信号输出,这也是编码器能反馈转速的核心原理。

2N20 微齿轮电机的电路讲解编码器组件安装在电机背面,其 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 直流电源。

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

Arduino 的数字引脚连接 L293D 的控制端,用于输出电机转向、启停的控制信号;L293D 的功率输出端连接电机的 M1、M2 端子,为电机提供驱动电流;电机的 C1、C2 端子直接连接 Arduino 的数字引脚,用于读取编码器的反馈信号;电机编码器的 VCC 接 5V 电源、GND 接公共地,确保整个系统供电和接地统一。

5N20 电机编码器脉冲数的计算方法 要通过编码器值精准计算电机转速或转动圈数,必须先明确脉冲数的换算逻辑。我实测并整理了这款电机的核心参数:

编码器每旋转一圈能产生 28 个脉冲,而电机输出轴的旋转圈数需要结合齿轮比计算 —— 输出轴每旋转一圈,对应的编码器脉冲数 = 编码器每转脉冲数 × 齿轮比。以齿轮比 100:1 的 N20 电机为例,输出轴每转一圈的脉冲数 = 28×100=2800 个脉冲 / 转。掌握这个换算关系,后续才能通过编码器数值精准把控电机的转速和转动位置。

(注:我会在后续文章中分享基于 PID 算法的 N20 电机位置控制,本文的基础代码仅实现电机正反转控制,并通过串口监视器输出编码器数值 —— 电机正向转动时编码器值递增,反向转动时数值递减,帮助大家理解编码器的基础反馈逻辑。)

文本ArduinoCPythonC++JavaC#BashGokotlinJavaScriptHTML/XMLCSSSQL#define MotFwd 3 // Motor Forward pin#define MotRev 4 // Motor Reverse pinint 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 valuevoid 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)× 齿轮比,是精准控制电机的核心参数。