Hallo, ich möchte ein 8 Kanal Summensignal mit einem Stm32F103 erzeugen. Meine erste Idee war ein 1µs Interrupt in dem ich einen Port je nach Vorgabe schalte. Der Code im Interrupt wäre zwar recht schlank, ich bezweifle aber das das der optimale Weg ist. Hat jemand eine bessere Idee? Frank
Frank schrieb: > Meine erste Idee war ein 1µs Interrupt in dem ich einen Port je nach > Vorgabe schalte. Was ist denn ein 1µs Interrupt? Meinst du damit alle 1µs ein Interrupt? Ich kenne den Stm32F103 zwar nicht aus eigener Erfahrung, bezweifele aber, dass er das überhaupt schaffen würde. Üblicherweise erzeugt man kurze Impulse definierter Länge mit einem Timer.
Hallo Wolfgang, Ein "1µs Interrupt" wird jede µs aufgerufen. Das geht zwar soweit, ist aber nicht sonderlich Toll für die restliche Performance. Ich hätte noch die Idee einen Timer laufen zu lassen und in jedem Überlauf Interrupt die neue Zeit die der Timer laufen soll vorzugeben. Geht auch soweit und belastet den Rest nicht so extrem. Ist aber irgendwie auch nicht schön. Macht man das so? Daher meine Frage an alle: Wie erzeugt man am sinnigsten ein PPM Signal? Frank
Frank schrieb: > Ich hätte noch die Idee einen Timer laufen zu lassen und in jedem > Überlauf Interrupt die neue Zeit die der Timer laufen soll vorzugeben. > Geht auch soweit und belastet den Rest nicht so extrem. Nicht so extrem ist gut ausgedrückt. "So gut wie überhaupt nicht" trifft es schon eher. > Ist aber > irgendwie auch nicht schön. Das dachte ich auch mal, musste mich aber eines besseren belehren lassen. Das ganze ist in der Tat recht einfach mit dem richtigen Timer. > Macht man das so? Hier Modellbauservo Ansteuerung hab ich das für 8 Servos gemacht, wobei die Signale dann auch noch auf 8 Ausgänge verteilt werden müssen. Dein Fall ist ein wenig anders gelagert, aber auch wieder nicht. Das Prinzip ist einfach: Man rechnet sich aus, wie weit der Timer jeweils zählen muss. Dann wird der Compare-Match des Timers um genau diesen Wert in der ISR weiter gestellt. Pünktlich nach Ablauf der Zeit meldet sich der Timer wieder mit einem Interrupt und man setzt den nächsten Wert. In Summe war das viel einfacher, als ich ursprünglich angenommen hatte. Wie das konkret bei deinem µC funktioniert, kann ich mangels Wissen über deinen µC nicht sagen. Ich denke allerdings, dass er ähnliche Funktionalität bereit stellt. Mehr als einen Compare-Match, der einen Interrupt auslöst, benötigt man hardwareseitig ja nicht.
:
Bearbeitet durch User
Man kann es beim stm32 auch ganz ohne CPU-Beteiligung hinbekommen, indem man einen Timer+DMA nutzt. Dafür muss man nur eine globale Variable anlegen, in der die Daten für die einzelnen Kanäle des PPM gespeichert werden. Der DMA füttert dann den Timer (PWM-Modus) kontinuierlich mit diesen Daten. Ich habe das mal für den stm32f407 gemacht, siehe "rc_ppm_out_init" im Anhang. Vermutlich muss man es für den f1 etwas abändern. Im angehängten Code ist auch die Gegenrichtung (Einlesen von PPM via Interrupt) und die Ausgabe von 4x "normalem" PWM implementiert.
Hallo, habe heute erst wieder ins Forum schauen können. Danke für Eure Antworten. Besonders für den Code von Michael :-) Ich werds mir ansehen. Die Variante mit dem DMA gefällt mir sehr gut! Gruß Frank
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.