极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14838|回复: 3

恳请高手留步:步进电机正反转速度不一致

[复制链接]
发表于 2016-7-19 15:02:10 | 显示全部楼层 |阅读模式
材料——Arduino Mega 2560板子
             ULN2003APG驱动板
             28BYJ-48电机
             杜邦线若干
主程序:
  1. /*
  2. long step_delay=0;
  3. long last_step_time=0;
  4. int step_number=0;

  5. int Pin0=8,Pin1=9,Pin2=10,Pin3=11;
  6. int number_of_steps=64;  //1:64
  7. */


  8. /******************/
  9. #include<my_stepper.h>
  10. My_stepper stepper(8,9,10,11);
  11. void setup()
  12. {
  13.     Serial.begin(9600);
  14.   stepper.my_setSpeed(500);
  15. }

  16. void loop()
  17. {
  18.   stepper.my_step(64*64,1);//64*64 step == 2*PI
  19.   //delay(2000);
  20. }
复制代码


库文件:

  1. #ifndef MY_STEPPR_H
  2. #define MY_STEPPR_H

  3. class My_stepper{
  4.     public:
  5.         My_stepper(int p1,int p2,int p3,int p4);
  6.         void my_stepMotor(int thisStep);
  7.         void my_setSpeed(long whatSpeed);
  8.         void my_step(int steps_to_move,int direction);

  9.     private:
  10.         int whatSpeed;            //set speed
  11.         long step_delay;        //it relate to speed
  12.         long last_step_time;
  13.         int step_number;
  14.         int number_of_steps;    //1:64
  15.         int Pin0,Pin1,Pin2,Pin3;
  16. };


  17. #endif
复制代码


