用Arduino Uno控制直流电机

时间:2012-03-25 19:27:33

标签: arduino

我按照这个原理图设置了一个简单的H-bridge电路:

Enter image description here

我正试图通过这个带有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时遇到问题,因此电机会保持接通状态,输出引脚也没有像我指定的那样设置。

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

如果要生成PWM输出,则必须使用analogWrite()功能。

答案 1 :(得分:0)

问题的解决方案(保持电机运行)不是PWM,而是以正确的组合设置引脚状态。请注意,您使用的代码适用于所有NPN晶体管H-Bridge。您的电路采用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);
}

请注意,订单很重要。在将另一对设置为HIGH之前先将一对设置为LOW,否则您将在函数调用之间缩短电路。

注意:您可以使用带有analogWrite()功能的PWM来控制电机速度,但您需要稍微修改一下电路:在接地之前放置额外的NPN晶体管(H-Bridge上的集电极,发射极接地),连接它的基座具有PWM功能的Arduino引脚通过限流电阻。

答案 2 :(得分:0)

解释vcc2gnd的回答

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

当Q4和Q1为ON而其他为OFF(截止)时,电机向一个方向转动。为了达到这个目的,R1,R2,R3,R4应分别给出5v,5v,0v,0v。