Forum: Mikrocontroller und Digitale Elektronik PWM-Eingabe mit PWM-Frequenz synchronisieren - AVR


von Berti (Gast)


Lesenswert?

Hallo,

würde gerne die Eingabewerte für die PWM-Ausgabe mit der PWM-Frequenz 
synchronisieren, weiß jemand, wie man das machen kann (bzw. ob das 
überhaupt geht)?

Sprich: Wenn z.B. die PWM-Frequenz 15625Hz beträgt, möchte ich auch 
15625 Werte pro Sekunde ausgeben.

Am günstigsten wäre wahrscheinlich, wenn man immer dann einen Interrupt 
auslösen könnte, wenn grade ein neuer PWM-Wert am Pin ausgegeben wird, 
um den nächsten Wert ins OCR-Register zu laden.

Hier eine Idee meinerseits, die aber wohl nicht praxistauglich sein 
wird: wenn z.B. am Pin OC1A das PWM-Signal ausgegeben wird, könnte man 
diesen Pin mit INT1 verbinden. Das PWM-Signal würde dann bei 
Flankenwechsel einen externen Interrupt triggern. Leider funktioniert 
das aber spätestens dann nicht mehr, wenn an OC1A =x00 ausgegenen wird, 
weil bei Null-Wert-Ausgabe logischerweise kein Flankenwechsel mehr 
stattfindet.

Hat jemand eine andere Idee, wie man sonst noch eine Synchronisierung 
erreichen könnte?

von Lehrmann M. (ubimbo)


Lesenswert?

Berti schrieb:
> Sprich: Wenn z.B. die PWM-Frequenz 15625Hz beträgt, möchte ich auch
> 15625 Werte pro Sekunde ausgeben.

Was für Werte willst du ausgeben?

Ich versteh das noch nicht ganz was du genau machen willst. Willst du 
den Zeitpunkt capturen oder was ?

Ich verstehe nicht welche Werte du 15625 mal pro Sekunde ausgeben 
willst...

von Philipp B. (philipp_burch)


Lesenswert?

Hallo Berti,

erklär doch mal das Ziel deines Vorhabens, dann kann man besser helfen. 
Zumindest erschliesst sich mir der Sinn dieser "Synchronisation" auch 
nicht wirklich. Schreibzugriffe in's OCR-Register werden bei den AVRs im 
PWM-Modus ohnehin synchronisiert, so dass die Frequenz keinem Jitter 
unterworfen wird. Und es ist im Übrigen auch kein Problem, die 
PWM-Ausgabe und den Compare-Interrupt parallel zu verwenden.

von Berti (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> Ich versteh das noch nicht ganz was du genau machen willst. Willst du
> den Zeitpunkt capturen oder was ?

Was meinst du in dem Fall mit Capturen? (Eigentlich eher das Gegenteil, 
es sollen ja vorhandenen Daten ausgegeben werden).


Hier mal als Beispiel, so soll es sein:

1.PWM-Wert-Eingabe ins OCR ---> 1.PWM-Wert-Ausgabe am Pin
2.PWM-Wert-Eingabe ins OCR ---> 2.PWM-Wert-Ausgabe am Pin
3.PWM-Wert-Eingabe ins OCR ---> 3.PWM-Wert-Ausgabe am Pin
4.PWM-Wert-Eingabe ins OCR ---> 4.PWM-Wert-Ausgabe am Pin
5.PWM-Wert-Eingabe ins OCR ---> 5.PWM-Wert-Ausgabe am Pin
usw.


Wenn man die Werte nicht synchron eingibt, könnte es beispielsweise so 
aussehen:

1.PWM-Wert-Eingabe ins OCR ---> 1.PWM-Wert-Ausgabe am Pin
3.PWM-Wert-Eingabe ins OCR ---> 2.PWM-Wert-Ausgabe am Pin
4.PWM-Wert-Eingabe ins OCR ---> 3.PWM-Wert-Ausgabe am Pin
6.PWM-Wert-Eingabe ins OCR ---> 4.PWM-Wert-Ausgabe am Pin
7.PWM-Wert-Eingabe ins OCR ---> 5.PWM-Wert-Ausgabe am Pin
usw.

Im 2. Fall sind dann die Werte 2 und 5 verlohrengegangen.
Denkbar wäre natürlich auch der Fall, dass die Werte zu langsam 
eingegeben werden, dann würden einige eingabewerte doppelt oder noch 
öfter hintereinander ausgegeben.
Kann leider mit Worten im vorliegenden Fall relativ schlecht das Problem 
auf den Punkt bringen.

von Berti (Gast)


Lesenswert?

Philipp Burch schrieb:
> Schreibzugriffe in's OCR-Register werden bei den AVRs im
> PWM-Modus ohnehin synchronisiert, so dass die Frequenz keinem Jitter
> unterworfen wird. Und es ist im Übrigen auch kein Problem, die
> PWM-Ausgabe und den Compare-Interrupt parallel zu verwenden.

Ja, genau, Jitter ist das Wort, das ich gesucht habe!

Das mit der PWM-Ausgabe und dem Compare-Interrupt klingt interessant, 
werfe ich gleich mal einen Blick ins Tutorial.

von Grrrr (Gast)


Lesenswert?

Berti schrieb:
> Kann leider mit Worten im vorliegenden Fall relativ schlecht das Problem
> auf den Punkt bringen.

Nun, für den Fall hat einer unserer Vorfahren ein schönes Wort geprägt: 
Ein Bild sagt mehr als tausend Worte.

von Berti (Gast)


Lesenswert?

Grrrr schrieb:
> Ein Bild sagt mehr als tausend Worte.

Das hier war das Bild :-), s.o.
>>1.PWM-Wert-Eingabe ins OCR ---> 1.PWM-Wert-Ausgabe am Pin
>>2.PWM-Wert-Eingabe ins OCR ---> 2.PWM-Wert-Ausgabe am Pin
>>3.PWM-Wert-Eingabe ins OCR ---> 3.PWM-Wert-Ausgabe am Pin
>>...


