极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20530|回复: 19

如何缩短程序上传的时间

[复制链接]
发表于 2015-7-16 18:46:10 | 显示全部楼层 |阅读模式
本帖最后由 凯风自北来 于 2015-7-17 09:51 编辑

标题党,见谅!
问题是这样的:我正在做步进电机的实验,想通过改变程序里的参数值随时改变电机转速,但是每改变一次参数值都要重新编译上传,而上传的过程中电机会停转。我希望在改变参数时电机不停转,或者说停转时间短到察觉不到,应该怎么做呢?如果不能缩短程序上传时间,是否还有其他方法呢?

这样在串口监视器里发送参数为什么不可以呢
  1. #include <AccelStepper.h>
  2. AccelStepper stepper1(1, 9, 8);
  3. int  velocity1;
  4. int pos1=1600;
  5. void setup()
  6. {  Serial.begin(9600);
  7.    
  8.   
  9.   }  


  10. void loop() {
  11.    if (Serial.available() > 0)
  12.     {
  13.    velocity1 = Serial.read();}
  14.     stepper1.setMaxSpeed(velocity1);
  15.    stepper1.setAcceleration(1000);  
  16.    stepper1.moveTo(-pos1);// put your main code here, to run repeatedly:
  17.    stepper1.run();
  18. }
复制代码
回复

使用道具 举报

发表于 2015-7-16 19:04:07 | 显示全部楼层
把参数用串口传过去,不要写死在代码里。
回复 支持 反对

使用道具 举报

发表于 2015-7-16 20:48:38 | 显示全部楼层
用Serial输入字符通过串口控制电机
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-16 20:52:47 | 显示全部楼层
seagatecm 发表于 2015-7-16 19:04
把参数用串口传过去,不要写死在代码里。

