Hallo zusammen,
ich habe einen kleinen Sketch geschrieben, welches einen bipolaren Schrittmotor welcher, von einem DRV8825 Motortreiber getrieben wird, ansteuern soll. Zusätzlich soll nach jeder ausgeführten Umdrehung ein 16x2 Zeichen LCD Display (HD44780) mit I2C Schnittstelle die Anzahl ausgeführter Umdrehungen ausgeben. Die Ansteuerung des Motors und des I2C Displays funktioniert soweit auch, jedoch benötigt die Übertragung der Display Inhalte über den I2C Bus vermutlich eine Vielzahl an Takten, was zum kurzzeitigen Stocken des Schrittmotors führt.
Da ich bislang keine Idee habe wie ich das Timing Problem in den griff bekommen soll hoffe ich, dass ihr mir weiter helfen könnt.
Als Testumgebung wird ein Arduino Mega 2560 r3 und ein Ramps 1.4 shield verwendet.
// Dieser Sketch soll einen bipolaren Schrittmotor, welcher von einem DRV8825 Motor Treiber versorgt wird ansteuern.
// Nach jeder erfolgten Umdrehung soll auf dem Angeschlossenen 16x2 Zeichen LCD Display (HD44780) mit I2C Schnittstelle die Ausgeführten Umdrehungen Angezeigt werden.
//
// Bemerkung: Der Sketch ist legiglich für Tests. Nach den im Sketch definierten 100 Umdrehungen des Schrittmotors muss der Arduino resettet werden um das Programm erneut zu starten.
//
// Problem: Die I2C Kommunikation benötigt eine vielzahl an takten des Prozessors, was zum Kurzzeitigen Stocken des Schrittmotors führt.
//
#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Definition der Schrittmotoranschlüsse und Motorschnittstellentyp. Der Typ der Motorschnittstelle muss bei Verwendung eines Treibers auf 1 gesetzt werden:
#define dirPin 48
#define stepPin 46
#define enablePin 62
#define motorInterfaceType 1
int NumOfStepsForRot = 200; // Anzahl Schritte die für eine Umdrehung benötigt werden
// Erzeugt eine neue instance von der AccelStepper class:
AccelStepper stepper1 = AccelStepper(motorInterfaceType, stepPin, dirPin);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Initialisiert die Bibliothek und meldet den Arduino als Busmaster an.
Wire.begin();
// Setzt die Taktfrequenz für den I2C-Bus (Versuch um die Übertragung zu beschleunigen)
Wire.setClock(400000L);
// Initialisiert den I2C LCD Display
lcd.init();
// Einschalten die Hintergrundbeleuchtung
lcd.backlight();
// Setzen des Cursors an Position: Spalte 1 Zeile 1
lcd.setCursor(0, 0);
// Übergeben des auszugebenden Inhaltes
lcd.print("Anzahl Umdrehungen: ");
// Setzen der Maximalen Geschwindikeit in Schrippen pro Sekunde
stepper1.setMaxSpeed(900.0);
// Setzen der Beschleunigung in Schritten pro Sekunde
stepper1.setAcceleration(50.0);
// Setzen des Umdrehungsziels z.B. 200 Schritte
stepper1.moveTo(NumOfStepsForRot*100);
// Definieren des Einschalt Pins für den Motor Treiber
stepper1.setEnablePin(enablePin);
// Pegellogik definieren von Schritt, Richtung und des Einschalt Pin
stepper1.setPinsInverted(false, false, true);
}
void loop() {
// Wenn Zielposition erreicht wurde Motor deaktivieren
if (stepper1.distanceToGo() == 0)
stepper1.disableOutputs();
// Starten des Motor Jobs
stepper1.run();
// LCD Ausgabe der ausgeführten Umdrehungen
if ((stepper1.currentPosition() % NumOfStepsForRot) == 0) {
updateDisplay();
}
}
// Funktion zur Aktualisierung des I2C LCD Displays
void updateDisplay() {
// Setzen des Cursors an Position: Spalte 1 Zeile 2
lcd.setCursor(0, 1);
// Übergeben der Anzhal an Umdrehungen des Schrittmotors
lcd.print(int(stepper1.currentPosition()/NumOfStepsForRot));
}
AccelStepper_I2C_LCD_16x2.txt (2.84 KB)
