Forum: Mikrocontroller und Digitale Elektronik RC Summensignal erzeugen


von Frank (Gast)


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

von Frank (Gast)


Lesenswert?

keiner ne idee?

von Wolfgang (Gast)


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.

von Frank (Gast)


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

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Michael F. (startrekmichi)


Angehängte Dateien:

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.

von Frank (Gast)


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

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
Noch kein Account? Hier anmelden.