Вращение шагового двигателя

Нет ответов
Maks878787
Offline
Зарегистрирован: 03.05.2016

Доброго времени суток! В програмировании полный ноль. Подключил к arduino uno Motor Shield(L293D) и шаговый двигатель 17HS2408 Nema17. Двигатель подключен к выходу м1 И м2. Нужно, что бы он крутился на 360 в одну сторону и на 360 в другую. На данный момент крутится в одном направлении. Какие команды нужно дописать?

 

// AFMotor_ConstantSpeed.pde
// -*- mode: C++ -*-
//
// Shows how to use AccelStepper to control a 3-phase motor, such as a HDD spindle motor
// using the Adafruit Motor Shield
// <a href="http://www.ladyada.net/make/mshield/index.html" title="http://www.ladyada.net/make/mshield/index.html" rel="nofollow">http://www.ladyada.net/make/mshield/index.html</a>.
// Create a subclass of AccelStepper which controls the motor pins via the
// Motor Shield serial-to-parallel interface

#include <AccelStepper.h>

// Arduino pin names for interface to 74HCT595 latch
// on Adafruit Motor Shield
#define MOTORLATCH 12
#define MOTORCLK 4
#define MOTORENABLE 7
#define MOTORDATA 8

// PWM pins, also used to enable motor outputs
#define PWM0A 5
#define PWM0B 6
#define PWM1A 9
#define PWM1B 10
#define PWM2A 11
#define PWM2B 3


// The main purpose of this class is to override setOutputPins to work with Adafruit Motor Shield
class AFMotorShield : public AccelStepper
{
public:
AFMotorShield(uint8_t interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5); 

virtual void setOutputPins(uint8_t mask);
};


AFMotorShield::AFMotorShield(uint8_t interface, uint8_t pin1, uint8_t pin2, uint8_t pin3, uint8_t pin4)
: AccelStepper(interface, pin1, pin2, pin3, pin4) 
{
// Enable motor control serial to parallel latch
pinMode(MOTORLATCH, OUTPUT);
pinMode(MOTORENABLE, OUTPUT);
pinMode(MOTORDATA, OUTPUT);
pinMode(MOTORCLK, OUTPUT);
digitalWrite(MOTORENABLE, LOW);

// enable both H bridges on motor 1
pinMode(PWM2A, OUTPUT);
pinMode(PWM2B, OUTPUT);
pinMode(PWM0A, OUTPUT);
pinMode(PWM0B, OUTPUT);
digitalWrite(PWM2A, HIGH);
digitalWrite(PWM2B, HIGH);
digitalWrite(PWM0A, HIGH);
digitalWrite(PWM0B, HIGH);

setOutputPins(0); // Reset
};

// Use the AF Motor Shield serial-to-parallel to set the state of the motor pins
// Caution: the mapping of AccelStepper pins to AF motor outputs is not
// obvious:
// AccelStepper Motor Shield output
// pin1 M4A
// pin2 M1A
// pin3 M2A
// pin4 M3A
// Caution this is pretty slow and limits the max speed of the motor to about 500/3 rpm
void AFMotorShield::setOutputPins(uint8_t mask)
{
uint8_t i;

digitalWrite(MOTORLATCH, LOW);
digitalWrite(MOTORDATA, LOW);

for (i=7; i<8; i++) 
{
digitalWrite(MOTORCLK, LOW);

if (mask & _BV(7-i))
digitalWrite(MOTORDATA, HIGH);
else
digitalWrite(MOTORDATA, LOW);

digitalWrite(MOTORCLK, HIGH);
}
digitalWrite(MOTORLATCH, HIGH);
}

AFMotorShield stepper(AccelStepper::HALF3WIRE, 0, 0, 0, 0); // 3 phase HDD spindle drive

void setup()
{ 
stepper.setMaxSpeed(500);	// divide by 3 to get rpm
stepper.setAcceleration(400);
stepper.moveTo(100000);	
}

void loop()
{ 
stepper.run();
}