引言
在嵌入式系統開發中,電機驅動是一個常見且重要的功能。L298N是一款高電壓、大電流電機驅動芯片,廣泛應用于各種電機控制場景,如直流電機的正反轉、調速,以及步進電機的驅動等。本文將詳細介紹如何使用51單片機來控制L298N電機驅動模塊,幫助大家快速上手相關項目開發。
L298N電機驅動模塊簡介
L298N內部包含4通道邏輯驅動電路,可以方便地驅動兩個直流電機或者一個兩相步進電機。它具有以下主要特點:
- 高電壓、大電流:能夠提供高達46V的電壓和2A的電流,滿足大多數電機的驅動需求。
- 邏輯兼容性好:可以直接與5V邏輯電平的微控制器(如51單片機)連接。
- 控制靈活:通過控制輸入引腳的電平狀態,可以方便地實現電機的正反轉、制動和使能等功能。
從外觀上看,L298N模塊通常由紅色的電路板、黑色的散熱片以及多個引腳和接線端子組成,如圖所示:
(此處可替換為實際圖片鏈接)
模塊上的引腳功能如下:
- 12V供電:為L298N內部電路提供工作電源,一般接12V直流電源。
- 供電GND:電源地,與12V供電的地相連。
- 5V供電:為L298N的邏輯電路提供5V電源,也可為5V單片機供電(注意電流限制)。
- 板載5V使能:當該引腳接高電平時,5V供電輸出有效;接低電平時,5V輸出被切斷。
- 通道A使能(ENA):控制通道A(輸出A)電機的使能狀態,高電平有效。
- 邏輯輸入(IN1、IN2):控制通道A電機的正反轉,通過不同的電平組合實現。
- 通道B使能(ENB):控制通道B(輸出B)電機的使能狀態,高電平有效。
- 邏輯輸入(IN3、IN4):控制通道B電機的正反轉,通過不同的電平組合實現。
- 輸出A:連接直流電機的一端或步進電機的一相。
- 輸出B:連接直流電機的另一端或步進電機的另一相。
硬件連接
電源連接
- 將12V直流電源的正極連接到L298N模塊的12V供電引腳。
- 將12V直流電源的負極連接到L298N模塊的供電GND引腳。
- 如果51單片機的工作電壓為5V,可以將L298N模塊的5V供電引腳連接到51單片機的5V電源引腳,同時將L298N模塊的供電GND引腳也連接到51單片機的GND引腳。注意,L298N的5V供電能力有限,若同時驅動多個大電流設備,可能需要額外為51單片機提供獨立的5V電源。
注意 |
“板載5V” 的短接口連上時,12v和GND為電源接入,5V為電源輸出 |
通道A和通道B的使能引腳短接:可以控制兩個電機的正反轉 |
邏輯輸入IN1和IN2控制OUT1和OUT2;邏輯輸入IN3和IN4控制OUT3和OUT4; |
電機連接
假設我們要驅動一個直流電機,將電機的兩端分別連接到L298N模塊的Output 1(輸出A)和Output 2(輸出B)引腳。
51單片機連接
- 使能引腳連接:
- 將51單片機的一個GPIO引腳(例如P1.0)連接到L298N模塊的通道A使能引腳(ENA)。
- 將51單片機的另一個GPIO引腳(例如P1.1)連接到L298N模塊的通道B使能引腳(ENB)。
- 邏輯輸入引腳連接:
- 將51單片機的一個GPIO引腳(例如P1.2)連接到L298N模塊的邏輯輸入引腳IN1。
- 將51單片機的一個GPIO引腳(例如P1.3)連接到L298N模塊的邏輯輸入引腳IN2。
- 將51單片機的一個GPIO引腳(例如P1.4)連接到L298N模塊的邏輯輸入引腳IN3。
- 將51單片機的一個GPIO引腳(例如P1.5)連接到L298N模塊的邏輯輸入引腳IN4。
板載5V使能連接(可選)
如果需要使用L298N模塊的板載5V供電功能,可以將51單片機的一個GPIO引腳連接到板載5V使能引腳,并在程序中進行控制。
軟件編程
電機正反轉
下面以51單片機C語言為例,給出控制直流電機正反轉的代碼示例:
#include <reg51.h>
#include < intrins.h>// 定義引腳
sbit ENA = P1^0; // 通道A使能引腳
sbit ENB = P1^1; // 通道B使能引腳
sbit IN1 = P1^2; // 通道A邏輯輸入引腳1
sbit IN2 = P1^3; // 通道A邏輯輸入引腳2
sbit IN3 = P1^4; // 通道B邏輯輸入引腳1
sbit IN4 = P1^5; // 通道B邏輯輸入引腳2// 延時函數
void delay(unsigned int time)
{unsigned int i, j;for(i = 0; i < time; i++)for(j = 0; j < 1275; j++);
}void main()
{while(1){// 電機正轉ENA = 1; // 使能通道AIN1 = 1;IN2 = 0;delay(5000); // 延時一段時間// 電機反轉ENA = 1; // 保持通道A使能IN1 = 0;IN2 = 1;delay(5000); // 延時一段時間// 電機停止ENA = 0; // 失能通道Adelay(5000); // 延時一段時間}
}
在上述代碼中:
- 首先定義了與L298N模塊連接的51單片機引腳。
delay
函數用于實現簡單的延時功能,通過嵌套循環來消耗一定的時間。- 在
main
函數中,通過改變ENA
、IN1
和IN2
的電平狀態來控制電機的正轉、反轉和停止。
電機調速
如果要實現電機的調速功能,可以使用PWM(脈沖寬度調制)技術。以定時器T0產生PWM信號控制ENA引腳為例,代碼如下:
#include <reg51.h>
#include < intrins.h>// 定義引腳
sbit ENA = P1^0; // 通道A使能引腳
sbit ENB = P1^1; // 通道B使能引腳
sbit IN1 = P1^2; // 通道A邏輯輸入引腳1
sbit IN2 = P1^3; // 通道A邏輯輸入引腳2
sbit IN3 = P1^4; // 通道B邏輯輸入引腳1
sbit IN4 = P1^5; // 通道B邏輯輸入引腳2// 定義PWM相關變量
unsigned char PWM_Count;
unsigned char PWM_Duty;// 初始化定時器T0為PWM模式
void Timer0_Init()
{TMOD = 0x01; // 設置定時器T0為工作方式1TH0 = 0xFE; // 設置定時器初值,產生1ms的定時周期(假設晶振為12MHz)TL0 = 0x33;ET0 = 1; // 使能定時器T0中斷EA = 1; // 使能總中斷TR0 = 1; // 啟動定時器T0
}// 定時器T0中斷服務程序
void Timer0_ISR(void) interrupt 1
{TH0 = 0xFE; // 重新賦初值TL0 = 0x33;PWM_Count++;if (PWM_Count >= PWM_Duty){ENA = 0; // 低電平,電機減速}else{ENA = 1; // 高電平,電機加速}if (PWM_Count >= 100) // PWM周期為100ms{PWM_Count = 0;}
}// 設置PWM占空比
void Set_PWM_Duty(unsigned char duty)
{PWM_Duty = duty;
}void main()
{Timer0_Init();while(1){// 電機正轉并設置PWM占空比為50%