Hallo liebe Forumsgemeinde,
ich habe einen Optischen Encoder mit 64 PPR.
Dieser wird mit (max.) 15 U/Sekunde angetrieben. Minimal sind es 13 U/Sekunde.
Es handelt sich um diesen Encoder , kann bis 50 U/Sec.
Einlesen will ich den mit einen Nano (clone) 16MHz an den Digitalports 4/5 (möchte ich zumindest gerne).
Bevor der Encoder bewegt wird, bekommt der Arduino ein Signal über nen anderen Digital-Pin, somit kann er in ein Unterprogramm springen, indem er sich ausschlisslich mit dem Encoder und einem weiteren Eingang befasst.
Meine Frage lautet nun: Ist ein Arduino mit 16MHz schnell genug, um (in einer eigenen loop im Unterprogramm)
- dieDrehrichtung des Endcoders auszuwerten,
- Impulse des Encoders zu zählen,
- die Anzahl Pulse mit einem vorgegebenen Wert zu vergleichen, und
- einen DigitalEingang bei jedem loopdurchgang auf 'Low' abzufragen?
Ich möchte es deshalb ohne Interrupt machen, da ich die Interrupt-Eingänge für die Sicherheits-Elemente benötige.
Einen Sketch kann ich leider noch nicht zeigen, da ich den noch nicht geschrieben habe. ich bin noch die Hardware am fertigstellen, (das meiste funktioniert, aber jetzt muss ich festlegen, auf welche Pins ich den Encoder am Nano lege.
LG Stefan
Das geht sehr gut mit Polling in einem Timer Interrupt. Damit kann man regelmäßig alle 1-2ms auslesen. Hat gegenüber den externen Interrupts auch den Vorteil, dass man mehrere Encoder auf einmal abfragen kann.
Ansonsten ist auch loop() schnell genug wenn du richtig programmierst.
Du kannst übrigens auf dem UNO auf allen Pins Interrupts auslösen. Die anderen Pins haben lediglich keinen eigenen Interrupt-Vektor sondern teilen 8 Pins teilen sich jeweils einen. Nennt sich Pin Change Interrupt.
Hallo Serenifly,
danke für die schnelle Antwort.
Also, wenn es der UNO kann, dann sollte das mein NANO ja auch können, da der ja auch den 328er Processor hat. Kannst Du mir noch kurz den Begriff polling erklären? (Wahrscheinlich nutze ich das ja längst, nur kenn ich den Begriff nicht?)
In dieser Anwendung hat der NANO während dem Auswerten des Encoders und des zusätzlichen Einganges
keine weiteren Aufgaben zu erledigen es sei denn, eines der Sicherheits-Elemente, die ich an Digital-Input 1 und 2 anschliesse, spricht an. Und diese lösen dann einen Interrupt aus.
LG Stefan
Danke Serenifly,
wie vermutet, ich nutze tatsächlich polling, nur wusste ich nicht, dass man dies polling nennt.
Hast mir wirklich sehr weiter geholfen, dank Deiner Hilfe kann ich nun die Hardware fertigstellen. Und während ich auf die Printplatte warte, kann ich mich mit dem Sketch vergnügen.
LG Stefan.
In dem Artikel steht übrigens dass Interrupts eine bessere Lösung sind. Das kommt auf die Anwendung an. Der Artikel ist zum Teil auf PCs zugeschnitte, was etwas ganz anderes ist. Auf solchen kleinen Prozessoren können Interrupts auch schnell das System blockieren wenn zu viele vorkommen.
Mit einem Encoder der nur langsam dreht wird es keine Rolle spielen. Vor allem wenn sonst nicht viel zu tun ist. Aber mehrere schnelle Encoder per Interrupts zu lesen ist etwas irrsinnig. Man kann in nur einem Takt 8 Pins auf einmal einlesen. Also 4 Encoder gleichzeitig. Das ist externen Interrupts weit überlegen.
Ja, das leuchtet mir ein. Und ich hab ja hier nur einen Encoder, der zwar etwas flotter dreht, aber dafür ne recht geringe Auflösung besitzt. Zudem hab ich ja ein Startsignal, das mir sagt, wann der Encoder betätigt wird, sodass ich ins entsprechende Unterprogramm verzweigen kann. Und während dem Auslesen, muss ja nur noch ein weiterer Eingang abgefragt werden. Ich denke, Interrupts wären in meiner Situation für den Encoder eh fehl am Platz.
Dazu kommt, dass, wenn eines der Sicherheits-Elemente nen Interrupt auslöst, der Antrieb, der auch den Encoder antreibt, sofort gestoppt wird, also ist dann auch kein weiteres Auslesen des Encoders mehr nötig.
Das ganze ist im Prinzip ein Linear-Servo mit 780mm Weg, die in ca. 0.76 Sec bewältigt werden. Der Encoder misst die zurückgelegte Wegstrecke um den Servomotor präzise steuern zu können.
LG Stefan
Zudem hab ich ja ein Startsignal, das mir sagt, wann der Encoder betätigt wird, sodass ich ins entsprechende Unterprogramm verzweigen kann. Und während dem Auslesen, muss ja nur noch ein weiterer Eingang abgefragt werden. Ich denke, Interrupts wären in meiner Situation für den Encoder eh fehl am Platz.
Du kannst auch dieses Signal per Interrupt auswerten. Aber von der Software her ist das praktisch genau das gleiche wie die zwei Encoder-Pins direkt als Interruptquelle zu verwenden. Man spart sich lediglich Interrupt-fähige Pins.
Wie gesagt, wenn man sicherstellen will dass der Encoder regelmäßig abgefragt wird kann man das in einem Timer Interrupt erledigen. Dann geschieht es auch wenn loop() etwas länger bräuchte
Ja richtig. hier ist es so, dass der Arduino normalerweise nichts weiter tut als die Signale von zwei Controlpannels über i2c mitzuhören, und auf ein par sporadisch auftretende Ergeignisse zu reagieren. und wenn der besagte Starbefehl kommt, wird der an die Motorsteuerung weitergereicht und eben die Encoder-Abfrage gestartet.
LG Stefan