你想了解 L298N 和 ZK-5AD 這兩款電機驅動模塊的核心區別,以及能讓它們共用的通用例程,我會從模塊特性、差異對比和通用代碼實現三個方面給你講清楚。

一、L298N 與 ZK-5AD 核心區別

首先要明確兩款模塊的定位和核心差異,這是編寫通用例程的基礎:

特性 L298N 模塊 ZK-5AD 模塊
核心芯片 L298N(雙H橋) 一般為TB6612/DRV8833(更優的H橋芯片)
驅動能力 最大2A/路(峯值),發熱大 最大5A/路(持續),低發熱、效率高
控制方式 邏輯電平控制方向+PWM控制速度 同L298N(方向+PWM),部分帶I2C
供電方式 需外接電機電源+邏輯電源(5V/12V) 寬電壓輸入(5-30V),自帶穩壓
硬件保護 無過流/過熱保護,易燒 內置過流、過熱、欠壓保護,更穩定
接口形式 排針直插 端子接線+排針,接線更方便
成本/體積 便宜,體積大 稍貴,體積小、集成度高

核心共同點:都支持「方向引腳(IN1/IN2)+ PWM調速引腳」的基礎控制邏輯,這是能共用例程的關鍵。

二、通用例程(以Arduino為例)

基於兩者“方向+PWM”的通用控制邏輯,我編寫了一份兼容兩款模塊的例程,只需少量修改引腳定義即可適配。

1. 硬件接線説明(通用規則)

Arduino引腳 L298N/ZK-5AD 連接 作用
D9 (PWM) ENA/AI1 電機A調速(PWM)
D8 IN1/BI1 電機A方向1
D7 IN2/BI2 電機A方向2
D10 (PWM) ENB/AI2 電機B調速(PWM)
D6 IN3/CI1 電機B方向1
D5 IN4/CI2 電機B方向2
5V/GND 模塊邏輯電源 供電(ZK-5AD可自供)
外接電源 模塊電機電源 給電機供電

注意:ZK-5AD的引腳標註可能是AIN1/AIN2/PWMA,本質和IN1/IN2/ENA是同一個邏輯,只需對應接線即可。

2. 通用例程代碼

/*
  L298N/ZK-5AD 通用電機驅動例程
  功能:控制兩個直流電機正轉、反轉、停止,可調節速度
  適配説明:只需修改下方引腳定義,即可兼容兩款模塊
*/

// -------------------------- 引腳定義(核心修改處)--------------------------
// 電機A(左電機)
const int motorA_PWM = 9;   // PWM調速引腳(需接Arduino PWM口)
const int motorA_IN1 = 8;   // 方向引腳1
const int motorA_IN2 = 7;   // 方向引腳2

// 電機B(右電機)
const int motorB_PWM = 10;  // PWM調速引腳
const int motorB_IN1 = 6;   // 方向引腳1
const int motorB_IN2 = 5;   // 方向引腳2

// -------------------------- 函數聲明 --------------------------
void motorA_control(int speed);  // 控制電機A(速度範圍:-255~255,負數反轉)
void motorB_control(int speed);  // 控制電機B
void motor_stop();               // 所有電機停止

// -------------------------- 初始化 --------------------------
void setup() {
  // 設置引腳模式為輸出
  pinMode(motorA_PWM, OUTPUT);
  pinMode(motorA_IN1, OUTPUT);
  pinMode(motorA_IN2, OUTPUT);
  pinMode(motorB_PWM, OUTPUT);
  pinMode(motorB_IN1, OUTPUT);
  pinMode(motorB_IN2, OUTPUT);
  
  // 初始停止電機
  motor_stop();
  Serial.begin(9600);
  Serial.println("模塊初始化完成,可控制電機");
}

// -------------------------- 主循環(測試邏輯)--------------------------
void loop() {
  // 電機A正轉(速度50%),電機B正轉(速度70%),持續2秒
  Serial.println("電機正轉");
  motorA_control(128);
  motorB_control(180);
  delay(2000);

  // 電機停止1秒
  Serial.println("電機停止");
  motor_stop();
  delay(1000);

  // 電機A反轉(速度30%),電機B反轉(速度50%),持續2秒
  Serial.println("電機反轉");
  motorA_control(-80);
  motorB_control(-128);
  delay(2000);

  // 電機停止1秒
  motor_stop();
  delay(1000);
}

// -------------------------- 電機控制函數 --------------------------
// 控制電機A:speed範圍 -255~255,0停止,正數正轉,負數反轉
void motorA_control(int speed) {
  if (speed > 255) speed = 255;  // 限制最大速度
  if (speed < -255) speed = -255;

  if (speed > 0) {  // 正轉
    digitalWrite(motorA_IN1, HIGH);
    digitalWrite(motorA_IN2, LOW);
    analogWrite(motorA_PWM, speed);
  } else if (speed < 0) {  // 反轉
    digitalWrite(motorA_IN1, LOW);
    digitalWrite(motorA_IN2, HIGH);
    analogWrite(motorA_PWM, -speed);  // PWM值必須為正數
  } else {  // 停止
    digitalWrite(motorA_IN1, LOW);
    digitalWrite(motorA_IN2, LOW);
    analogWrite(motorA_PWM, 0);
  }
}

// 控制電機B:邏輯同電機A
void motorB_control(int speed) {
  if (speed > 255) speed = 255;
  if (speed < -255) speed = -255;

  if (speed > 0) {
    digitalWrite(motorB_IN1, HIGH);
    digitalWrite(motorB_IN2, LOW);
    analogWrite(motorB_PWM, speed);
  } else if (speed < 0) {
    digitalWrite(motorB_IN1, LOW);
    digitalWrite(motorB_IN2, HIGH);
    analogWrite(motorB_PWM, -speed);
  } else {
    digitalWrite(motorB_IN1, LOW);
    digitalWrite(motorB_IN2, LOW);
    analogWrite(motorB_PWM, 0);
  }
}

// 所有電機停止
void motor_stop() {
  motorA_control(0);
  motorB_control(0);
}

3. 例程適配修改説明

  • 如果你用 L298N:直接按表格接線,無需修改代碼(默認引腳適配L298N常見接線);
  • 如果你用 ZK-5AD:只需將代碼中引腳定義改為ZK-5AD的實際接線引腳(比如ZK-5AD的PWMA接D9,AIN1接D8,AIN2接D7),邏輯完全通用;
  • 調速範圍:代碼中speed參數範圍是-255~255,對應PWM的0~255,負數表示反轉,正數正轉,0停止。

三、使用注意事項

  1. 供電區分:L298N的邏輯電源(5V)和電機電源必須分開接,ZK-5AD可通過電機電源穩壓給邏輯電路供電,無需額外接5V;
  2. 電流保護:L298N無保護,電機堵轉時易燒,需避免長時間滿負載;ZK-5AD有過流保護,觸發後會自動停轉,排除故障後恢復;
  3. PWM引腳:Arduino的PWM引腳標有“~”(如D9、D10),必須接這些引腳才能調速,方向引腳可接任意數字口。

總結

  1. 核心區別:L298N成本低但發熱大、無保護;ZK-5AD驅動能力強、穩定性高,是L298N的升級替代款;
  2. 通用基礎:兩者都支持“方向引腳+PWM調速”的核心邏輯,這是共用例程的關鍵;
  3. 例程使用:只需修改引腳定義適配實際接線,通用例程即可同時支持兩款模塊,核心控制邏輯無需改動。

如果需要適配STM32/ESP32等其他主控,只需將代碼中的pinMode/digitalWrite/analogWrite替換為對應主控的GPIO操作函數,控制邏輯完全一致。