Accelstepper DRV8825 Schrittmotor ansteuern

Guten Tag, für ein Projekt habe ich eine Schrittmotorkarte entworfen. Der verbaute Mikrocontroller ist ein ATMega328P-PU. Dieser soll zwei DRV8825 Schrittmotortreiber steuern.
Wenn ich die Step und Dir Pins über direkte Portmanipulation ansteuere laufen beide Motoren.
Ich möchte allerdings den Acccelstepper nutzen da dieser schon fertige Funktionen wie Beschleunigen mitbringt.
Leider läuft mit dem Accelstepper momentan nur Schrittmotortreiber1. Ich kann den Fehler leider nicht finden.

Schaltpläne der Platine:

#include <AccelStepper.h>

#define Disable PORTB|=0b00000010  //Schaltet Schrittmotortreiber ein
#define Enable  PORTB&=0b11111101  //Schaltet Schrittmotortreiber aus

#define DRV1_stepPin 6
#define DRV1_dirPin 11
#define DRV2_stepPin A1
#define DRV2_dirPin A0
#define DRV1_faultPin 4
#define DRV2_faultPin  5
#define EnablePin 15

const bool DRV1 = 0;
const bool DRV2 = 1;

byte DRV1_speed;
byte DRV1_dir;
byte DRV2_speed;
byte DRV2_dir;

AccelStepper DRV1stepper = AccelStepper(AccelStepper::DRIVER, DRV1_stepPin, DRV1_dirPin);
AccelStepper DRV2stepper = AccelStepper(AccelStepper::DRIVER, DRV2_stepPin, DRV2_dirPin);

//Funktion zum einstellen des Microsteppings
void Microstep(bool DRV, byte value)
{
  byte true_value;
  DDRC = DDRC | 0b00111111;
  if (!DRV)
  { switch (value) {
      case 2: {
          PORTC &= 0b11111001;
          PORTC |= 0b00000001;
          true_value = 2;
          break;
        }
      case 4: {
          PORTC &= 0b11111010;
          PORTC |= 0b00000010;
          true_value = 4;
          break;
        }
      case 8: {
          PORTC &= 0b11111011;
          PORTC |= 0b00000011;
          true_value = 8;
          break;
        }
      case 16: {
          PORTC &= 0b11111100;
          PORTC |= 0b00000100;
          true_value = 16;
          break;
        }
      case 32: {
          PORTC &= 0b11111101;
          PORTC |= 0b00000101;
          true_value = 32;
          break;
        }
      default: {
          PORTC &= 0b11111000;
          true_value = 1;
          break;
        }
    }
  }
  else
  { switch (value)
    { case 2: {
          PORTC &= 0b11001111;
          PORTC |= 0b00001000;
          true_value = 2;
          break;
        }
      case 4: {
          PORTC &= 0b11010111;
          PORTC |= 0b00010000;
          true_value = 4;
          break;
        }
      case 8: {
          PORTC &= 0b11011111;
          PORTC |= 0b00011000;
          true_value = 8;
          break;
        }
      case 16: {
          PORTC &= 0b11100111;
          PORTC |= 0b00100000;
          true_value = 16;
          break;
        }
      case 32: {
          PORTC &= 0b11101111;
          PORTC |= 0b00101000;
          true_value = 32;
          break;
        }
      default: {
          PORTC &= 0b11000111;
          true_value = 1;
          break;
        }
    }
  }
  return;
}



void setup() {

  //DRV1stepper.setEnablePin(EnablePin);
  //DRV2stepper.setEnablePin(EnablePin);
  Serial.begin(9600);

  // 1/4 Microstepping
  Microstep(DRV1, 4);
  Microstep(DRV2, 4);

  pinMode(EnablePin, OUTPUT);
  pinMode(DRV1_dirPin, OUTPUT);
  pinMode(DRV1_stepPin, OUTPUT);
  pinMode(DRV2_dirPin, OUTPUT);
  pinMode(DRV2_stepPin, OUTPUT);
  pinMode(DRV1_faultPin, INPUT);
  pinMode(DRV2_faultPin, INPUT);

  DRV1stepper.setMaxSpeed(1000);
  DRV1stepper.setSpeed(500);
  DRV2stepper.setMaxSpeed(1000);
  DRV2stepper.setSpeed(500);

  //DRV1stepper.enableOutputs();  //Schrittmotortreiber einschalten
  //DRV2stepper.enableOutputs();
  Enable; //Schrittmotortreiber einschalten
}

