ich mache momentan ein kleines Projekt mit einem Arduino Mega.
Meine Hardware:
Arduino Mega, Schrittmotor (3,6°), Polulu Treiber drv8825, 1k Potentiometer, 20x4 Display
Ich möchte die Geschwindigkeit des Motors mit dem Poti regeln und die Geschwindigkeit(bzw Drehzahl in rpm) am Display anzeigen.
Bis jetzt kann ich die Geschwindigkeit des Motors mit dem Poti regeln. Ich zögere gerade, wie ich die Drehzahl bestimmen kann.
Hier mein Code:
// Defines pins numbers
const int stepPin = 7;
int customDelay,customDelayMapped; // Defines variables
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
}
void loop() {
customDelayMapped = speedUp(); // Gets custom delay values from the custom speedUp function
// Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
digitalWrite(stepPin, HIGH);
delayMicroseconds(customDelayMapped);
digitalWrite(stepPin, LOW);
delayMicroseconds(customDelayMapped);
}
// Function for reading the Potentiometer
int speedUp() {
int customDelay = analogRead(A0); // Reads the potentiometer
int newCustom = map(customDelay, 0, 1023, 0,1000); // Converts the read values of the potentiometer from 0 to 1023 into desireded delay values (300 to 4000)
return newCustom;
}
zum Code:
ich brauche den Dir Pin nicht, da ich möchte, dass der Motor sich nur in eine Richtung dreht (egal welche). Das Teil mit dem Display habe ich gelassen. Das ist kein Problem.
Hier mein Problem:
Überlegung für die Bestimmung der Drehzahl:
In der loop() setzte ich den Step Pin ein mal High und einmal LOW. Das macht eine Umdrehung (oder?). Ich mir überlegt, dass ich die Umdrehungen des Motors zähle, damit ich die Drehzahl habe (ist das richtig?). Das heißt, ich zähle eins weiter nach dem Befehl, der der Step Pin auf low setzt. Am Ende multipliziere ich diese Anzahl der Umdrehungen mit 2*dely-Zeit (aus meinem Code "customDelayMapped"), um dann die Drehzahl zu berechnen . ISt meine Überlegung überhaupt richtig?
Kann mir jemand bitte helfen?
Ideal für mich wären einige Zeilen Code, damit ich meins ergänzen kann.
Der Motor macht pro STEP genau einen Schritt, nicht eine Umdrehung!
Ob Voll/Halb/Viertel/x-tel-Schritt, hängt vom Treiber ab, Näheres im Datenblatt des DRV8825.
Wenn Dir bekannt ist, wie viele Grad pro Step, ist Dir auch bekannt, nach wie vielen Steps 360°, oder eine volle Umdrehung durch ist.
Da Du die Zeit zwischen den Steps vorgibst, ist der Rest nur etwas Mathe.
MfG
PS: Überlege Dir einen Ersatz für die delay() - wenn Du etwas mehr machen willst, als nur den Motor beim Drehen zuzuschauen, wirst Du So nicht glücklich.
Stichworte: millis() Nachtwächtererklärung Blink_without_delay(Beispielprogramm in der IDE)
3,6° pro Step ist ein sehr unüblicher Wert für einen Schrittmotor Üblich sind 1,8° (oder 200 Schritte pro Umdrehung) oder 36°, das wären 20 Schritte Pro Umdrehung. Ich nehme mal an es sind wirklich 3,6° pro schritt oder 100 Schritte pro Umdrehung
Der DRV8825 ist ein Microsteptreiber. Der unterteilt enen Step (bei Deinem Motor 3,6°) in verschiedenen Microstepp. Je nach Einstellung der Pins Mode0, Mode1 und Mode2 wird ein Schrittt in 1, 2 4, 8, 16 oder 32 Teilschritte eingeteilt.
Ein H/L Ändeung am Step Input bewirkt ein weiterdrehen um einen Teilschritt. Je nach MODE Einstellung sind das 1/100 bis 1/3200stel Umdrehung. Dementsprechend sind das 100 bis 3200 Schritte (Impulse) pro Umdrehung.
Das Direktion Input mußt Du beschalten sonst funktioniert das nicht. Es genügt auf Masse zu schalten, so dreht der Motor in eine Richtung.
Drehgeschwindigkeit.
Wenn Du 100 Schritte pro Umdrehung eingestellt hast und 100 Impulse pro Sekunde gibst, dann macht der Motor 1 Umdrehung pro Sekunde oder umgerechnet 60 RPM (Revolution Per Minutes).
Die Periodenzeit ist 1/100. Das sind 10mS zwischen 2 H/L Flanken, oder (wenn symetrisch sein soll) 5mS HIGH und 5mS LOW.
Jetzt weiß ich nicht welchen Drehzahlbereich Du haben willst. Die Messung des Analogen Eingangs gibt Werte von 0 bis 1023. Diese mußt Du in die gewollte Drehzahl umrechen (zB mit map()) map() - Arduino Reference und von diesen errechnest Du dann die Zeiten für die Rechteckschwingung am Step Eingang.
@Uwe: wenn ich gut verstanden habe:
Ich habe 100 Schritte pro Umdrehung eingestellt. ein Flanke bzw. 1 Step dauert x microsec (x ist der Potiwert).
Das heißt, für eine Umdrehung brauche ich 100x microsec. Der Motor macht dann 100 Impulse(1U.) pro 100x microsec.
-> 1U. in 100x.10e6 s.
-> 1U. in 100x.10e6/60 min= 1,6x.10e6 min = 1/ (1,6x.10e6) rpm = 0,625.10e-6/x rpm?
Das ist dann die Motordrehzal in rpm in abhängigkeit vom wert des Potis. (richtig?)
(Entschuldigung, ich habe so viel daran gedacht, dass ich schon ein bißchen verwirrt bin)
Die Zeit ist nicht die Dauer des Imulses sondern die Periode der Rechteckschwingung Zeit zwischen 2 fallenden Flanken).
1U in 1/(100 * Periodendauer * 10e-6) ... Periodendauer in µs
Und eine letzte Frage. Wenn ich eine Drehzahl von 5rpm habe, heißt es wirklich, dass der Motor 5 Umdrehungen in einer Minute macht?
blöde frage, ich weiß. aber ich habe versucht, was einzustellen und selber gezählt um zu wissen ob die Rechnung stimmt.
Wenn Du in einer Minute so viele Steps ausgibst, wie für 5 Umdrehungen gebraucht werden: Ja
Wie viele Steps Dein Stepper pro Umdrehung braucht, bzw. wie viele der DRV dafür braucht (durch das Microsteping), solltest Du besser sehen/erfassen können, als wir hier.
Mit millis() kannst Du sehr schön die Zeit abwarten, bis der nächste Step 'fällig' ist.
Macht Dein Stepper denn gewollt ganze Umdrehungen, wenn DU Ihm Das so sagst?
Also 10x eine ganze Umdrehung mit je einer Sekunde Pause dazwischen - klappt so was?
Erst, wenn Du weißt, wie viele Steps und welche Zeit Du brauchst, kannst Du auch auf Deine rpm runter rechnen.
Leider ist mein Programm nicht richtig.
Wenn ich sage, dass die Drehzahl desMotors sich so berechnen lässt(siehe unten), kriege ich einen sehr großen Wert im Vergleich zu was genau passiert.
f = ( 0.01e6 /customDelayMapped ) * 60 rpm, wo "customDelayMapped" die Zeit zw. 2 Schritten darstellt.
ich weiß nicht mehr, wie ich das rechnen und programmieren soll.