在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用L298N和Arduino板控制直流電機

科技觀察員 ? 來源:八色木 ? 作者:八色木 ? 2022-04-08 15:06 ? 次閱讀

在這個Arduino教程中,我們將學習如何使用Arduino控制直流電機。我們來看看控制直流電機的一些基本技術,并通過兩個例子,學習如何使用L298N電機驅動器和Arduino板來控制直流電機。

在以往的文章中,我們知道可以通過簡單地控制輸入電壓來控制直流電機的速度,最常用的方法是使用PWM信號。延伸可閱讀:PWM

pYYBAGJP3diAGGiWAAB9JCjmyfQ263.png

PWM控制直流電機

使用PWM控制直流電機

PWM,即脈沖寬度調制技術,它是一種允許我們通過調整進入電機的電壓的平均值,通過高電平和低電平的持續時間來控制電機運動的技術。平均電壓取決于占空比,即信號在一段時間內打開的時間與關閉的時間之比。

poYBAGJPpCWABQ0xAAER697JgsI225.png

脈沖寬度調制技術

因此,根據電機的大小,我們可以簡單地將ArduinoPWM輸出連接到晶體管的底座或MOSFET的柵極,通過控制PWM輸出來控制電機的速度。低功率ArduinoPWM信號開關在MOSFET上,通過PWM信號開關可驅動大功率電機。

pYYBAGJP3eOAAjkSAAFeEQNV7gA850.png

ArduinoPWM控制直流電機

H橋直流電機控制

另一方面,為了控制電機的旋轉方向,我們只需要對電流流過電機的方向進行逆轉,最常用的方法是用H橋。一個H橋電路包含四個開關元件,晶體管或mosfet,形成一個類似于H的結構。通過同時激活兩個特定的開關,我們可以改變電流流動的方向,從而改變電機的旋轉方向。

pYYBAGJP3emALfVyAAEVpSr-g_U797.png

H橋的結構

所以,如果我們把PWM和H橋這兩種方法結合起來,我們就可以完全控制直流電機的運動了。有許多直流電機驅動器都具有這些特性,L298N就是其中之一。

L298N驅動模塊

L298N是一個雙H橋電機驅動器,它允許在同一時間,在速度和方向上對兩個直流電機進行控制。該模塊可以驅動電壓在5–35V之間的直流電機,峰值工作電流可達2A。

poYBAGJP3fCAGwHnAAPHhAxZZYQ593.png

L298N驅動模塊

讓我們仔細看看L298N模塊的接口定義,并解釋它是如何工作的。該模塊包括兩個電機(A、B)的連接端子、接地GND端子、電機的VCC和一個可作為輸入或輸出的5V引腳,這主要取決于在電機VCC上使用的電壓,具體使用請往下看。

pYYBAGJP3faAWyMDAAHQLMTCPwA155.png

該模塊有一個板載5V調節器,可通過跳線啟用或禁用。如果電機供電電壓低于12V,我們可以啟用5V調節器,5V引腳可以作為輸出,例如為我們的Arduino板供電;但是如果電機電壓大于12V,我們必須斷開跳線,因為這些電壓會對板載5V調節器造成損壞。在這種情況下,5V引腳將作為輸入,因為我們需要連接到5V電源,以便IC正常工作。

使用中這個集成電路的電壓降大約是2V。例如,如果我們使用12V電源,電機端子的電壓大約是10V,這意味著我們無法從12V直流電機中獲得最大速度。

pYYBAGJP3gOAR_CDAAKkob1ZamM317.png

L298N的電壓降

接下來是邏輯控制信號輸入。使能A和使能B引腳用于使能和控制電機的速度。如果跳線出現在這個引腳上,電機將被啟用并以最大速度工作,如果我們移除跳線,我們可以將PWM輸入連接到這個引腳上,以這種方式控制電機的速度。如果我們把這個插針接在地GND上,馬達就會不工作。

poYBAGJP3f2ANfQHAAJ36mRNsuo156.png

L298N的邏輯輸入控制

其中,輸入1和2針用于控制電動機A的轉動方向,輸入3和4用于控制電機B。這些插針實際上控制的是H橋的開關L298N芯片。它的控制原理是:當輸入1是低,2是高馬達A會向前轉動,反之亦然,如果輸入1高2低電機A將反方向旋轉。如果兩個輸入都相同,無論高低電平,電機A都會停止。同樣的道理也適用于輸入3和4。

Arduino上L298N的使用

現在讓我們做一些實際的測試。在第一個示例中,我們將使用電位器控制電機的速度,并使用一個按鈕改變旋轉方向。這是電路原理圖。

