专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

Arduino 控制多路步进电机

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月25日   【字体:

 前面用一片arduino控制一个步进电机,但是控制多路步进电机容易互相干扰,主要是每个脉冲延时用了delay函数。

 
一路两相的步进电机需要占用4个i/o口,因此一片arduino最多控制3个步进电机(不算模拟i/o)。
一个l298模块只能接一个步进电机。下面实验接2路电机的情况,3路时情况差不多。
 
(1)实验了一下arduino自带的stepper库,发现连接两个电机只能一个一个按顺序动,不能同时动。但是电机都能动,工作没有问题。这显然不是我们想要的
(2)改了一下自己编的步进电机程序,可以同时动了,但是两个电机的速度不好设置,变量太多。
最后做了个艰难的决定,自己编库文件。好久没动c语言了,忘得差不多了,只好在原有库函数的基础上改。改了一个晚上,终于没问题了,并且把原来库函数中的四拍的方法改成八拍,控制更准确,运动更平稳了。库函数在我的网盘下载,这几天没空了,等有空再改一下传到官网上去:
 
 
例子程序:
#include
const int stepsPerRevolution = 400;  // 对于两相四线的电机,一般步距角是1.8度,这里如果是四拍就写200,八拍就写400
                                    
 
// initialize the stepper library on pins 8 through 11:
Stepper myStepper1(stepsPerRevolution, 4,5,6,7);       //两个电机分别占四个脚     
Stepper myStepper2(stepsPerRevolution, 8,9,10,11);    
 
void setup() {
  // set the speed at 60 rpm:
  myStepper1.setSpeed(60);
   myStepper2.setSpeed(60);
  // initialize the serial port:
  Serial.begin(9600);
}
 
void loop() {
  
 
int r;
 for(int i=0; i<400;)
   { 
     r= myStepper1.stepOneStep(0);
     myStepper2.stepOneStep(1);//括号中的参数是方向,0和1代表不同转动方向
     if(r==2) i++;
   }
   
 
  delay(500);
  
  
}
 

StepperM.h:

 
/*
  Stepper.h - - Stepper library for Wiring/Arduino - Version 0.4
  
  Original library     (0.1) by Tom Igoe.
  Two-wire modifications   (0.2) by Sebastian Gassner
  Combination version   (0.3) by Tom Igoe and David Mellis
  Bug fix for four-wire   (0.4) by Tom Igoe, bug fix from Noah Shibley
  Muliti-motor modifications (0.5) by Xu Pei.
 
  Drives a unipolar or bipolar stepper motor using  2 wires or 4 wires
 
  When wiring multiple stepper motors to a microcontroller,
  you quickly run out of output pins, with each motor requiring 4 connections. 
 
  By making use of the fact that at any time two of the four motor
  coils are the inverse  of the other two, the number of
  control connections can be reduced from 4 to 2. 
 
  A slightly modified circuit around a Darlington transistor array or an L293 H-bridge
  connects to only 2 microcontroler pins, inverts the signals received,
  and delivers the 4 (2 plus 2 inverted ones) output signals required
  for driving a stepper motor.
 
  The sequence of control signals for 4 control wires is as follows:
 
  Step C0 C1 C2 C3
     1  1  0  1  0
     2  0  1  1  0
     3  0  1  0  1
     4  1  0  0  1
 
  The sequence of controls signals for 2 control wires is as follows
  (columns C1 and C2 from above):
 
  Step C0 C1
     1  0  1
     2  1  1
     3  1  0
     4  0  0
 
  The circuits can be found at 
  http://www.arduino.cc/en/Tutorial/Stepper
*/
 
// ensure this library description is only included once
#ifndef Stepper_h
#define Stepper_h
 
// library interface description
class Stepper {
  public:
    // constructors:
    Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2);
    Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4);
 
    // speed setter method:
    void setSpeed(long whatSpeed);
 
    // mover method:
    void step(int number_of_steps);
 
    // mover 1 step:
// dir:direction, 0 negtive; else positive.
//if return 0, the motor start move; else if return 1, waiting; return 2, move complete;
    int stepOneStep(int dir);
 
    int version(void);
 
  private:
    void stepMotor(int this_step);
    
    int direction;        // Direction of rotation
    int speed;          // Speed in RPMs
    unsigned long step_delay;    // delay between steps, in us, based on speed
    int number_of_steps;      // total number of steps this motor can take
    int pin_count;        // whether you're driving the motor with 2 or 4 pins
    int step_number;        // which step the motor is on
    
    // motor pin numbers:
    int motor_pin_1;
    int motor_pin_2;
    int motor_pin_3;
    int motor_pin_4;
    
    unsigned long last_step_time;      // time stamp in ms of when the last step was taken
 
int isWaiting; //signal of waiting
int isEightShot; //Eight-shot two-phase stepper motor 
};
 
#endif
 
关闭窗口

相关文章