[英]Controlling a DC motor with an Arduino Uno
我按照這個原理圖設置了一個簡單的H 橋電路:
我試圖通過這個帶有Arduino Uno的 H 橋來控制小型直流電機,但我以前從未對這些控制器中的一個進行過編程。 當我在鍵盤上左右按時,我需要電機向不同方向旋轉。 到目前為止我有這段代碼:
// Right Motor
/** Adjust these values for your servo and setup, if necessary **/
int resistor1 = 3;
int resistor2 = 5;
int resistor3 = 6;
int resistor4 = 10;
int moveServo;
void setup() {
Serial.begin(9600);
pinMode(resistor1, OUTPUT); // Set servo pin as an output pin
pinMode(resistor2, OUTPUT);
pinMode(resistor3, OUTPUT);
pinMode(resistor4, OUTPUT);
}
void loop() {
// Wait for serial input
if (Serial.available() > 0) {
// Read the incoming byte:
moveServo = Serial.read();
// ASCII left = 37, up = 38, right = 39, down = 40
if (moveServo == 37)
{
digitalWrite(resistor4, HIGH);
digitalWrite(resistor1, HIGH);
}
}
然而,我在修改PWM以使電機保持開啟時遇到了問題,而且 output 引腳也沒有按照我指定的方式設置。
我該如何解決這個問題?
如果要產生PWM輸出,則必須使用AnalogWrite()函數。
解決問題的方法(使電動機保持運轉)不是PWM,而是以正確的組合設置引腳狀態。 請注意,您使用的代碼適用於全NPN晶體管H橋。 您的電路是由PNP-NPN組合構建的,因此控制方式有所不同(NPN晶體管在飽和時傳遞電流,而PNP晶體管在飽和時禁止電流)。
嘗試像這樣修改您的代碼:
if (moveServo == 37)
{
digitalWrite(resistor1, LOW);
digitalWrite(resistor2, LOW);
digitalWrite(resistor3, HIGH);
digitalWrite(resistor4, HIGH);
}
else if (moveServo == 39)
{
digitalWrite(resistor3, LOW);
digitalWrite(resistor4, LOW);
digitalWrite(resistor1, HIGH);
digitalWrite(resistor2, HIGH);
}
請注意,順序很重要。 首先將一對設置為LOW,然后再將另一對設置為HIGH,否則將使函數調用之間的電路短路。
注意:您可以將PWM與analogWrite()函數一起使用來控制電機速度,但是您需要稍作修改:將另外的NPN晶體管置於接地之前(集電極位於H橋上,發射極接地),將其基極連接到具有PWM功能Arduino引腳通過限流電阻器。
vcc2gnd答案的說明
假設給H橋電路提供了5V,則當PNP的基極電壓為0v時,PNP就會接通。 當它們的基准電壓為5v時,NPN就會打開。 當晶體管導通(飽和)時,它會導通電流。
當Q4和Q1接通而其他Q4和Q1斷開(切斷)時,電機向一個方向轉動。 要具有該方向,R1,R2,R3,R4應分別指定為5v,5v,0v,0v。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.