Arthur1088 发表于 2014-11-26 16:48:11

有关2相PM电机控制的紧急问题

arduino库里的steper库可以驱动4相5线混合式步进电机,但是驱动不了2相4线永磁式步进电机,请问是步进电机库不支持吗?但是我看库里面有2线和4线的,这是什么意思。还是永磁式和混合式的控制方式不同。求大神指导!!!
Drives a unipolar or bipolar stepper motor using2 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 inverseof 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
   11010
   20110
   30101
   41001

The sequence of controls signals for 2 control wires is as follows
(columns C1 and C2 from above):

Step C0 C1
   101
   211
   310
   400

The circuits can be found at

http://www.arduino.cc/en/Tutorial/Stepper


*/


#include "Arduino.h"
#include "Stepper.h"

/*
* two-wire constructor.
* Sets which wires should control the motor.
*/
Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)
{
this->step_number = 0;      // which step the motor is on
this->speed = 0;      // the motor speed, in revolutions per minute
this->direction = 0;      // motor direction
this->last_step_time = 0;    // time stamp in ms of the last step taken
this->number_of_steps = number_of_steps;    // total number of steps for this motor

// Arduino pins for the motor control connection:
this->motor_pin_1 = motor_pin_1;
this->motor_pin_2 = motor_pin_2;

// setup the pins on the microcontroller:
pinMode(this->motor_pin_1, OUTPUT);
pinMode(this->motor_pin_2, OUTPUT);

// When there are only 2 pins, set the other two to 0:
this->motor_pin_3 = 0;
this->motor_pin_4 = 0;

// pin_count is used by the stepMotor() method:
this->pin_count = 2;
}


/*
*   constructor for four-pin version
*   Sets which wires should control the motor.
*/

Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4)
{
this->step_number = 0;      // which step the motor is on
this->speed = 0;      // the motor speed, in revolutions per minute
this->direction = 0;      // motor direction
this->last_step_time = 0;    // time stamp in ms of the last step taken
this->number_of_steps = number_of_steps;    // total number of steps for this motor

// Arduino pins for the motor control connection:
this->motor_pin_1 = motor_pin_1;
this->motor_pin_2 = motor_pin_2;
this->motor_pin_3 = motor_pin_3;
this->motor_pin_4 = motor_pin_4;

// setup the pins on the microcontroller:
pinMode(this->motor_pin_1, OUTPUT);
pinMode(this->motor_pin_2, OUTPUT);
pinMode(this->motor_pin_3, OUTPUT);
pinMode(this->motor_pin_4, OUTPUT);

// pin_count is used by the stepMotor() method:
this->pin_count = 4;
}

/*
Sets the speed in revs per minute

*/
void Stepper::setSpeed(long whatSpeed)
{
this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
}

/*
Moves the motor steps_to_move steps.If the number is negative,
   the motor moves in the reverse direction.
*/
void Stepper::step(int steps_to_move)
{
int steps_left = abs(steps_to_move);// how many steps to take

// determine direction based on whether steps_to_mode is + or -:
if (steps_to_move > 0) {this->direction = 1;}
if (steps_to_move < 0) {this->direction = 0;}
   
   
// decrement the number of steps, moving one step each time:
while(steps_left > 0) {
// move only if the appropriate delay has passed:
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 (this->direction == 1) {
      this->step_number++;
      if (this->step_number == this->number_of_steps) {
          this->step_number = 0;
      }
      }
      else {
      if (this->step_number == 0) {
          this->step_number = this->number_of_steps;
      }
      this->step_number--;
      }
      // decrement the steps left:
      steps_left--;
      // step the motor to step number 0, 1, 2, or 3:
      stepMotor(this->step_number % 4);
    }
}
}

/*
* Moves the motor forward or backwards.
*/
void Stepper::stepMotor(int thisStep)
{
if (this->pin_count == 2) {
    switch (thisStep) {
      case 0: /* 01 */
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      break;
      case 1: /* 11 */
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, HIGH);
      break;
      case 2: /* 10 */
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      break;
      case 3: /* 00 */
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
      break;
    }
}
if (this->pin_count == 4) {
    switch (thisStep) {
      case 0:    // 1010
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      break;
      case 1:    // 0110
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, HIGH);
      digitalWrite(motor_pin_4, LOW);
      break;
      case 2:    //0101
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      break;
      case 3:    //1001
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      digitalWrite(motor_pin_3, LOW);
      digitalWrite(motor_pin_4, HIGH);
      break;
    }
}
}

/*
version() returns the version of the library:
*/
int Stepper::version(void)
{
return 4;
}

西红柿炒番茄lo 发表于 2014-11-26 17:35:40

你用的两相电机可能和库指的电机不同,我手上的的4相5线电机是8步的,不是库里的4步,你可以自己先测试步进电机的步序

Arthur1088 发表于 2014-11-28 13:56:41

西红柿炒番茄lo 发表于 2014-11-26 17:35 static/image/common/back.gif
你用的两相电机可能和库指的电机不同,我手上的的4相5线电机是8步的,不是库里的4步,你可以自己先测试步进 ...

2相的只有4步吧,应该只有4相的才有8步。我的电机就算是例程程序也没反应,很郁闷
页: [1]
查看完整版本: 有关2相PM电机控制的紧急问题