我按照这个原理图设置了一个简单的H-bridge电路:
我正试图通过这个带有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时遇到问题,因此电机会保持接通状态,输出引脚也没有像我指定的那样设置。
如何解决此问题?
答案 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。