Hallo liebes Arduino-Forum,
meine Hardware besteht aus folgenden Komponenten:
- Arduino Uno mit aufgestecktem
- Arduino Motor Shield Rev3
- externe Versorgung über 12 V-Netzteil
- Schrittmotor - Nanotec ST5818M2008-A
http://www.motionusa-store.com.s3-website-us-east-1.amazonaws.com/nanotec/nanotec_Schrittmotor-ST5818.pdf - Linearachse mit Spindelantrieb zum Verfahren von ca. 1 m
- Taster zum Ansteuern des Motors mit entsprechender Richtung
Das unten aufgeführte Script ermöglicht einen Betrieb des Schrittmotors mit 250 U/min. Sowohl über Taster (händisch) als auch über Serielle Schnittstelle aus einem anderen Programm heraus (hier nur für den Handbetrieb eingekürzt).
Um den kleinsten möglichen Schritt (1,8°) des Motors in einen präziseren Weg an der Linearachse umzusetzen, soll demnächst ein passendes zweistufiges Planetengetriebe mit 1:50 vorgeschaltet werden.
Damit die Anwendung dann nicht extrem langsam wird, möchte ich den Schrittmotor schneller laufen lassen (laut Datenblatt max. 3000 U/min möglich bei geringem Abtriebsmoment).
Das unten aufgeführte Script nutze ich um die 250 U/min zu erreichen. Die Drehzahl wird "sanft" über eine Rampe angefahren.
Mein Problem:
Ausgebauter Motor - Leerlauf:
- Erreicht der Motor die 250 U/min vibriert er teils spürbar aber er läuft und funktiniert auch an der Spindel
- Bei Zieldrehzahl über 300 U/min läuft der Motor zwar an, bleibt ab ca. 300 U/min stehen und vibriert nur noch
- Bei Zieldrehzahl 2000 U/min läuft der Motor an und bleibt bei ca. 300 U/min stehen und vibriert nur noch - man kann ihn durch schütteln dann jedoch in Gang bringen (mit 2000 U/min)
Frage:
- Auf dem Motor sind aufgedruckt 2.0 A und 3.4 V - Der Blick ins Datenblatt verrät, dass scheinbar 48 V und 2,8 A notwendig sind. Habe ich das korrekt verstanden ?
Ist es somit nur Glück, dass der Motor in dem aktuellen Anwendungsfall mit 250 U/min funktioniert? - Wäre der TB6600 Stepper Motor Driver (max. 42 V - aber keine 48V ) statt dem Motor Schield Rev3 mit 12 V geeignet das Problem zu lösen, oder muss der Treiber noch "größer" sein? Ich brauche kaum Drehmoment, sondern nur Präzisison
- Oder liegt die Ursache der geringen erreichbaren Drehzahl in meinem Script?
Script:
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 12,13);
// give the motor control pins names:
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
const int betriebsart = 2;
const int stepvor = 4;
const int steprueck = 5;
const int vor = 6;
const int rueck = 7;
String serialInput = "";
long x = 0;
//int speed = 2200; //upm - geht im Leerlauf unb wenn detr Motor zum Anlaufen leicht um die Hochachse geschüttelt wird
int speed = 250; //upm
int rampSpeed = 60;
long letzterDurchlauf = 0;
long letzteFahrt = 0;
int strom;
int stepsToDo = 0;
int drehrichtung;
void setup() {
Serial.begin(9600);
// set the PWM and brake pins so that the direction pins // can be used to control the motor:
pinMode(pwmA, OUTPUT);
pinMode(pwmB, OUTPUT);
pinMode(brakeA, OUTPUT);
pinMode(brakeB, OUTPUT);
digitalWrite(pwmA, HIGH);
digitalWrite(pwmB, HIGH);
digitalWrite(brakeA, LOW);
digitalWrite(brakeB, LOW);
pinMode(betriebsart, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
digitalWrite(betriebsart, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
// initialize the serial port:
Serial.begin(9600);
Serial.setTimeout(100);
// set the motor speed (for multiple steps only):
myStepper.setSpeed(speed);
// power 0%
analogWrite(3,0);
analogWrite(11,0);
Serial.println("setup complete");
} // end setup
void loop() {
if (digitalRead(betriebsart) == LOW) handbetrieb();
// wenn fahrt lange her, strom wieder ausstellen
if ((millis() - letzteFahrt ) > 3000) {
analogWrite(3,0);
analogWrite(11,0);
// myStepper.setSpeed(speed);
delay(5);
x=millis();
rampSpeed = 30;
}
}
void handbetrieb() {
// Button on pin 6 = rückwärts drehen
while(digitalRead(6) == LOW){
strom = stromAnpassung(rampSpeed);
analogWrite(3,strom);
analogWrite(11,strom);
myStepper.setSpeed(rampSpeed);
myStepper.step(-1);
if (rampSpeed < speed){
rampSpeed++;
}
}// end bu6
// Button on pin 7 = rückwärts drehen
while(digitalRead(7) == LOW){
strom = stromAnpassung(rampSpeed);
analogWrite(3,strom);
analogWrite(11,strom);
myStepper.setSpeed(rampSpeed);
myStepper.step(1);
if (rampSpeed < speed){
rampSpeed++;
}
}// end bu7
// speed zurück setzen
myStepper.setSpeed(speed);
} // end handbetrieb
int stromAnpassung(int upm){
int strom;
strom = upm * 0.637 + 160;
if (strom > 255) strom = 255;
return strom;
}
Dank im Voraus
Toni