Hallo Freunde Arduino, wenn zum Beispiel gleichzeitig Sensoren , Entcoder ablesen will von Aurduino Atmega 2560 ist besser mit micros() in der Loop Schleife zu
Arbeiten , oder interrupts(). Die Frage habe ich zum Teil vor einige Zeit gestellt
danke.
Ja!
Deine Frage lässt sich nicht allgemein beantworten. In vielen Fällen dürfte die Verwendung von Interrupts einfacher sein, setzt allerdings voraus, dass im Programm auf die Eigenheiten von Interrupts Rücksicht genommen wird.
Mit micros() solltest Du nur selten arbeiten, meist ist millis() besser geeignet.
Wenn Du für Deine Projekt eine Antwort möchtest, poste so viele Details wie möglich, vor allem den bestehenden Code, wenn Du schon welchen hast.
Danke für die schnelle Antwort , nehmen wir mal vor dieses Szenarios ich
würde die Lybrary Basic StepperDriver benutzen um ein Stepmotor
zu Steuern , und den Stepp Motor über stepper.rotate(360) eine volle Umdrehung
in eine gewiesener Zeit RPM erfülle ,während dessen würde ich über eine entcoder
auch die Position erfassen,also mehrere Informationen gleichzeitig.
Wie funktioniert es mit interrupts() macht er das eine fertg und dan das andere,
oder schnell von ein interrupts() zum anderen interrupts(), ich weiss nicht ob ich misch richtig ausgedrugt habe danke,
Hallo
Vergess die Standard Stepper lib die blockiert. Nutze die mobatools oder eine andere lib um den Stepper zu betreiben. Die erzeugen die Signale für den Motor im Hintergrund und blokeiren nicht den Ablauf
Heinz
Es gibt hier eine Erläuterung zum Thema Interrupts bei Arduino Controllern:
https://www.mikrocontroller.net/articles/Verwendung_von_Interrupts_mit_Arduino
Aber Achtung:
Der erfolgreiche Einsatz von Interrupts erfordert die Einhaltung einiger Regeln und ist in den meisten Anwendungsfällen nicht erforderlich. Auch wenn die Eigenschaften von Interrupts zunächst brillant erscheinen, sind i.d.R. Funktionen, die in der loop() laufen ausreichend und - gerade für Anfänger - besser beherrschbar.
Interrupts erfüllen überall dort ihren Zweck, wo sehr schnell auf externe Trigger (z.B. ein über die serielle Schnittstelle eingegangenes Zeichen in einem Puffer zwischenzuspeichern, bevor das nächste eintrifft) reagiert werden muss, ohne dass man im weiteren Programmablauf darauf achten muss, die Schnittstelle regelmäßig und ausreichend schnell abzufragen.
Um den Controller nicht unnötig lange zu blockieren, weil dieser ggf. noch weitere Interrupts und zeitkritische Aufgaben in der loop() bedienen muss, sollen Interruptroutinen so kurz wie nur möglich sein. Dauern sie zu lange, könnten wichtige andere Aufgaben leiden, oder aber die Routine so häufig aufgerufen werden, dass alle übrigen Aufgaben quasi "einfrieren"...
Gut ausgelegte Sketche erscheinen für den menschlichen Betrachter wie "multi-tasking", auch wenn die einzelnen Funktionen sequentiell abgearbeitet werden.
Wichtig dafür ist das, was @Rentner bereits angesprochen hat: Der Verzicht auf blockierende Funktionen...
Vielen dank für die hilfreiche und ausführlichen,Information an alle .
Hallo Freunde Arduino ich versuche gerade ein Schrittmotor Nema 17 mit Driver s4988 über die Libraries MobaTools im laufen zu bringen
aber ohne Erfolg ich weiß nicht was ich falsch mache . ![]()
#include <MobaTools.h>
const byte enaPinE0 = 24;
const byte stepPinE0 = 26;
const byte dirPinE0 = 28;
MoToStepper Step1(HALFSTEP );
void setup() {
Step1.attach( stepPinE0, dirPinE0 );
Step1.attachEnable( enaPinE0, 1, HIGH );
Step1.setSpeed( 120 );
Step1.rotate( 1 );
Step1.setZero();
Step1.write(360);
Step1.setRampLen( HALFSTEP ); // = 1/4 Umdrehung
}
void loop() {
}
Driver A4988
Kommntar
// = 1/4 Umdrehung ist nicht richtig
Problem gelöst , ich war zu eilig ,habe mir die PDF Datei zu MobaTolls richtig nachgelesen
danke.
Prima, dass Du es auch alleine geschafft hast!
Das Lesen und Nachvollziehen (Verstehen) der Beispiele ist eine wichtige Grundlage dafür, Anpassungen korrekt umsetzen zu können.
Bei neuen Themen "kämpfe" ich mich in der Regel von den einfacheren zu den komplexeren Beispielen durch und gewinne dabei Erfahrung (auch mit Rückschlägen, aber Erkenntnisgewinn und Erfahrung gewinnt man eben kaum, wenn keine Fehler auftreten
).
Was ebenfalls sehr hilfreich ist, ist das Aufrufen und Lesen der Quellen im Internet, zumeist auf Github. Für die MobaTools hier https://github.com/MicroBahner/MobaTools
Weiterhin viel Spaß und Erfolg mit C++ und Arduino !!
Danke ec2021 , ich versuche schon seit 3 Stunden ohne erfolg ein Inkrementale Drehgebe 2400 von Firma Kübler in betrieb zu nehmen . Diese Encoder habe ich nach folgendes -schema angeschlossen 0V habe ich am
GND Arduino angeschlossen , A+ (KanalA) pin 11 Arduino,B+ (KanalB) pin 6 Arduino, 0+ PLUS Arduino. Das Problem ist die variable mein Fall --encoderPos--wird inkrementiert den ersten
Umdrehungen liegt er bei 360 grad in richtige Pos dann verschiebt sich die pos von den Encoder .
Vielleicht ist diese Encoder nicht dafür gedacht ? danke
int encoderPinA =11 ;
int encoderPinB = 6;
int encoderPos =0 ;
int encoderPinALast = LOW;
int encoderPinANow = LOW;
void setup() {
Serial.begin(9600);
}
void loop() {
encoderPinANow = digitalRead(encoderPinA);
if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
if (digitalRead(encoderPinB) == HIGH) {
encoderPos--;
} else {
encoderPos++;
}
Serial.println(encoderPos);
}
encoderPinALast = encoderPinANow;
if ( (encoderPos==360 )) {
encoderPos = 0;
// stepper1.rotate(1);
// stepper1.write(100);
Serial.print("Encoder hat 360 grad pos erreicht ");
}
}
Hallo,
das hängt jetzt erst Mal davon ab wie schnell du den Encoder drehst. Der hat ja vermutlich 2400 imp/Umdrehung. Das ist ja reichlich. Das wird nur mit einer Interrupt Verarbeitung vernünftig klappen.
Zudem machen dir die serielle Ausgabe auf den Monitor sicher Probleme da das zu lange dauert und dabei gehen Dir Impulse verloren die du nicht mitbekommst.
Such dir Mal ein Beispiel mit Interrupt Verarbeitung und teste es damit.
Es gibt auch eine / mehrere Libs die Encoder einlesen können.
Mal abgesehen davon , warum willst du einen Stepper mit einem Encoder betreiben.
Heinz
Nachtrag
Nutze 115200 als boudrate
Hi @Salvo1969,
leider habe ich keine Erfahrung mit Drehgebern der Firma Kübler....
Ist das hier das Gerät?
https://www.kuebler.com/de/produkte/messung/drehgeber/product-finder/produkt-details/2400
Das sollte grundsätzlich funktionieren ( soweit ich das auf die Schnelle sehen konnte).
Allerdings sollte es demnach 1024 Pulse pro Umdrehung liefern ... Kannst Du das überprüfen?
Nach Datenblatt soll es einen Anschluss +V geben, der an die +5V angeschlossen werden sollte ( Du schreibst oben 0+, ist vielleicht nur ein Tippfehler... ).
Hallo
Habe gerade im Datenblatt gesehen den gibt es auch mit 360imp/Umdr
Dann wäre das erst Mal richtig mit der Abfrage auf 360
Bei 500 U/min macht das 3000 Hz das ist eigendlich für eine Interrupt Abfrage noch kein Thema, allerdings serielle Ausgaben die da häufig dazwischen funken solltest du vermeiden
Heinz
Danke war ein tip Fehler von mir, ich will den Encoder benutzen weil ich Informationen brauche
eine volle Umdrehung 360 Grad von ein andere Quelle der leider kein Stepmotor hat.
Diesen Info Steuern einen Stepmotor der in eine Bestimmte position sich mitbewegen soll.
Wenn ich mit Interup es mache werde ich keine Probleme mit der library Mootools haben,
oder bezüglich gibt es bestimmten library für den Encoder Danke.
Es gibt hier eine Library, die Du testen kannst
https://github.com/mathertel/RotaryEncoder
Dort sind auch verschiedene Beispiele ohne Interrupt und eines mit Interruptnutzung.
Jetzt Mal die Frage wie schnell dreht sich der Encoder denn eigendlich
