2017-08-09 81 views
-1

我正在一个自动化点胶项目,我打算控制十个不同的12V 600mA直流泵与Arduino。一种计算机在以下形式的USB连接到Arduino发送消息:控制电机与Arduino串行连接使用电脑

lh = pumps off 
0h = pump 0 on 
1h = pump 1 on 
etc. 

阿尔杜伊诺通过激活连接到12V 2A直流电源TIP120 npn型电阻器提供了电源泵。在任何给定时间只有一台泵将运行。

当我通过为LED供电进行测试时,串行连接完美无缺。然而,当我尝试使用泵时,Arduino开始对命令做出迟钝的反应,最终我失去了与Arduino的串行连接。我只能想象,会有某种权力问题导致Arduino失去联系。任何想法,我错了?

Arduino的代码:

#define PUMP5 5 //pin for turning transistor on/off 
const byte numChars = 32; 
char msg[numChars]; 

void setup() { 
    Serial.begin(9600,SERIAL_8N1); 
    Serial.println(msg[0]); 
    pinMode(PUMP5, OUTPUT); 
} 

void loop() { 
    read_msg(); 
    command_pumps(); 
} 

void read_msg() { 
    char rc; 
    if (Serial.available() > 0) { 
    rc = Serial.read(); 
    msg[0] = rc; 
    } 
    if(Serial.available() > 0) { 
    rc = Serial.read(); 
    msg[1] = rc; 
    } 
    Serial.print("msg[0]: "); 
    Serial.println(msg[0]); 
    Serial.print("msg[1]: "); 
    Serial.println(msg[1]); 
} 

//PUMP5 is used for each of the scenarios since I am only testing with one pump 
void command_pumps() { 
    if (msg[0] == 'l'||msg[1]=='l') { 
    digitalWrite(PUMP5, LOW); 
    } else if (msg[1] == 'h') { 
    if(msg[0]=='0') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='1') digitalWrite(PUMP5, LOW); 
    else if (msg[0]=='2') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='3') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='4') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='5') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='6') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='7') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='8') digitalWrite(PUMP5, HIGH); 
    else if (msg[0]=='9') digitalWrite(PUMP5, HIGH); 
    } 
    return; 
} 

My Circuit

+0

你在电源上做了什么?它有足够的容量吗? – barny

+0

可能是二极管放置。请参阅https://electronics.stackexchange.com/questions/31014/where-should-i-put-the-kickback-diode-in-a-transistor-switch –

+0

您能向我们展示该图吗?听起来就像你在这里丢失了适当的反激式二极管。 – user3411864

回答

2

基极电阻器设计

的问题可能是由于在tip120数据表的图2中所示的基极电阻器设计。作为

enter image description here

enter image description here

所需Ic为600毫安但是当马达停转它驱动更多的电流,从而让我们假设IC = 1250的值(请参考DC电动机的数据表在失速状态的最大电流)。因此,Ib = 5mA(5×250 = 1250),远低于Arduino可以输出的最大40mA。

我们需要选择一个足够低的基极电阻,以确保TIP120保持饱和,但高到足以防止Arduino试图传输比应该更多的电流。我们需要一个5 mA和40 mA之间的电流,所以我们选择一个20 mA的中点。我们发现当集电极电流为1 A时,Vbe(sat)大约为1.5 V.现在,如果Arduino输出5 V,Vbe为1.5 V,这意味着电阻器其整个电压下降(5 - 1.5)或3.5 V.用欧姆定律

enter image description here

样本模拟输出

enter image description here

电感表示SIM电机。连接二极管和电容器可以减少峰值电流