chhfvjdxhjh 2024-05-31 17:00 采纳率: 57.9%
浏览 10
已结题

arduino为什么不能同时控制步进电机和负压气泵

我用的arduino mage 2560开发板,步进电机是kamoer kk2000,负压气泵是HLVP3,串口屏用的淘晶驰7寸电容串口屏。串口屏开发环境是USART HMI。编程环境是Arduino IDE1.8.19。
1.点击串口屏按钮1,步进电机旋转,不同按钮对应不同旋转速度。
2.点击串口屏按钮2,负压气泵工作,不同按钮对应不同吸气力度。
串口屏页面大概是下图样子。

img

loop函数

void loop() {
if (Serial.available() >0)  //如果串口屏接收到字符
       {
        receive_data();//接收数据函数
        test_date();//检验函数
       
        do_command();//执行函数
       
        qingchu();//初始化数据
        delay(50);
       }
}

接收数据函数

void receive_data()
{
  int j=0;
  while(Serial.available()>0)
  {
    zifu+=char(Serial.read());
    Serial.println(zifu);
    delay(100);
    mark=1;
  }
  if (mark==1)
  {
    for(int i=0;i<zifu.length();i++)
    {
      if(zifu[i]==',')
      {
        j++;
      }
      else
      {
        comdata[j]=comdata[j]*10+(zifu[i]-'0'); 
      }
    }
    zifu=String("");    
    mark=0;     
  }
}

检验函数

void test_date()
{
   //步进电机输出
   if(comdata[0]==55)
    {
      if(comdata[1]==02) //步进电机的速度20,输出52
      {
      bujin=2;    
      }
      if(comdata[1]==03)//步进电机的速度30,输出53
      {
      bujin=3;    
      }
         if(comdata[1]==50)//如果5550,步进电机停止,stop输出2    
      {
      stop_mark=2;   
      }
    }
  
      //负压气泵输出
    if(comdata[0]==54)
    {
      if(comdata[1]==01) //如果低速,输出2
      {
      go_mark=2;    
      }
      if(comdata[1]==02)//中速
      {
      go_mark=3;    
      }
    
      if(comdata[1]==10)//停止
      {
      go_mark=6;    
      } 
   }
}

执行函数

void do_command()
{
   // 负压气泵执行,PWM
  if(go_mark==2)
  {
     analogWrite(HLVP3PIN,43);//低速500ml/min
  }
   if(go_mark==3)
  {
     analogWrite(HLVP3PIN,128);//中速1500ml/min
  }
 
  if(go_mark==6)
  {
     analogWrite(HLVP3PIN,0);//停止
  }
  
  delay(100);
  //步进电机执行,脉冲
   if(bujin==2)
  {
    
    digitalWrite(DIRPIN1, LOW);//方向3
    digitalWrite(STEPPIN1, HIGH);//脉冲2
    tone(STEPPIN1,50);//可以通过更改脉冲频率改变速度
  }
   if(bujin==3)
  {
    digitalWrite(DIRPIN1, LOW);//方向
    digitalWrite(STEPPIN1, HIGH);//脉冲
    tone(STEPPIN1,100);//可以通过更改脉冲频率改变速度
  }
  if(bujin==4)
  {
    digitalWrite(DIRPIN1, LOW);//方向
    digitalWrite(STEPPIN1, HIGH);//脉冲
    tone(STEPPIN1,200);//可以通过更改脉冲频率改变速度
  }

  if(stop_mark==2)
  {    
    digitalWrite(STEPPIN1, LOW);
    noTone(STEPPIN1);
  }  
}

清除函数


void qingchu()  //清除数据
{
  for(int i=0;i<=2;i++)
       {
        comdata[i]=0;
       }
        go_mark=0;
        mark=0;
       Serial.flush();
}

问题:屏幕单独控制步进电机或者负压气泵没有问题,一旦同时控制,负压气泵可以正常运行,步进电机第一次开始停止可以,后面再让他开始就没反应。

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-31 17:00
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在Arduino Mega 2560开发板同时控制步进电机和负压气泵时,步进电机响应异常的问题可能由以下几个原因引起:

    1. 电源问题:步进电机和负压气泵可能需要较大的电流,同时工作时可能超出了Arduino的供电能力或电源的承载能力。

    2. PWM冲突:步进电机控制使用的tone()函数和负压气泵控制使用的analogWrite()函数都可能使用到PWM(脉冲宽度调制),如果它们使用的是相同的定时器或中断,可能会导致冲突。

    3. 中断冲突:步进电机的控制可能依赖于定时器中断,如果负压气泵的PWM控制也使用了中断,两者可能会相互干扰。

    4. 代码逻辑问题:在do_command()函数中,步进电机的控制逻辑可能存在问题,例如tone()noTone()的使用方式可能不正确。

    5. 硬件连接问题:步进电机和负压气泵的连接可能存在问题,导致步进电机在某些情况下无法正确接收信号。

    为了解决这个问题,你可以尝试以下步骤:

    1. 检查电源:确保你的电源能够提供足够的电流给步进电机和负压气泵。可能需要使用外部电源或增加电源容量。

    2. 避免PWM冲突:检查步进电机和负压气泵是否使用了相同的PWM通道。如果是,尝试更改它们的PWM通道。

    3. 优化代码逻辑:重新审查步进电机控制的代码,确保tone()noTone()的使用是正确的。例如,tone()函数需要两个参数:频率和持续时间,你可能需要在停止步进电机时指定一个持续时间为0。

    4. 使用外部中断:如果步进电机控制依赖于中断,考虑使用外部中断而不是定时器中断,以减少冲突。

    5. 硬件检查:检查步进电机和负压气泵的硬件连接,确保没有接触不良或接线错误。

    6. 代码重构:考虑重构代码,将步进电机和负压气泵的控制逻辑分开处理,避免在同一个循环中同时执行。

    7. 使用库函数:考虑使用专门的库函数来控制步进电机和负压气泵,这些库通常已经处理了大部分潜在的冲突和问题。

    至于参考资料,你可以查看Arduino官方文档,了解如何使用PWM和中断,以及如何正确地控制步进电机。此外,也可以查找一些关于步进电机和PWM控制的教程和论坛讨论,这些资源可能会提供一些有用的见解和解决方案。

    如果你需要具体的代码实现,我可以帮你修改和优化现有的代码,但请注意,没有具体的硬件细节和完整的系统要求,提供的代码可能需要进一步调整才能在你的系统中正常工作。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月5日
  • 创建了问题 5月31日

悬赏问题

  • ¥15 求解答一下是否可以修改一个软件运行时生成的文件内部内置的文件创建时间?
  • ¥15 求在R环境下用corrplot画一个相关图
  • ¥20 WIN10蓝屏问题!
  • ¥15 Mac经常自动关机,再次打开后提示“电脑因出现问题而重新启动”
  • ¥60 使用ovito软件怎么得到金属玻璃的自由体积
  • ¥15 急!如何实现根据汇编指令推测硬件功能?
  • ¥20 excel处理10000万条数据方法
  • ¥15 hc32串口接收数据
  • ¥15 阻抗控制阻尼参数过小报错
  • ¥15 在Unity开发环境中用NPOI插件输出Word文档可以,当我打包到Windows系统软件的时候输出Word文档就出现文件损坏