.cpp文件
  1. /*
  2. *       Filename:  my_stepper.cpp
  3. *
  4. *    Description:  
  5. *
  6. *        Version:  1.0
  7. *        Created:  2014-1-13 11:40:42
  8. *       Revision:  none
  9. *       Compiler:  gcc
  10. *
  11. *         Author:  YOUR NAME (V__KING__),
  12. *        Company:         sogworks
  13. *
  14. * =====================================================================================
  15. */

  16. #include"my_stepper.h"
  17. #include"Arduino.h"
  18. My_stepper::My_stepper(int p1,int p2,int p3,int p4)
  19. {
  20.         this->Pin0=p1;       
  21.         this->Pin1=p2;
  22.         this->Pin2=p3;
  23.         this->Pin3=p4;
  24.         pinMode(this->Pin0,OUTPUT);
  25.         pinMode(this->Pin1,OUTPUT);
  26.         pinMode(this->Pin2,OUTPUT);
  27.         pinMode(this->Pin3,OUTPUT);
  28.        
  29. }
  30. void My_stepper::my_stepMotor(int thisStep)
  31. {
  32.         switch (thisStep) {
  33.                 case 0:
  34.                         digitalWrite(this->Pin0, LOW);
  35.                         digitalWrite(this->Pin1, LOW);
  36.                         digitalWrite(this->Pin2, LOW);
  37.                         digitalWrite(this->Pin3, HIGH);
  38.                         break;
  39.                 case 1:
  40.                         digitalWrite(this->Pin0, LOW);
  41.                         digitalWrite(this->Pin1, LOW);
  42.                         digitalWrite(this->Pin2, HIGH);
  43.                         digitalWrite(this->Pin3, HIGH);
  44.                         break;
  45.                 case 2:
  46.                         digitalWrite(this->Pin0, LOW);
  47.                         digitalWrite(this->Pin1, LOW);
  48.                         digitalWrite(this->Pin2, HIGH);
  49.                         digitalWrite(this->Pin3, LOW);
  50.                         break;
  51.                 case 3:
  52.                         digitalWrite(this->Pin0, LOW);
  53.                         digitalWrite(this->Pin1, HIGH);
  54.                         digitalWrite(this->Pin2, HIGH);
  55.                         digitalWrite(this->Pin3, LOW);
  56.                         break;
  57.                 case 4:
  58.                         digitalWrite(this->Pin0, LOW);
  59.                         digitalWrite(this->Pin1, HIGH);
  60.                         digitalWrite(this->Pin2, LOW);
  61.                         digitalWrite(this->Pin3, LOW);
  62.                         break;
  63.                 case 5:
  64.                         digitalWrite(this->Pin0, HIGH);
  65.                         digitalWrite(this->Pin1, HIGH);
  66.                         digitalWrite(this->Pin2, LOW);
  67.                         digitalWrite(this->Pin3, LOW);
  68.                         break;
  69.                 case 6:
  70.                         digitalWrite(this->Pin0, HIGH);
  71.                         digitalWrite(this->Pin1, LOW);
  72.                         digitalWrite(this->Pin2, LOW);
  73.                         digitalWrite(this->Pin3, LOW);
  74.                         break;
  75.                 case 7:
  76.                         digitalWrite(this->Pin0, HIGH);
  77.                         digitalWrite(this->Pin1, LOW);
  78.                         digitalWrite(this->Pin2, LOW);
  79.                         digitalWrite(this->Pin3, HIGH);
  80.                         break;
  81.                 default:
  82.                         digitalWrite(this->Pin0, LOW);
  83.                         digitalWrite(this->Pin1, LOW);
  84.                         digitalWrite(this->Pin2, LOW);
  85.                         digitalWrite(this->Pin3, LOW);
  86.                         break;
  87.         }
  88. }

  89. void My_stepper::my_setSpeed(long whatSpeed)
  90. {
  91.         this->number_of_steps=64;
  92.   this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
  93. }


  94. void My_stepper::my_step(int steps_to_move,int direction)
  95. {  
  96.         int steps_left = abs(steps_to_move);  // how many steps to take

  97.         // decrement the number of steps, moving one step each time:
  98.         while(steps_left > 0) {
  99.                 // move only if the appropriate delay has passed:examples
  100.                 if (millis() - this->last_step_time >= this->step_delay) {
  101.                         // get the timeStamp of when you stepped:
  102.                         this->last_step_time = millis();
  103.                         // increment or decrement the step number,
  104.                         // depending on direction:
  105.                         if (direction == 1) {
  106.                                 this->step_number++;
  107.                                 if (this->step_number == this->number_of_steps) {
  108.                                         this->step_number = 0;
  109.                                 }
  110.                         }
  111.                         else if(direction==-1){
  112.                                 if (this->step_number == 0) {
  113.                                         this->step_number = this->number_of_steps;
  114.                                 }
  115.                                 this->step_number--;
  116.                                 Serial.println(this->step_number);
  117.                         }
  118.                         // decrement the steps left:
  119.                         steps_left--;
  120.                         // step the motor to step number 0, 1, 2, or 3:
  121.                         my_stepMotor(this->step_number % 8);
  122.                 }
  123.         }
  124. }
复制代码


Keywords文件
  1. My_stepper        KEYWORD1
  2. my_stepMotor        KEYWORD2
  3. my_setSpeed        KEYWORD3
  4. my_step        KEYWORD4
复制代码


以上代码均为转载。地址http://blog.csdn.net/v__king__/article/details/18222323

问题描述如下:
1)在软件中更改direction参数为-1,即换向旋转,速度为正常的1/3左右。
2)更改电机连接线的相序,从A-B-C-D换为A-B-D-C,同时将direction参数更改为-1,电机运行方向与1)相反,速度一致;但是如果不更改direction参数,速度依然为正常的1/3。

分析如下:
1)设定的4相8拍的驱动方式应该没有问题;
2)程序中换向运行的语句看不出来有什么问题;
3)有没有可能是电机的问题?

恳请高手留步并指教,谢谢!
回复

使用道具 举报

 楼主| 发表于 2016-7-19 15:02:11 | 显示全部楼层

图片与视频资料

本帖最后由 wolfcolorful 于 2016-7-19 15:29 编辑

接线方式参考http://www.arduino.cn/thread-12508-1-1.html

运行视频


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-19 16:05:12 | 显示全部楼层
或者说其实可能是因为换线8拍的驱动方式不再适合、需要改变驱动方式?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-19 17:38:49 | 显示全部楼层
屏蔽cpp文件中的 Serial.println(this->step_number)即可正常运转。
难道是因为频繁串口通信导致影响步进电机的时序吗?!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 07:28 , Processed in 0.041530 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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