Berti schrieb:
> Compare-Interrupt
Wie wird der Interrupt denn ausgelöst bzw. was wird verglichen?
(finde im Datenblatt auf die Schnelle nichts Aufschlussreiches)

von Philipp B. (philipp_burch)


Lesenswert?

Achso, du möchtest also deine Werte in jeweils einer einzelnen 
PWM-Periode "ausgeben"? Wenn der Timer-Takt ausreichend langsam ist 
(max. F_CPU / 16 würde ich mal sagen), kannst du das gut im 
Compare-Interrupt machen. Kritisch sind dabei dann jeweils Werte nahe 
der Obergrenze (Bei acht Bit also 255 und evtl. noch 254), weil der 
Schreibzugriff unbedingt vor dem Überlauf des Timers erfolgen muss. Um 
diesem Problem aus dem Weg zu gehen, könntest du natürlich auch einen 
Compare-Kanal für die Ausgabe nutzen und den anderen (festeingestellt 
auf den Wert 1 z.B.) für die Synchronisation. So hast du immer genügend 
Zeit in der ISR um den neuen Wert zu laden. Evtl. geht es auch im 
Overflow-Interrupt, der müsste ja eigentlich unmittelbar beim Überlauf 
aufgerufen und entsprechend in den paar folgenden Takten abgearbeitet 
werden...

UPDATE:
>> Compare-Interrupt
>Wie wird der Interrupt denn ausgelöst bzw. was wird verglichen?
>(finde im Datenblatt auf die Schnelle nichts Aufschlussreiches)

Der Interrupt wird ausgelöst, wenn der Comparewert (In OCRnA, bzw. 
OCRnB) erreicht wird. Gleich wie bei der Ausgabe auf einen Pin halt. 
Natürlich muss der Interrupt dazu aktiviert sein (TIMSKn = _BV(OCIEnX);) 
und die Interrupts müssen global eingeschaltet sein (sei();).

von Karl H. (kbuchegg)


Lesenswert?

Berti schrieb:
> Grrrr schrieb:
>> Ein Bild sagt mehr als tausend Worte.
>
> Das hier war das Bild :-), s.o.
>>>1.PWM-Wert-Eingabe ins OCR ---> 1.PWM-Wert-Ausgabe am Pin
>>>2.PWM-Wert-Eingabe ins OCR ---> 2.PWM-Wert-Ausgabe am Pin
>>>3.PWM-Wert-Eingabe ins OCR ---> 3.PWM-Wert-Ausgabe am Pin
>>>...

Schon.
Aber .... wozu?
An wen willst du den OCR Wert weitergeben?
Und vor allen Dingen: Wie willst du ihn weitergeben?
Und warum ist das nicht genau genug, wenn du einfach beim Neusetzen des 
OCR Registers (mit dem du die PWM verstellst) dann hinten nach den neuen 
Wert (über UART oder was auch immer) weitergibst?


>> Compare-Interrupt
> Wie wird der Interrupt denn ausgelöst bzw. was wird verglichen?
> (finde im Datenblatt auf die Schnelle nichts Aufschlussreiches)

So wie jeder andere Interrupt auch.
Man schreibt eine ISR und gibt den Compare Match Interrupt frei.
Sobald der Vergleich zutrifft, wird die ISR aufgerufen.
Ob der Compare Match Interrupt der richtige ist, hängt im übrigen auch 
noch vom eingestellten PWM Modus ab.

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.