Interrupt: Kein Delay , Keine Servobibliothek ?

Hallo, ich bin gerade dabei eine Windenergieanlage zu entwickeln! Ich bin gerade dabei ein autarkes Pitchsystem zu entwickeln ( Blätter rein und raus fahren 0° - 90° ). Ich werde das Pitchen mit Servos realisieren! Ich möchte nun eine Schnellabschaltung realisieren, eine Art Überdrehschalter bei zu hoher Drehzahl!
Dieser Schalter soll durch einen Interrupt abgefragt werden.
Nun sagt aber jeder in Youtube man soll keine Delays in die ISR Ausführung programmieren! Lange Rede ,kurzer Sinn!
Meine Frage ist: Ist das nur unüblich delays in ISR zu programmieren oder funktioniert das rein softwaretechnisch nicht also generell nicht? Auch wird behauptet man kann die Servo.h Bibliothek nicht im ISR verwenden!
Bei meinem Projekt ist es so das der Interrupt durch einen mechanischen Rastschalter aktiviert wird also der Interrupt quasi so lange aktiv ist bis ich den mechanischen Schalter von Hand zurück setze und das System freischalten und resetten muss also ist für mich in diesen Fall egal wie lange der ISR dauert! Ich will die Servomotoren in dem ISR zurück auf 0° fahren und das braucht eine gewisse Zeit (Delay5000)!

Natürlich kann man delays in ISR verwenden.
Ein paar Klimmzüge bedarf es, damit das funktioniert.
Ein paar Fallstricke und Untiefen gilt es zu überwinden.
Erhöhte Aufmerksamkeit, und Sorgfalt auf Gebieten, auf denen du wahrscheinlich noch nicht tätig warst.
(denn sonst würdest du die Frage nicht so stellen)

Ob delay in ISR Sinn machen?
Eher nicht. Schon gar nicht ein 5s Delay

Das zu dem einen.

Und jetzt zu dem anderen:

Dieser Schalter soll durch einen Interrupt abgefragt werden.

Warum?

Ich vermute eher, dass ein endlicher Automat (oder mehrere derer) die Lösung für alle deine Ablaufsteuerungsprobleme ist.

Ich glaube auch daß Du keinen Interrupt brauchst sondern den Sketch so schreiben, kannst daß auf ein Ansprechen des mechanischen Überdreh-Rastschalter innerhalb einiger 10 Milisekunden reagieren kannst.
Dies genügt für ein so Träges mechanisches System wie ein Windgenerator.

Zu bedenken ist ob man den Generator nicht zusätzlich elektrisch bremsen sollte durch Kurzschließen über einen kleinen Widerstandes solange er mit einer bestimmten Drehzahl dreht und unterhalb ganz kurzschließen.

Grüße Uwe

Combie's Antworten sind mit großer Vorsicht und Respekt zu genießen.
Nur für den Fall, dass du dich fragst, wie das nun genau geht mit dem delay in einer ISR:

combie:
Ob delay in ISR Sinn machen?
Eher ... schon gar nicht.

Meine Erfahrung hier sagt mir:
Wer Interrupts verwenden will und hier fragt, hat in der Regel den Sinn von Interrupts noch nicht verstanden.
Und wenn wer innerhalb einer ISR delay() verwenden will, kann man die Einschränkung "in der Regel" streichen.

dirkwilhelms:
... der Interrupt quasi so lange aktiv ist bis ich den mechanischen Schalter von Hand zurück setze und das System freischalten und resetten muss also ist für mich in diesen Fall egal wie lange der ISR dauert! Ich will die Servomotoren in dem ISR zurück auf 0° fahren und das braucht eine gewisse Zeit (Delay5000)!

Wenn du da das Wort Interrupt und ISR entfernst, und statt dessen meinst, "nichts anderes machen außer ..." kann was draus werden.