这样在串口监视器里发送参数为什么不可以呢
  1. #include <AccelStepper.h>
  2. AccelStepper stepper1(1, 9, 8);
  3. int  velocity1;
  4. int pos1=1600;
  5. void setup()
  6. {  Serial.begin(9600);
  7.    
  8.   
  9.   }  


  10. void loop() {
  11.    if (Serial.available() > 0)
  12.     {
  13.    velocity1 = Serial.read();}
  14.     stepper1.setMaxSpeed(velocity1);
  15.    stepper1.setAcceleration(1000);  
  16.    stepper1.moveTo(-pos1);// put your main code here, to run repeatedly:
  17.    stepper1.run();
  18. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-16 21:02:10 | 显示全部楼层
A丶XING 发表于 2015-7-16 20:48
用Serial输入字符通过串口控制电机

请问我这么写是哪里出错了么
回复 支持 反对

使用道具 举报

发表于 2015-7-16 21:32:22 | 显示全部楼层
簡單的話, 用 Serial.parseInt() 去讀取數值, 之後再清空 serial buffer, 例如: while(Serial.available()) Serial.read();
回复 支持 反对

使用道具 举报

发表于 2015-7-17 09:36:09 | 显示全部楼层
如果你用arduino自带的串口工具发送数据,产生意想不到的效果,因为发送的指令是以字符的形式。
即使时你发送的数字,arduino读进去的数据也是ascii码,
改变步进电机的速度也就是改变脉冲的频率。
你在读出串口的字符时最好加一些处理,让它变成数值。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-18 14:38:05 | 显示全部楼层
seagatecm 发表于 2015-7-16 19:04
把参数用串口传过去,不要写死在代码里。

这样搞了感觉还是有点慢,能延迟再短点吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-18 14:39:18 | 显示全部楼层
Super169 发表于 2015-7-16 21:32
簡單的話, 用 Serial.parseInt() 去讀取數值, 之後再清空 serial buffer, 例如: while(Serial.available()) ...

请问这个还需要完善吗
  1. #include <AccelStepper.h>
  2. AccelStepper stepper1(1, 9, 8); unsigned long  pos1 = 16000;
  3. int velocity1;               
  4. void setup()
  5. { Serial.begin(9600);
  6. //  Serial.flush();
  7.   }  
  8.   void loop()
  9. {
  10. if (Serial.available() ) {
  11.   velocity1=Serial.parseInt();
  12. Serial.println(velocity1);}
  13.    stepper1.setMaxSpeed(velocity1);
  14.    stepper1.setAcceleration(1000);
  15.    stepper1.moveTo(-pos1);
  16.   stepper1.run();
  17. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-18 14:44:07 | 显示全部楼层
Super169 发表于 2015-7-16 21:32
簡單的話, 用 Serial.parseInt() 去讀取數值, 之後再清空 serial buffer, 例如: while(Serial.available()) ...

这个确实很方便随时调整电机的速度,但是如果一个控制板连两个独立运行的电机的话,想只改变其中一个的速度而另一个照常运行,这个程序的模式是不是就不行了呢?重新在串口里输入数值的话电机都要停顿吧
回复 支持 反对

使用道具 举报

发表于 2015-7-20 00:00:48 | 显示全部楼层
凯风自北来 发表于 2015-7-18 14:44
这个确实很方便随时调整电机的速度,但是如果一个控制板连两个独立运行的电机的话,想只改变其中一个的速 ...

不會有問題的, 你可以連續讀兩個數 (即執行 Serial.parseInt 兩次).
如果你只輸入一個數, 第二個會是 0.  所以最好用數值為 0 代表不變.
當你想改變第二個為 123 時, 就事入:  0  123
也許這樣會做成不能設定為 0, 但電機一般有最少數值的.  基本上 1 的速度也可看成是停了, 你把 1 當成 0 去設定說可以.
即是如果想把 第一個停了, 第二個設定 123, 就輸入:  1 123
如果只想把第二個停了, 就輸入: 0 1
用類似的方法, 要控制多少個也不是問題.
回复 支持 反对

使用道具 举报

发表于 2015-7-20 10:18:50 | 显示全部楼层
好心不行吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-20 10:40:22 | 显示全部楼层
Super169 发表于 2015-7-20 00:00
不會有問題的, 你可以連續讀兩個數 (即執行 Serial.parseInt 兩次).
如果你只輸入一個數, 第二個會是 0. ...

还是有停顿啊
  1. #include <AccelStepper.h>
  2. AccelStepper stepper1(1, 9, 8);
  3. AccelStepper stepper2(1, 7, 6);
  4. String inString = "";
  5. unsigned long  pos1 = 1600000;
  6. unsigned long  pos2 = 1600000;
  7. float velocity1;        
  8. float velocity2;      
  9. void setup()
  10. { Serial.begin(9600);
  11. //  Serial.flush();
  12.   }  
  13. void loop()
  14. {
  15. while (Serial.available() > 0) {
  16. int inChar = Serial.read();
  17. if ((char)inChar == 'A') {
  18. do {
  19. inChar = Serial.read();
  20. inString += (char)inChar;
  21. } while (isDigit(inChar));
  22. velocity1=Serial.parseFloat();
  23. inString = "";
  24. }
  25. if ((char)inChar == 'B') {
  26. do {
  27. inChar = Serial.read();
  28. inString += (char)inChar;
  29. } while (isDigit(inChar));
  30. velocity2=Serial.parseFloat();
  31. inString = "";
  32. }}
  33. // Serial.println(velocity1);}
  34.    stepper1.setMaxSpeed(velocity1);
  35.    stepper1.setAcceleration(1000);
  36.    stepper2.setMaxSpeed(velocity2);
  37.    stepper2.setAcceleration(1000);
  38.    stepper1.moveTo(-pos1);
  39.    stepper2.moveTo(pos2);
  40.    stepper1.run();
  41.    stepper2.run();
  42.    /*inString = "";
  43. delay(200);*/
  44. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-7-20 11:36:13 | 显示全部楼层
不明白你說的 停顿 是什麼意思, 在那裡停顿?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-20 14:37:02 | 显示全部楼层
Super169 发表于 2015-7-20 11:36
不明白你說的 停顿 是什麼意思, 在那裡停顿?

重新发送程序的时候到控制板的时候会停顿一秒左右
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 19:58 , Processed in 0.050341 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表