久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

如何使用L298N和Arduino板控制直流電機(jī)

 金剛光 2022-06-01 發(fā)布于遼寧

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

 0

在這個(gè)Arduino教程中,,我們將學(xué)習(xí)如何使用Arduino控制直流電機(jī),。我們來看看控制直流電機(jī)的一些基本技術(shù),并通過兩個(gè)例子,,學(xué)習(xí)如何使用L298N電機(jī)驅(qū)動(dòng)器和Arduino板來控制直流電機(jī),。

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

pYYBAGJP3diAGGiWAAB9JCjmyfQ263.png

PWM控制直流電機(jī)

使用PWM控制直流電機(jī)

PWM,即脈沖寬度調(diào)制技術(shù),,它是一種允許我們通過調(diào)整進(jìn)入電機(jī)的電壓的平均值,,通過高電平和低電平的持續(xù)時(shí)間來控制電機(jī)運(yùn)動(dòng)的技術(shù)。平均電壓取決于占空比,,即信號(hào)在一段時(shí)間內(nèi)打開的時(shí)間與關(guān)閉的時(shí)間之比,。

poYBAGJPpCWABQ0xAAER697JgsI225.png

脈沖寬度調(diào)制技術(shù)

因此,根據(jù)電機(jī)的大小,,我們可以簡單地將ArduinoPWM輸出連接到晶體管的底座或MOSFET的柵極,,通過控制PWM輸出來控制電機(jī)的速度。低功率ArduinoPWM信號(hào)開關(guān)在MOSFET上,,通過PWM信號(hào)開關(guān)可驅(qū)動(dòng)大功率電機(jī),。

pYYBAGJP3eOAAjkSAAFeEQNV7gA850.png

ArduinoPWM控制直流電機(jī)

H橋直流電機(jī)控制

另一方面,為了控制電機(jī)的旋轉(zhuǎn)方向,,我們只需要對(duì)電流流過電機(jī)的方向進(jìn)行逆轉(zhuǎn),,最常用的方法是用H橋。一個(gè)H橋電路包含四個(gè)開關(guān)元件,,晶體管或mosfet,,形成一個(gè)類似于H的結(jié)構(gòu),。通過同時(shí)激活兩個(gè)特定的開關(guān),我們可以改變電流流動(dòng)的方向,,從而改變電機(jī)的旋轉(zhuǎn)方向,。

pYYBAGJP3emALfVyAAEVpSr-g_U797.png

H橋的結(jié)構(gòu)

所以,如果我們把PWM和H橋這兩種方法結(jié)合起來,,我們就可以完全控制直流電機(jī)的運(yùn)動(dòng)了。有許多直流電機(jī)驅(qū)動(dòng)器都具有這些特性,,L298N就是其中之一,。

L298N驅(qū)動(dòng)模塊

L298N是一個(gè)雙H橋電機(jī)驅(qū)動(dòng)器,它允許在同一時(shí)間,,在速度和方向上對(duì)兩個(gè)直流電機(jī)進(jìn)行控制,。該模塊可以驅(qū)動(dòng)電壓在5–35V之間的直流電機(jī),峰值工作電流可達(dá)2A,。

poYBAGJP3fCAGwHnAAPHhAxZZYQ593.png

L298N驅(qū)動(dòng)模塊

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

pYYBAGJP3faAWyMDAAHQLMTCPwA155.png

該模塊有一個(gè)板載5V調(diào)節(jié)器,,可通過跳線啟用或禁用,。如果電機(jī)供電電壓低于12V,我們可以啟用5V調(diào)節(jié)器,,5V引腳可以作為輸出,,例如為我們的Arduino板供電;但是如果電機(jī)電壓大于12V,,我們必須斷開跳線,,因?yàn)檫@些電壓會(huì)對(duì)板載5V調(diào)節(jié)器造成損壞。在這種情況下,,5V引腳將作為輸入,,因?yàn)槲覀冃枰B接到5V電源,以便IC正常工作,。

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

