用Arduino Uno控制直流电机

用Arduino Uno控制直流电机,arduino,Arduino,我有一个简单的电路设置如下示意图: 我试图通过这个H桥控制一个小型直流电机,但我以前从未对这些控制器进行过编程。当我在键盘上按左键和右键时,我需要马达以不同的方向旋转。到目前为止,我有以下代码: // Right Motor /** Adjust these values for your servo and setup, if necessary **/ int resistor1 = 3; int resistor2 = 5; int resistor3 =

我有一个简单的电路设置如下示意图:

我试图通过这个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输出,必须使用该功能。

如果要产生PWM输出,必须使用该功能。

问题的解决方案(保持电机运行)不是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);
}
请注意,顺序很重要。先将一对设置为低,然后再将另一对设置为高,否则会使函数调用之间的电路短路


注意:您可以使用带analogWrite()函数的PWM来控制电机速度,但您需要稍微修改电路:在接地之前放置额外的NPN晶体管(H桥上的集电极,接地上的发射极),通过限制电阻器将其基极与支持PWM的Arduino引脚连接。

解决问题的方法(保持电机运行)不是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);
}
请注意,顺序很重要。先将一对设置为低,然后再将另一对设置为高,否则会使函数调用之间的电路短路


注:您可以使用带analogWrite()函数的PWM来控制电机速度,但您需要稍微修改电路:将额外的NPN晶体管置于接地之前(集电极置于H桥上,发射极置于接地上),通过限幅电阻器将其基极与支持PWM的Arduino引脚连接。

vcc2gnd答案的解释

假设H桥电路为5V,PNP在基极为0v时开启。当他们的基地有5v电压时,NPN开启。当晶体管导通(饱和)时,它传导电流


当Q4和Q1打开而其他关闭(切断)时,电机朝一个方向转动。要获得该方向,R1、R2、R3、R4应分别给出5v、5v、0v、0v。

vcc2gnd答案的解释

假设H桥电路为5V,PNP在基极为0v时开启。当他们的基地有5v电压时,NPN开启。当晶体管导通(饱和)时,它传导电流


当Q4和Q1打开而其他关闭(切断)时,电机朝一个方向转动。为了达到这个方向,R1、R2、R3、R4应分别给定5v、5v、0v、0v。NPN晶体管在饱和时提供电流,而PNP晶体管在饱和时禁止电流是完全错误的。任何双极结晶体管在饱和时都会输出电流。唯一的区别是NPN和PNP偏置电路。通过改变偏置电路,我们所做的是使PNP晶体管饱和。NPN晶体管在饱和时提供电流,而PNP晶体管在饱和时禁止电流是完全错误的。任何双极结晶体管在饱和时都会输出电流。唯一的区别是NPN和PNP偏置电路。通过改变偏置电路,我们所做的是使背景饱和PNP晶体管。