[英]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.