Hallo! Frage: Teil eines Programmablaufs ist das Ansteuern eines Linearantriebes mittels zweier Ports (Ein-/Ausfahren) und der Rückmeldung durch den Spannungswert eines Potis vom Linearantrieb zum ADC eines AVR. Das Ein-und Ausfahren auf den Sollwert kann einige Sekunden in Anspruch nehmen, natürlich soll der Programmablauf so lange nicht still stehen. Andererseits sollen eventuell auftretende Verzoegerungen in anderen Programmteilen nicht zu einem Überschwingen durch zu langes Warten auf die nächste Rückmeldungs-Messung führen. Wie ist da eine vernünftige Herangehensweise?
Stephan R. schrieb: > Wie ist da eine vernünftige Herangehensweise? Wie immer: Ein Timer erzeugt mit einer ISR einen 'Basistakt' in Form von regelmässigen ISR Aufrufen. Und in der ISR passiert dann das was a) kurz genug für eine ISR ist b) regelmässig gemacht werden muss, wie zb die Überwachung von Endschaltern oder auch eine Überwachung der Endposition oder ein Zyklus durch den PID Regler. Es ist eigentlich immer das gleiche: In einem realen Programm kommt man um einen Timer und seine regelmässigen ISR Aufrufe nicht herum. Sie sind der Schlüssel zu einem Programm welches scheinbar mehrere Dinge gleichzeitig bzw. irgendwelche Aktionen im Hintergrund erledigt.
Klingt sinnvoll. Ich stelle mir nur die bloede Situation vor, dass die "Rückmeldngs-ISR" zwar dreimal in der Sekunde feststellt, dass ein Wert längst am Anschlag ist, dann aber zurück ins Hauptprogramm springt, wo vielleicht grad eine ungünstige Schleife verhindert, dass die Stelle, an der der zugehoerige Aktor abgeschaltet wird, erst viel später erreicht wird. Vielleicht denk ich nur zu kompliziert, ich probiers erstmal... Danke!
Stephan R. schrieb: > Klingt sinnvoll. > Ich stelle mir nur die bloede Situation vor, dass die "Rückmeldngs-ISR" > zwar dreimal in der Sekunde feststellt, dass ein Wert längst am Anschlag > ist, dann aber zurück ins Hauptprogramm springt, wo vielleicht grad eine > ungünstige Schleife verhindert, dass die Stelle, an der der zugehoerige > Aktor abgeschaltet wird, Und wer oder was hindert dich daran, dass die ISR welche die Überschreitung feststellt, gleich selber den Aktor abschaltet? richtig: niemand Als Faustregel: In einer ISR hat nichts verloren LCD Ausgabe UART AUsgabe komplexere Berechnungen zb mit sin/cos oder sonstigen Floating Point Schnickschnack. Aber ein paar If mit einem Portzugriff, sind nicht wirklich ein Thema, das dir ín einer ISR Kopfzerbrechen machen müsste. Die Daumenregel "ISR so kurz wie möglich" bedeutet nicht, dass man gar nichts machen darf ausser einem Job-Flag setzen.
Hi Mal eine kurze Frage zur Laufzeit deines Programmes: Wie hoch taktest du deinen Controller ? Gut, ich schreibe meine Programme in Assembler, da ist es schon möglich, die Zykluszeit zu berechnen. Für eine Steuerung "Fahren bis Endschalter" oder "Fahren auf Sollwert" dürfte die Zykluszeit deines Programmes bei 8MHz ungefähr 1 mSek. (ca. 4000 Befehle) dauern. Das ist schon mächtig viel Code... ich glaub da eher an 25% von diesem Wert wird im Zykus durchgeackert.... Daher denk ich, dürftest du kein Timing-Problem haben. Ansonsten bleibt noch höherer Takt, Aufteilung von Prozessen usw. Gruß oldmax
Stephan R. schrieb: > zu einem Überschwingen durch zu langes Warten Ein Überschwingen könnte durch einen Regler (PI oder PID) verhindert werden. Die Ist Grösse ist in diesem Fall das Poti und die Sollgrösse der Wert des Potis bei Ende bzw. Anfang des Weges. Da es sich um einen AVR handelt, könnte dir die AppNote AVR221 helfen, ein einfacher, gut anpassbarer PID Regler in C.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.