pYYBAGJP3hCAGhAkAAI_ZOJkYcI810.png

Arduino上L298N的使用

測試元件包括:一個L298N驅動器,一個直流電機,一個電位器,一個按鈕開關和一個Arduino板以及12V電源。

Arduino 控制代碼如下

/* Arduino DC Motor Control - PWM | H-Bridge | L298N - Example 01

*/

#define enA 9

#define in1 6

#define in2 7

#define button 4

int rotDirection = 0;

int pressed = false;

void setup() {

pinMode(enA, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

pinMode(button, INPUT);

// Set initial rotation direction

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

}

void loop() {

int potValue = analogRead(A0); // Read potentiometer value

int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255

analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin

// Read button - Debounce

if (digitalRead(button) == true) {

pressed = !pressed;

}

while (digitalRead(button) == true);

delay(20);

// If button is pressed - change rotation direction

if (pressed == true & rotDirection == 0) {

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

rotDirection = 1;

delay(20);

}

// If button is pressed - change rotation direction

if (pressed == false & rotDirection == 1) {

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

rotDirection = 0;

delay(20);

}

}

代碼解釋:首先我們需要為程序定義引腳和一些變量。在 setup 部分,我們需要設置引腳模式和電機的初始旋轉方向。在 loop 部分,我們首先讀取電位器的值,然后將我們從電位器中得到的值,0到 1023 映射到PWM信號值 0 到 255,也就是PWM信號從0到100%的占空比。然后使用 analogWrite() 函數,發送PWM信號到L298N板的使能端,從而實現電機的驅動。接下來,檢查是否按下了按鈕,如果是,將通過反方向設置輸入1和輸入2的狀態來改變電機的旋轉方向。這個按鈕將作為切換按鈕工作,每次我們按下它,它都將改變電機的旋轉方向。

Arduino采用L298N驅動機器人小車

如果我們理解了上面的知識,下面我們就可以制造自己的Arduino機器人小車了。下面是電路原理圖:

pYYBAGJP3pGAVt5MAANPvwFKYoQ299.png

Arduino采用L298N驅動機器人小車

我們需要兩個直流電機,L298N驅動器,一個Arduino板和一個操縱桿Joystick。在電源方面,我選擇了三節3.7V的鋰離子電池作為電源,電壓約11V。小車采用3毫米的膠合板做了底盤,用金屬支架把電機固定在上面,把輪子連在電機上,底盤的前面安裝了一個轉向輪。在網上有成品底盤,例如:智能小車底盤

現在讓我們看看Arduino代碼,看看它是如何工作的。

int xAxis = analogRead(A0); // Read Joysticks X-axis

int yAxis = analogRead(A1); // Read Joysticks Y-axis

在loop部分定義了引腳之后,我們首先讀取操縱桿X和Y軸的值。操縱桿實際上是由兩個電位器連接到Arduino的模擬輸入,它們的值從0到1023。當操縱桿保持在中心位置時,電位器或軸的值都在512左右。

poYBAGJP3p2AUbfBAAFy9H89teE407.png

操縱桿Joystick 模塊的值

我們將增加一點公差,以470到550的值為中心。所以如果向后移動操縱桿的Y軸,數值低于470,將使用四個輸入引腳將兩個電機的旋轉方向設置為向后。然后,我們將從470到0的下降值轉換為PWM從0到255的上升值,這實際上是控制電機的速度。

// Y-axis used for forward and backward control

if (yAxis < 470) {

// Set Motor A backward

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

// Set Motor B backward

digitalWrite(in3, HIGH);

digitalWrite(in4, LOW);

// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed

motorSpeedA = map(yAxis, 470, 0, 0, 255);

motorSpeedB = map(yAxis, 470, 0, 0, 255);

}

類似的,如果我們向前移動操縱桿的Y軸,數值超過550,我們將設置電機向前移動,并將讀數從550到1023轉換為PWM值從0到255。如果操縱桿保持在它的中心,電機的速度將為零。接下來,讓我們看看如何使用X軸來控制小車左右轉動 。

// X-axis used for left and right control

if (xAxis < 470) {

// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value

int xMapped = map(xAxis, 470, 0, 0, 255);

// Move to left - decrease left motor speed, increase right motor speed

motorSpeedA = motorSpeedA - xMapped;

motorSpeedB = motorSpeedB + xMapped;

// Confine the range from 0 to 255

if (motorSpeedA < 0) {

motorSpeedA = 0;

}

if (motorSpeedB > 255) {

motorSpeedB = 255;

}

}

首先,需要把X軸的讀數轉換成0到255之間的速度值。對于向左移動,我們使用這個值來降低左電機速度并增加右電機速度。在這里,由于算術函數,我們使用兩個額外的“if”語句來限制電機速度范圍從0到255。

poYBAGJP3oyAHUtzAAIdK48ND8c950.png

機器人小車的左轉和右轉

同樣的方法也適用于向右移動小車。

根據所施加的電壓和采用電機本身的不同,在較低的速度下,電機無法啟動,并產生嗡嗡聲。在我本文的例子中,如果PWM信號的值低于70,電機就無法啟動。因此,使用這兩個if語句,我實際上把速度限制在70到255之間。最后,發送電機速度控制值或PWM信號到L298N驅動器的使能引腳。

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)

