Zitat Zitat von Willa Beitrag anzeigen
Hi,
danke für eure zahlreichen Beiträge & Vorschläge! Da werde ich mich gleich mal durcharbeiten. Bei meiner Regelung ist das Hauptziel nicht die Synchronität, sondern der minimale Zeitversatz zwischen Sensoren auslesen / Rechnen / PWM ausgeben.
Der minimale Zeitversatz ist erreicht, wenn die Berechnung synchron zur PWM ist. Ich spring jetzt mal

Dann wäre es cool, wenn der Zeitpunkt zu dem die Berechnungen gestartet werden sich automatisch optimal einstellt.
Der Zeitpunkt ist unerheblich, der Wert nachdem sich der Motor richtet, kann nur alle 2ms geändert werden. Feiner löst dein System nicht auf. Und wann du die Berechnung startest ist auch egal, sie muß nur zum nächsten 2ms Takt fertig sein.

Mir wurde immer gepredigt, dass man so wenig Code wie möglich im IRQ laufen lassen soll... Es gibt ja auch noch einen zweiten Interrupt vom RC Empfänger der sehr präzise sein muss. Für mich klingt es am einfachsten in der Main Loop den Wert von TcD0_cnt abzufragen und die Berechnungen zu starten sobald dieser größer als 33535 ist.
Mit Predigten ist das so eine Sache. Da wird versucht, einen komplexen Sachverhalt in einen möglichst kurzen Satz zu quetschen. Ich würd das mal so sagen: man sollte nicht mehr Code als nötig im Interrupthandler laufen lassen. Ich kenne Systeme und hab auch schon welche gebaut, die nur im Interrupthandler laufen. Auch das passt zu "nicht mehr als nötig", mehr war eben nicht nötig. Solche Systeme sind leichter deterministisch hinzubekommen und bewegen sich in Richtung Echtzeitsystem. Und ein Regler (z.B. Drehzahl, Geschwindigkeit, Lage etc) ist ein Echtzeitsystem.

Hmmm... Also ich habe das so mal eingebaut, und Schwuuupps, mein Code läuft mit genau 500 Hz. Ich habe kein Oszi hier, deswegen kann ich nicht gucken ob der Code wirklich das tut was er soll (außerdem weiß ich auch nicht wie lange meine Berechnungen denn wirklich brauchen). Aber ich denke mal rein theoretisch sollte das doch gehen... Ist dieser Ansatz programmiertechnisch sehr schlimm, oder kann ich das so machen?
Wenn es um Predigten geht, kann etwas "schlimm" sein. In der Technik gibt es nur unklug oder ungeschickt. Wenn man weiß, was man tut, kann man alles machen.

Dein Regler, deine Mainloop lief bisher mit 900Hz, wenn ich das recht in Erinnerung habe. Ihn auf 500Hz runterzubremsen ist leicht, wie du siehst. (Ich wechsel jetzt mal in die Zeitebene) Deine Rechnung dauert etwa 1ms, Ergebnisse werden alle 2ms benötigt, also alles im grünen Bereich. Machst du jetzt in der Mainloop etwas, das möglicherweise nichts mit dem Regler zu tun hat, aber länger als 1ms dauert, ist dein System geplatzt, und du verpasst die nächste PWM Phase.(@Besserwessi: einmal gehts noch gut)

Das sind meine Bedenken zu deinem Ansatz, ich hab oben schon einiges dazu gesagt. Aber laß dich von mir nicht irre machen, ein oder zwei mal hab ich auch schon Mist programmiert.

MfG Klebwax