你想了解 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停止。
三、使用注意事項
- 供電區分:L298N的邏輯電源(5V)和電機電源必須分開接,ZK-5AD可通過電機電源穩壓給邏輯電路供電,無需額外接5V;
- 電流保護:L298N無保護,電機堵轉時易燒,需避免長時間滿負載;ZK-5AD有過流保護,觸發後會自動停轉,排除故障後恢復;
- PWM引腳:Arduino的PWM引腳標有“~”(如D9、D10),必須接這些引腳才能調速,方向引腳可接任意數字口。
總結
- 核心區別:L298N成本低但發熱大、無保護;ZK-5AD驅動能力強、穩定性高,是L298N的升級替代款;
- 通用基礎:兩者都支持“方向引腳+PWM調速”的核心邏輯,這是共用例程的關鍵;
- 例程使用:只需修改引腳定義適配實際接線,通用例程即可同時支持兩款模塊,核心控制邏輯無需改動。
如果需要適配STM32/ESP32等其他主控,只需將代碼中的pinMode/digitalWrite/analogWrite替換為對應主控的GPIO操作函數,控制邏輯完全一致。