void loop() {

  DRV1stepper.runSpeed();
  DRV2stepper.runSpeed();


}

dir is wohl klar dass µC pins nicht gleich Arduino pins sind, oder?

Nein ist mir soweit nicht klar.

#define DRV1_stepPin PD5
#define DRV1_dirPin PD4
#define DRV2_stepPin PD6
#define DRV2_dirPin PD7
#define DRV1_faultPin PD2
#define DRV2_faultPin PD3
#define EnablePin PB1
1 Like

was soll das denn heisen? wärend programm Ausführung die Inputs auf Output schalten?

Vielen Dank es funktioniert jetzt !

Ja genau das sind die Pins zum einstellen des Microstepping. Sollte ich wohl besser im Setup() machen.

#include <AccelStepper.h>

#define DRV1_stepPin PD5
#define DRV1_dirPin PD4
#define DRV2_stepPin PD6
#define DRV2_dirPin PD7
#define DRV1_faultPin PD2
#define DRV2_faultPin PD3
#define EnablePin PB1

#define Disable PORTB|=(1<<1)  //Schaltet Schrittmotortreiber ein
#define Enable  PORTB&=~(1<<1)  //Schaltet Schrittmotortreiber aus

const bool DRV1 = 0;
const bool DRV2 = 1;

byte DRV1_speed;
byte DRV1_dir;
byte DRV2_speed;
byte DRV2_dir;

AccelStepper DRV1stepper = AccelStepper(AccelStepper::DRIVER, DRV1_stepPin, DRV1_dirPin);
AccelStepper DRV2stepper = AccelStepper(AccelStepper::DRIVER, DRV2_stepPin, DRV2_dirPin);

//Funktion zum einstellen des Microsteppings
void Microstep(bool DRV, byte value) {
  if (!DRV)
  { switch (value) {
      case 2: {
          PORTC |= 0b00000001;
          break;
        }
      case 4: {
          PORTC |= 0b00000010;
          break;
        }
      case 8: {
          PORTC |= 0b00000011;
          break;
        }
      case 16: {
          PORTC |= 0b00000100;
          break;
        }
      case 32: {
          PORTC |= 0b00000101;
          break;
        }
      default: {
          break;
        }
    }
  }  else  {
    switch (value) {
      case 2: {
          PORTC |= 0b00001000;
          break;
        }
      case 4: {
          PORTC |= 0b00010000;
          break;
        }
      case 8: {
          PORTC |= 0b00011000;
          break;
        }
      case 16: {
          PORTC |= 0b00100000;
          break;
        }
      case 32: {
          PORTC |= 0b00101000;
          break;
        }
      default: {
          break;
        }
    }
  }
}



void setup() {
  Serial.begin(9600);

  // 1/4 Microstepping
  DDRC |= B00111111; // mode pins als Output
  PORTC &= ~B00111111; //unnötig weil sowieso alles null
  Microstep(DRV1, 4);
  Microstep(DRV2, 4);

  pinMode(EnablePin, OUTPUT);
  pinMode(DRV1_dirPin, OUTPUT);
  pinMode(DRV1_stepPin, OUTPUT);
  pinMode(DRV2_dirPin, OUTPUT);
  pinMode(DRV2_stepPin, OUTPUT);
  pinMode(DRV1_faultPin, INPUT);
  pinMode(DRV2_faultPin, INPUT);

  DRV1stepper.setMaxSpeed(1000);
  DRV1stepper.setSpeed(500);
  DRV2stepper.setMaxSpeed(1000);
  DRV2stepper.setSpeed(500);

  Enable; //Schrittmotortreiber einschalten
}

void loop() {
  DRV1stepper.runSpeed();
  DRV2stepper.runSpeed();
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.