if (motorSpeedA < 70) {

motorSpeedA = 0;

}

if (motorSpeedB < 70) {

motorSpeedB = 0;

}

analogWrite(enA, motorSpeedA); // Send PWM signal to motor A

analogWrite(enB, motorSpeedB); // Send PWM signal to motor B

最后附上Arduino機器人小車示例的完整代碼:

*/

#define enA 9

#define in1 4

#define in2 5

#define enB 10

#define in3 6

#define in4 7

int motorSpeedA = 0;

int motorSpeedB = 0;

void setup() {

pinMode(enA, OUTPUT);

pinMode(enB, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

pinMode(in3, OUTPUT);

pinMode(in4, OUTPUT);

}

void loop() {

int xAxis = analogRead(A0); // Read Joysticks X-axis

int yAxis = analogRead(A1); // Read Joysticks Y-axis

// Y-axis used for forward and backward control

if (yAxis < 470) {

// Set Motor A backward

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

// Set Motor B backward

digitalWrite(in3, HIGH);

digitalWrite(in4, LOW);

// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed

motorSpeedA = map(yAxis, 470, 0, 0, 255);

motorSpeedB = map(yAxis, 470, 0, 0, 255);

}

else if (yAxis > 550) {

// Set Motor A forward

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

// Set Motor B forward

digitalWrite(in3, LOW);

digitalWrite(in4, HIGH);

// Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed

motorSpeedA = map(yAxis, 550, 1023, 0, 255);

motorSpeedB = map(yAxis, 550, 1023, 0, 255);

}

// If joystick stays in middle the motors are not moving

else {

motorSpeedA = 0;

motorSpeedB = 0;

}

// X-axis used for left and right control

if (xAxis < 470) {

// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value

int xMapped = map(xAxis, 470, 0, 0, 255);

// Move to left - decrease left motor speed, increase right motor speed

motorSpeedA = motorSpeedA - xMapped;

motorSpeedB = motorSpeedB + xMapped;

// Confine the range from 0 to 255

if (motorSpeedA < 0) {

motorSpeedA = 0;

}

if (motorSpeedB > 255) {

motorSpeedB = 255;

}

}

if (xAxis > 550) {

// Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value

int xMapped = map(xAxis, 550, 1023, 0, 255);

// Move right - decrease right motor speed, increase left motor speed

motorSpeedA = motorSpeedA + xMapped;

motorSpeedB = motorSpeedB - xMapped;

// Confine the range from 0 to 255

if (motorSpeedA > 255) {

motorSpeedA = 255;

}

if (motorSpeedB < 0) {

motorSpeedB = 0;

}

}

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)

if (motorSpeedA < 70) {

motorSpeedA = 0;

}

if (motorSpeedB < 70) {

motorSpeedB = 0;

}

analogWrite(enA, motorSpeedA); // Send PWM signal to motor A

analogWrite(enB, motorSpeedB); // Send PWM signal to motor B

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 直流電機
    +關注

    關注

    36

    文章

    1710

    瀏覽量

    70183
  • Arduino
    +關注

    關注

    188

    文章

    6469

    瀏覽量

    187056
收藏 人收藏

    評論

    相關推薦

    L298N驅動直流電機問題

    經pwm調制 l298n驅動一個直流電機的c程序怎么編寫還有該怎么接線
    發表于 05-04 17:14

    請問L298N如何驅動4個直流電機

    L298N怎么驅動4個直流電機,網上看到有個方法是左邊2個電機極性相反的并聯接在L298N的out1,out2,右邊2個電機部分也是如此,這
    發表于 02-15 04:00

    Arudino+L298N控制直流電機的正反轉

    Arudino+L298N控制直流電機正反轉所需元器件電路連接圖Arduino程序所需元器件Arduino uno,
    發表于 06-28 11:17

    請問L298N是怎樣控制直流電機正反轉的?

    L298N的原理是什么?L298N是怎樣控制直流電機正反轉的?
    發表于 06-29 09:28

    Arduino實踐詳細說明之L298N驅動直流電機

    基于arduino uno 利用l298n驅動控制直流電機的正反轉和速度L298N說明這是其
    發表于 06-29 08:06

    L298驅動arduinoL298N電機驅動模塊和直流電機接線具體步驟

    L298驅動arduinoL298N電機驅動模塊和直流電機接線具體步驟如下:1.第一步,將數字3、4腳接
    發表于 09-08 07:52

    L298N驅動是怎樣控制直流電機

    什么是直流電機L298N驅動是怎樣控制直流電機的?
    發表于 10-19 08:29

    arduino uno如何利用l298n驅動控制直流電機的正反轉和速度?

    arduino uno如何利用l298n驅動控制直流電機的正反轉和速度?
    發表于 10-20 07:34

    L298N電機驅動直流電機程序匯總

    關于L298N驅動直流電機的各種寫法程序匯總
    發表于 05-04 16:04 ?31次下載

    L298N驅動2個直流電機的電路

    只找到了一個來L298N的驅動電路,可以驅動兩個直流電機,需要兩個電源5V,12V。可以實現直流電機正反轉,停止控制。這里介紹下肖基特二極管。
    發表于 05-14 10:01 ?9689次閱讀
    <b class='flag-5'>L298N</b>驅動2個<b class='flag-5'>直流電機</b>的電路

    L298n直流電機的原理說明

    該文件包含了L298n直流電機的工作原理圖和PCB制圖
    發表于 05-28 10:06 ?3次下載

    Arduino實驗17 L298N電機驅動模塊

    控制程序。 二、實驗設備與環境 Arduino UNO套件、Arduino IDE、計算機、L298N驅動模塊、直流電機、電位器、PS/
    發表于 03-16 14:14 ?12次下載
    <b class='flag-5'>Arduino</b>實驗17 <b class='flag-5'>L298N</b><b class='flag-5'>電機</b>驅動模塊

    ros與arduino通信控制直流電機

    前言:在成功通過arduino開發控制直流電機后,開始嘗試用ros與arduino通信來控制
    發表于 03-31 11:45 ?4次下載
    ros與<b class='flag-5'>arduino</b>通信<b class='flag-5'>控制</b><b class='flag-5'>直流電機</b>

    L298N直流電機總結

    采用L298N雙橋直流電機驅動芯片 工作電壓范圍5V35V,如果需要從模塊內取電,則供電范圍為7V35V 峰值輸出電流2A 每個通道有一個使能輸入端 可以驅動兩個直流電機或者一個四線步進
    發表于 04-03 11:05 ?3次下載
    <b class='flag-5'>L298N</b><b class='flag-5'>直流電機</b>總結

    Arudino+L298N控制直流電機正反轉

    Arudino+L298N控制直流電機正反轉 所需元器件 電路連接圖 Arduino程序 所需元器件 Arduino uno
    發表于 04-03 14:55 ?2次下載
    Arudino+<b class='flag-5'>L298N</b><b class='flag-5'>控制</b><b class='flag-5'>直流電機</b>正反轉
    主站蜘蛛池模板: 免费一级毛片女人图片| 成人在线看片| 午夜嘿咻| 简单视频在线播放jdav| 6080yy午夜不卡一二三区| 午夜色网站| 国产精品欧美一区二区三区| 精品福利在线视频| 中日韩黄色大片| 国模私拍福利一区二区| 亚洲午夜大片| h视频在线观看视频观看| 色色就色色| 综合五月| 亚洲免费在线观看视频| 欧美一级片网址| 四色成人网| 99久久精品国产免费| 精品伊人久久大线蕉地址 | 亚州 色 图 综合| 国产久爱青草视频在线观看| 超碰v| 免费网站看黄| 精品国产成人系列| 特黄特色三级在线播放| 咪咪爱毛片| 国产真实灌醉美女疯狂弄| 亚洲青草视频| 夜夜综合网| 老师办公室高h文小说| 精品一区二区三区免费毛片爱| 亚洲爱v| 国产盗摄女厕美女嘘嘘| 国产3p在线播放| 6080yy午夜不卡一二三区| 美女毛片在线观看| 成人免费黄色网| 日韩精品毛片| 午夜影院观看| 综合色99| 又粗又硬又大久久久 |