RC Summensignal erzeugen

Gast #3382419
Lesenswert?

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
Gast #3382835
Lesenswert?

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.
Gast #3383823
Lesenswert?

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
#3383851
Lesenswert?

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.
#3384183
Lesenswert?

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.
Angehängte Dateien:
Gast #3386645
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren