Wenn ich Interrupts plane, dann halte ich die ISR so kurz wie möglich und ich habe auch noch nie nested interrupts benutzt, nicht wissentlich (ja, mal als Pannenfall *gggg*). Da ist schon etwas Gehirnschmalz und auch gelegentlich Experiment angesagt. Ob so eine lange ISR wie Deine sinnvoll ist, wage ich fast zu bezweifeln.Zitat von olby2
Für einen PID ist diese Frequenz sicher nicht allzu schnell - aber da Du schreibst, dass Du noch etliche andere hast, werden das bestimmt nie 13,33 ms, ich vermute, dass das in der Zielumgebung deutlich langsamer und ungleichförmiger wird. Dann stimmt eben auch die ganze Regelung nicht, weil anzunehmen ist (ich gehe bei meinen Planungen jedenfalls für mich immer davon aus), dass die verschiedenen ISR sich gegenseitig stören könnten. Und der digitale Regler hat sowieso ein Zeitglied, weil die Regelung zumindest bei den hier üblicherweise verwendeten Controllern mit einer "alten" Geschwindigkeitserfassung arbeiten muss. Wenn dann das jeweilige Alter schwankt und die Regelfrequenz noch dazu - - oh heiliger Regulus.Zitat von olby2
Ich habe einen PI-Regler in einer ISR implementiert. Problem: Rechenzeit mit floating point *ggrrrrr* war zwei bis drei Millisekunden . Also habe ich das Ganze in Integer gemacht, ein bisschen popeln, ein bisschen tricksen, ein bisschen mal grob schätzen und die gemessenen Reglerkonstanten hinschummeln, viel testen und - läuft prächtig ! ! weniger als 50 µS bei 20 MHz ... und das regelt zwei ziemlich unterschiedliche Motoren sehr sauber auf Gleichlauf bei gleichen Sollwerten. Regelfrequenz für jeden einzelnen Motor rund 100 Hz, die Motoren werden bei versetzten ISR-Aufrufen bedient, um die ISR nicht zu lange dauern zu lassen.
Wenn Du das mit den nested interrupts realisierst, dann berichte aber bitte über Deine Erfahrungen. Ich lerne gerne dazu.
Viel Erfolg
Lesezeichen