恳请高手留步:步进电机正反转速度不一致
材料——Arduino Mega 2560板子ULN2003APG驱动板
28BYJ-48电机
杜邦线若干
主程序:
/*
long step_delay=0;
long last_step_time=0;
int step_number=0;
int Pin0=8,Pin1=9,Pin2=10,Pin3=11;
int number_of_steps=64;//1:64
*/
/******************/
#include<my_stepper.h>
My_stepper stepper(8,9,10,11);
void setup()
{
Serial.begin(9600);
stepper.my_setSpeed(500);
}
void loop()
{
stepper.my_step(64*64,1);//64*64 step == 2*PI
//delay(2000);
}
库文件:
#ifndef MY_STEPPR_H
#define MY_STEPPR_H
class My_stepper{
public:
My_stepper(int p1,int p2,int p3,int p4);
void my_stepMotor(int thisStep);
void my_setSpeed(long whatSpeed);
void my_step(int steps_to_move,int direction);
private:
int whatSpeed; //set speed
long step_delay; //it relate to speed
long last_step_time;
int step_number;
int number_of_steps; //1:64
int Pin0,Pin1,Pin2,Pin3;
};
#endif
.cpp文件
/*
* Filename:my_stepper.cpp
*
* Description:
*
* Version:1.0
* Created:2014-1-13 11:40:42
* Revision:none
* Compiler:gcc
*
* Author:YOUR NAME (V__KING__),
* Company: sogworks
*
* =====================================================================================
*/
#include"my_stepper.h"
#include"Arduino.h"
My_stepper::My_stepper(int p1,int p2,int p3,int p4)
{
this->Pin0=p1;
this->Pin1=p2;
this->Pin2=p3;
this->Pin3=p4;
pinMode(this->Pin0,OUTPUT);
pinMode(this->Pin1,OUTPUT);
pinMode(this->Pin2,OUTPUT);
pinMode(this->Pin3,OUTPUT);
}
void My_stepper::my_stepMotor(int thisStep)
{
switch (thisStep) {
case 0:
digitalWrite(this->Pin0, LOW);
digitalWrite(this->Pin1, LOW);
digitalWrite(this->Pin2, LOW);
digitalWrite(this->Pin3, HIGH);
break;
case 1:
digitalWrite(this->Pin0, LOW);
digitalWrite(this->Pin1, LOW);
digitalWrite(this->Pin2, HIGH);
digitalWrite(this->Pin3, HIGH);
break;
case 2:
digitalWrite(this->Pin0, LOW);
digitalWrite(this->Pin1, LOW);
digitalWrite(this->Pin2, HIGH);
digitalWrite(this->Pin3, LOW);
break;
case 3:
digitalWrite(this->Pin0, LOW);
digitalWrite(this->Pin1, HIGH);
digitalWrite(this->Pin2, HIGH);
digitalWrite(this->Pin3, LOW);
break;
case 4:
digitalWrite(this->Pin0, LOW);
digitalWrite(this->Pin1, HIGH);
digitalWrite(this->Pin2, LOW);
digitalWrite(this->Pin3, LOW);
break;
case 5:
digitalWrite(this->Pin0, HIGH);
digitalWrite(this->Pin1, HIGH);
digitalWrite(this->Pin2, LOW);
digitalWrite(this->Pin3, LOW);
break;
case 6:
digitalWrite(this->Pin0, HIGH);
digitalWrite(this->Pin1, LOW);
digitalWrite(this->Pin2, LOW);
digitalWrite(this->Pin3, LOW);
break;
case 7:
digitalWrite(this->Pin0, HIGH);
digitalWrite(this->Pin1, LOW);
digitalWrite(this->Pin2, LOW);
digitalWrite(this->Pin3, HIGH);
break;
default:
digitalWrite(this->Pin0, LOW);
digitalWrite(this->Pin1, LOW);
digitalWrite(this->Pin2, LOW);
digitalWrite(this->Pin3, LOW);
break;
}
}
void My_stepper::my_setSpeed(long whatSpeed)
{
this->number_of_steps=64;
this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
}
void My_stepper::my_step(int steps_to_move,int direction)
{
int steps_left = abs(steps_to_move);// how many steps to take
// decrement the number of steps, moving one step each time:
while(steps_left > 0) {
// move only if the appropriate delay has passed:examples
if (millis() - this->last_step_time >= this->step_delay) {
// get the timeStamp of when you stepped:
this->last_step_time = millis();
// increment or decrement the step number,
// depending on direction:
if (direction == 1) {
this->step_number++;
if (this->step_number == this->number_of_steps) {
this->step_number = 0;
}
}
else if(direction==-1){
if (this->step_number == 0) {
this->step_number = this->number_of_steps;
}
this->step_number--;
Serial.println(this->step_number);
}
// decrement the steps left:
steps_left--;
// step the motor to step number 0, 1, 2, or 3:
my_stepMotor(this->step_number % 8);
}
}
}
Keywords文件
My_stepper KEYWORD1
my_stepMotor KEYWORD2
my_setSpeed KEYWORD3
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)有没有可能是电机的问题?
恳请高手留步并指教,谢谢!
图片与视频资料
本帖最后由 wolfcolorful 于 2016-7-19 15:29 编辑接线方式参考http://www.arduino.cn/thread-12508-1-1.html
运行视频
http://v.youku.com/v_show/id_XMTY0OTc0NDMyMA==.html?from=y1.7-2
http://v.youku.com/v_show/id_XMTY0OTc0NDMxMg==.html?from=y1.7-2 或者说其实可能是因为换线8拍的驱动方式不再适合、需要改变驱动方式? 屏蔽cpp文件中的 Serial.println(this->step_number)即可正常运转。
难道是因为频繁串口通信导致影响步进电机的时序吗?!
页:
[1]