使用Arduino与计算机串行连接控制电机

使用Arduino与计算机串行连接控制电机,arduino,serial-port,Arduino,Serial Port,我正在从事一个自动化配药项目,我打算用Arduino控制十个不同的12V 600mA直流泵。计算机通过usb连接以以下形式向Arduino传输消息: lh = pumps off 0h = pump 0 on 1h = pump 1 on etc. Arduino通过激活连接至12V 2A直流电源的TIP120 npn电阻器为泵供电。在任何给定时间,只有一台泵将运行 当我通过给LED通电进行测试时,串行连接工作正常。然而,当我尝试用泵时,Arduino开始缓慢地响应命令,最终我失去了与Ardu

我正在从事一个自动化配药项目,我打算用Arduino控制十个不同的12V 600mA直流泵。计算机通过usb连接以以下形式向Arduino传输消息:

lh = pumps off
0h = pump 0 on
1h = pump 1 on
etc.
Arduino通过激活连接至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;
}

基本电阻器设计 该问题可能是由于基本电阻器的设计。如数据表的图2所示

所需Ic为600mA,但当电机失速时,它会驱动更多电流,因此假设Ic=1250(请参考直流电机数据表了解失速条件下的最大电流)。因此Ib=5mA(5x250=1250),远低于Arduino可以输出的最大40mA

我们需要选择一个足够低的基极电阻,以确保TIP120保持饱和,但足够高,以防止Arduino试图提供比它应该提供的更多的电流。我们需要一个介于5毫安和40毫安之间的电流,所以让我们选择一个20毫安的中间点

回到图2,当集电极电流为1 A时,Vbe(sat)约为1.5 V。现在,如果Arduino输出5 V,Vbe为1.5 V,这意味着电阻器的压降为(5–1.5)或3.5 V。使用欧姆定律

模拟输出示例


电感器代表sim中的电机。连接二极管和电容器将减少尖峰

您在电源上做了什么?它有足够的容量吗?可能是二极管的位置。你能给我们看看图表吗?听起来你缺少了合适的反激二极管。我投票结束这个问题,因为这是一个硬件问题,应该继续。