pYYBAGJP3gOAR_CDAAKkob1ZamM317.png

L298N的電壓降

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

poYBAGJP3f2ANfQHAAJ36mRNsuo156.png

L298N的邏輯輸入控制

其中,輸入1和2針用于控制電動(dòng)機(jī)A的轉(zhuǎn)動(dòng)方向,,輸入3和4用于控制電機(jī)B,。這些插針實(shí)際上控制的是H橋的開關(guān)L298N芯片。它的控制原理是:當(dāng)輸入1是低,,2是高馬達(dá)A會(huì)向前轉(zhuǎn)動(dòng),,反之亦然,如果輸入1高2低電機(jī)A將反方向旋轉(zhuǎn),。如果兩個(gè)輸入都相同,,無論高低電平,電機(jī)A都會(huì)停止,。同樣的道理也適用于輸入3和4,。

Arduino上L298N的使用

現(xiàn)在讓我們做一些實(shí)際的測試。在第一個(gè)示例中,,我們將使用電位器控制電機(jī)的速度,,并使用一個(gè)按鈕改變旋轉(zhuǎn)方向。這是電路原理圖,。

pYYBAGJP3hCAGhAkAAI_ZOJkYcI810.png

Arduino上L298N的使用

測試元件包括:一個(gè)L298N驅(qū)動(dòng)器,,一個(gè)直流電機(jī),一個(gè)電位器,,一個(gè)按鈕開關(guān)和一個(gè)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 部分,,我們需要設(shè)置引腳模式和電機(jī)的初始旋轉(zhuǎn)方向,。在 loop 部分,我們首先讀取電位器的值,,然后將我們從電位器中得到的值,,0到 1023 映射到PWM信號(hào)值 0 到 255,也就是PWM信號(hào)從0到100%的占空比。然后使用 analogWrite() 函數(shù),,發(fā)送PWM信號(hào)到L298N板的使能端,,從而實(shí)現(xiàn)電機(jī)的驅(qū)動(dòng)。接下來,,檢查是否按下了按鈕,,如果是,將通過反方向設(shè)置輸入1和輸入2的狀態(tài)來改變電機(jī)的旋轉(zhuǎn)方向,。這個(gè)按鈕將作為切換按鈕工作,,每次我們按下它,它都將改變電機(jī)的旋轉(zhuǎn)方向,。

Arduino采用L298N驅(qū)動(dòng)機(jī)器人小車

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

pYYBAGJP3pGAVt5MAANPvwFKYoQ299.png

Arduino采用L298N驅(qū)動(dòng)機(jī)器人小車

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

現(xiàn)在讓我們看看Arduino代碼,,看看它是如何工作的,。

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

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

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

poYBAGJP3p2AUbfBAAFy9H89teE407.png

操縱桿Joystick 模塊的值

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

// 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);

}

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

// 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軸的讀數(shù)轉(zhuǎn)換成0到255之間的速度值,。對(duì)于向左移動(dòng),我們使用這個(gè)值來降低左電機(jī)速度并增加右電機(jī)速度,。在這里,,由于算術(shù)函數(shù),我們使用兩個(gè)額外的“if”語句來限制電機(jī)速度范圍從0到255,。

poYBAGJP3oyAHUtzAAIdK48ND8c950.png

機(jī)器人小車的左轉(zhuǎn)和右轉(zhuǎn)

同樣的方法也適用于向右移動(dòng)小車,。

根據(jù)所施加的電壓和采用電機(jī)本身的不同,在較低的速度下,,電機(jī)無法啟動(dòng),,并產(chǎn)生嗡嗡聲。在我本文的例子中,,如果PWM信號(hào)的值低于70,,電機(jī)就無法啟動(dòng)。因此,,使用這兩個(gè)if語句,,我實(shí)際上把速度限制在70到255之間。最后,,發(fā)送電機(jī)速度控制值或PWM信號(hào)到L298N驅(qū)動(dòng)器的使能引腳,。

// 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機(jī)器人小車示例的完整代碼:

*/

#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

}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多