Hallo zusammen,
wir möchten einen Schrittmotor Nema34 mit einem Motortreiber HB860H über
einen Arduino ansteuern. Die Stromversorgung erfolgt über ein 400W
Netzteil (Spannung 70V, Strom 5.7A).
Ohne Last im Leerlauf funktioniert die Ansteuerung ohne weitere
Probleme. Sobald er allerdings in der Anlage verbaut ist, funktioniert
es entweder nur mit starkem Ruckeln, oder der Motortreiber geht sofort
in Störung nach dem Starten. Dabei kommt für 3 Sekunden allerdings erst
noch ein kurzes Geräusch vom Motor. Manchmal taucht die Störung auch
erst nach einigen Durchläufen auf.
Es handelt sich um einen Sägeanschlag. Die Referenzfahrt funktioniert
hierbei nur beim Starten im hinteren Drittel. Im vorderen Bereich
funktioniert es nur mit manueller Anschieb-Hilfe.
Wir sind etwas verwirrt, da es im Leerlauf funktioniert, und erst unter
leichtgängiger / meiner Meinung nach vernachlässigbarer Last zu diesen
Problemen kommt.
Was könnte eurer Meinung nach die Ursache dafür sein?
Nachfolgend das Arduino-Programm:
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <AccelStepper.h>
//--- Pin-Belegungen
const int rs = 0, en = 1, d4 = 2, d5 = 3, d6 = 4, d7 = 5; //Pin-Belegung für LCD
const int puls = 9, direct = 8; //Pin-Belegung für Motor
const int bremse = 6; //Pin-Belegung für Bremse
const int referenzSensor = 7; //Pin-Belegung für Referenzsensor
const int saegeSensor = 10; //Pin-Belegung für Sägemotor
const int schraubstockSensor = 11; //Pin-Belegung für Schraubstock
const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS] = {A0, A1, A2, A3}; //Pin-Belegung für Keypad (1-4, von links nach rechts)
byte colPins[COLS] = {A4, A5, 12, 13}; //Pin-Belegung für Keypad (5-8, von links nach rechts)
//--- Konstanten
const float lengthPerStep = 0.11f; //Länge pro Schritt
const float referenz = 3093; //Referenzposition nach der Referenzfahrt
const float extraLaenge = 10; //Extra-Länge bei der Schleifenfahrt
const float motorSpeed = 800;
//--- ab hier Programm ---
int mode = 0;
char eingabe[16];
long stelle = 0;
float laengeEingabe = 0;
float difLaenge = 0;
float pos = 0;
char posAnzeige[16];
long stepsNeeded = 0;
boolean saegeOff;
AccelStepper stepper(AccelStepper::DRIVER, puls, direct);
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
char keys[ROWS][COLS] = { //Zu entsprechende Tasten vom Keypad (* wurde bereits mit . ausgetauscht)
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'.', '0', '#', 'D'}
};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
pinMode(bremse, OUTPUT);
pinMode(referenzSensor, INPUT);
pinMode(saegeSensor, INPUT);
pinMode(schraubstockSensor, INPUT);
lcd.begin(16, 2);
lcd.print("Referenzfahrt");
stepper.setSpeed(100);
stepper.setAcceleration(750);
referenzfahrt();
stepper.setSpeed(motorSpeed);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
mode = 1;
}
void loop() {
char key = keypad.getKey();
if (digitalRead(saegeSensor) == LOW) {
saegeOff = true;
}
if (digitalRead(saegeSensor) == HIGH && mode != 4 && saegeOff) {
saegeOff = false;
mode = 4;
lcd.clear();
lcd.print("Freifahrt");
digitalWrite(bremse, HIGH);
stepper.move(lengthToSteps(40));
stepper.runToPosition();
digitalWrite(bremse, LOW);
}
if (digitalRead(schraubstockSensor) == HIGH && mode == 4 && mode != 5) {
mode = 5;
lcd.clear();
lcd.print("Zurückfahren");
digitalWrite(bremse, HIGH);
stepper.move(lengthToSteps(-40));
stepper.runToPosition();
digitalWrite(bremse, LOW);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
if (mode == 1 && key != '\0') {
if (key != 'A' && key != 'B' && key != 'C' && key != 'D' && key != '#' && stelle < 15) {
lcd.print(key);
eingabe[stelle] = key;
stelle++;
}
if (key == 'B') {
dtostrf(pos, 9, 4, posAnzeige);
lcd.clear();
lcd.print("Position:");
lcd.setCursor(0, 1);
lcd.print(posAnzeige);
delay (2000);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
if (key == '#' && stelle > 0) {
eingabe[stelle] = NULL;
stelle--;
lcd.setCursor(stelle,1);
lcd.print(' ');
lcd.setCursor(stelle,1);
}
if (key == 'D' && stelle > 0) {
laengeEingabe = atof(eingabe);
if (laengeEingabe < 400 || laengeEingabe > 3100) {
lcd.clear();
lcd.print("Nur 400 - 3100");
delay (2000);
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
else {
difLaenge = pos - laengeEingabe;
mode = 2;
}
}
}
if (mode == 2) {
if (difLaenge > 0) {
stepsNeeded = lengthToSteps(difLaenge);
digitalWrite(bremse, HIGH);
stepper.move(stepsNeeded);
stepper.runToPosition();
digitalWrite(bremse, LOW);
//stepper.step(stepsNeeded);
/*for (int i = 0; i < stepsNeeded; i++) {
stepper.step(1); //ANPASSEN
}*/
pos = pos - stepsToLength(stepsNeeded);
}
if (difLaenge < 0) {
stepsNeeded = lengthToSteps(-difLaenge);
long extraSteps = lengthToSteps(extraLaenge);
digitalWrite(bremse, HIGH);
stepper.move(-(stepsNeeded + extraSteps));
stepper.runToPosition();
stepper.move(extraSteps);
stepper.runToPosition();
digitalWrite(bremse, LOW);
pos = pos + stepsToLength(stepsNeeded);
}
dtostrf(pos, 9, 4, posAnzeige);
lcd.clear();
lcd.print("Position:");
lcd.setCursor(0, 1);
lcd.print(posAnzeige);
mode = 3;
}
if (mode == 3 && key == 'A') {
lcd.clear();
lcd.print("Eingabe:");
lcd.setCursor(0, 1);
memset(eingabe, 0, sizeof eingabe);
stelle = 0;
mode = 1;
}
}
void referenzfahrt() {
digitalWrite(bremse, HIGH);
while (digitalRead(referenzSensor) == LOW) {
stepper.move(-500);
stepper.runSpeedToPosition();
}
/*stepper.move(200); //Testweise rauskommentiert
stepper.runToPosition();
stepper.setSpeed(50);
while (digitalRead(referenzSensor) == LOW) {
stepper.move(-500);
stepper.runSpeedToPosition();
}*/
stepper.setCurrentPosition(0);
digitalWrite(bremse, LOW);
pos = referenz;
}
long lengthToSteps(float laenge) {
long steps = laenge / lengthPerStep;
return steps;
}
float stepsToLength(long steps) {
float laenge = steps * lengthPerStep;
return laenge;
}