"resetten" wäre dann der nächste Begriff, der nur Verwirrung stiftet, und den du vermutlich besser weglässt :slight_smile: Wenn dein Windrad endlich in dem Zustand ist, dass das Ganze "resettet" werden kann, kannst du vermutlich genausogut auf einen Reset verzichten und gleich mit dem Normalbetrieb weiter machen.

Hallo,
delay sollrest Du generell vermeiden da bei einem delay der Controller fast nicht mehr anderes macht als zu warten bist das delay abgelaufen ist. Leider ist es so das in vielen Beispielen delay() verwendet wird, aber man löst sowas mit millis(). Dazu gibt es Beispiele in der IDE "blink without delay" und hier im Forum die Nachtwächter Beschreibung zum Verständniss.

Ziel ist es eigendlich, das loop immer so schnell wie möglich abgearbeitet wird und wieder oben anfängt. Wenn Jetzt Dein Windrad zu schnell dreht fragst Du das z.B mit einem If Konstrukt ab und verzweigst in die Funktion um den Servo auf die Position "Null" zu fahren. Da baust Du natürlich auch kein delay() ein und auch keine Schleifen die lange Laufzeiten haben. Somit kommst du also schnell in den loop zurück. Wenn dann weitere 5000ms (abfrage mit millis()) vergangen sind hast Du das erreicht was du vorhattest.

So dauert Dein loop , selbst wenn Du noch irgendwas auf ein Display schreibst, weit weniger als 100ms und das wäre schon ewig lang. Ein Interupt ist da also völlig fehl am Platz.

combie hat Dir geraten das mit einem endlichen Automaten "Schrittkette" zu machen. Also suche danach und du wirst ein Programgerüst dazu finden. Wenn Du das verstanden hast ist es ziemlich einfach Deine Bedingungen da einzubauen. Du zerlegst Deine Aufgabe einfach in mehrere Schritte die dann logisch oder zeitlich abhängig aufeinander folgen.

Heinz

Hi

Und - wurde noch nicht gesagt - ein Interrupt soll das aktuelle Programm unterbrechen um möglichst direkt auf ein Ereignis zu reagieren.
Beim Fußball wäre Das der Linienrichter - wenn Der 'einen Interrupt abfeuert', hebt Er eigentlich nur das Ärmchen und zeigt Flagge.
Genau Das macht ein Interrupt normal - ein Flag setzen, auf Das im Hauptprogramm reagiert wird.

Dein Hauptprogramm kümmert sich darum, daß der Pitch immer so steht, daß die Drehzahl des Windrad passt (denke ich mir).
Wenn trotzdem die Obergrenze überschritten wird (denke, hier greift Dein mechanischer Rastschalter), muß das Servo den Winkel auf Null (also Neutral) stellen.

Mein Weg wäre:

  • kein Interrupt :slight_smile:
  • in der loop() den Rastschalter abfragen
  • wenn der Rastschalter NICHT ausgelöst hat
    -> - den Pitch per PID regeln lassen
    SONST Servo auf NULL und mittels eines etwas fetterem Schütz den Generator aktiv bremsen.

So richtig viel State-Maschine ist Da gar nicht drin, irgendwie!

Sobald Du den Rastschalter wieder 'ausgerastet' hast, beginnt der PID wieder von Selber Sein Spiel und probiert, aus dem Rotor die gewünschte Geschwindigkeit raus zu bekommen.

... wobei 'WindenergieANLAGE' nun schon etwas größer klingt - Deine Schutzvorkehrungen lassen auch in die Richtung blicken - müsste man klären, ob der Motor eine Kurzschlussbremsung 'mag' - nicht, daß Du zwar das mechanische Zerlegen verhindert hast, nun aber mechanisch die Wicklung tauschen musst - wäre ja dann doch blöd.
Dagegen würde Es Bremswiderstände geben - so wurden auch große Bearbeitungsmaschinen ( mehrere kW Spindelmotor mit ebenfalls etwas Gewicht) gnadenlos runtergebremst - die Dinger werden dabei grmpfl heiß!
Heute wird die Energie wieder zurück ins Netz geschoben - rechnet sich wohl besser ...

MfG