用Arduino Uno控制直流电机
我有一个简单的电路设置如下示意图: 我试图通过这个H桥控制一个小型直流电机,但我以前从未对这些控制器进行过编程。当我在键盘上按左键和右键时,我需要马达以不同的方向旋转。到目前为止,我有以下代码:用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 =
// 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晶体管。