Forum: Mikrocontroller und Digitale Elektronik 16-bit PWM nicht synchron zu weiterem PWM Kanal (MC S12X!!)


von Siggi G. (bize)


Lesenswert?

Hi @ all.

Ich weiß nicht, ob ihr mir weiterhelfen könnt, wäre aber um jede ernst 
gemeinte Antwort dankbar.

Vorab: Ich beschäftige mich gerade mit einem Freescale MCS12XE uC und 
dessen PWM-Register.

Ich habe ein 16-bit PWM Signal. Dieses erzeuge ich mir, indem ich Kanal 
0 und Kanal 1 "verkette" (concatenation of two 8-bit channels.).

Problem ist nun, dass der 8-bit PWM Kanal 2 nicht synchron mit Kanal01 
ist. Das hätte ich aber gerne für meine Anwendung.
Damit meine ich, dass die rising edge bzw. falling edge der beiden 
Signale immer einen gewissen Offset hat.
PWM Duty-Cycle und Frequenz habe ich vorab entsprechend eingestellt, 
hier besteht also sicher keine Fehlerquelle.

Ich kann mir das irgendwie nicht erklären. Eigentlich stammen ja alle 
PWM Kanäle von der selben Bus Clock ab und somit sollten ja die Flanken 
eigentlich synchron sein.
Lediglich die aller erste Flanke beim Einschalten der PWM ist synchron, 
danach stellt sich ein konstanter Offset sein.

Mal noch zum Vergleich: Wenn ich zwei 8-bit Kanäle miteinander 
vergleiche habe ich die Synchronität. Also hier bestätigt sich der 
Gedanke, dass ja mehrere PWMs im Endeffekt von der selben Clock 
abstammen.

Vielleicht hat jemand von euch schon mal einen ähnlichen Fall gehabt?
Würde mich interessieren, was ihr dazu denkt.


Vielen vielen Dank und ein schönes Wochenende ;-)

von Siggi G. (bize)


Lesenswert?

Weiß niemand etwas hierzu?

von Falk B. (falk)


Lesenswert?

@  Siggi G. (bize)

>Problem ist nun, dass der 8-bit PWM Kanal 2 nicht synchron mit Kanal01
>ist. Das hätte ich aber gerne für meine Anwendung.
>Damit meine ich, dass die rising edge bzw. falling edge der beiden
>Signale immer einen gewissen Offset hat.

Damit sind sie synchron, nur halt phasenverschoben.

>Ich kann mir das irgendwie nicht erklären. Eigentlich stammen ja alle
>PWM Kanäle von der selben Bus Clock ab und somit sollten ja die Flanken

Früher (tm) hieß das einfach Takt.

>Lediglich die aller erste Flanke beim Einschalten der PWM ist synchron,
>danach stellt sich ein konstanter Offset sein.

Siehe oben.

>Mal noch zum Vergleich: Wenn ich zwei 8-bit Kanäle miteinander
>vergleiche habe ich die Synchronität. Also hier bestätigt sich der
>Gedanke, dass ja mehrere PWMs im Endeffekt von der selben Clock
>abstammen.

Nö, die beiden PWMs greifen auf den gleichen 8-Bit Zähler zu. 
Wahrscheinlich liegt dein Problem bei einer ungünstigen Initialisierung 
des 8 Bit und 16 Bit Zählers. Beide müssen bei Null starten.

von Siggi G. (bize)


Lesenswert?

> Falk Brunner schrieb:
> @  Siggi G. (bize)
>
>>Problem ist nun, dass der 8-bit PWM Kanal 2 nicht synchron mit Kanal01
>>ist. Das hätte ich aber gerne für meine Anwendung.
>>Damit meine ich, dass die rising edge bzw. falling edge der beiden
>>Signale immer einen gewissen Offset hat.
>
> Damit sind sie synchron, nur halt phasenverschoben.
ok, stimmt sie sind synchron. Mein Problem ist damit die verschobene 
Phase.

>
>>Ich kann mir das irgendwie nicht erklären. Eigentlich stammen ja alle
>>PWM Kanäle von der selben Bus Clock ab und somit sollten ja die Flanken
>
> Früher (tm) hieß das einfach Takt.
>
>>Lediglich die aller erste Flanke beim Einschalten der PWM ist synchron,
>>danach stellt sich ein konstanter Offset sein.
>
> Siehe oben.
>
>>Mal noch zum Vergleich: Wenn ich zwei 8-bit Kanäle miteinander
>>vergleiche habe ich die Synchronität. Also hier bestätigt sich der
>>Gedanke, dass ja mehrere PWMs im Endeffekt von der selben Clock
>>abstammen.
>
> Nö, die beiden PWMs greifen auf den gleichen 8-Bit Zähler zu.
> Wahrscheinlich liegt dein Problem bei einer ungünstigen Initialisierung
> des 8 Bit und 16 Bit Zählers. Beide müssen bei Null starten.
hmm also grundsätzlich habe ich es im C-Code so gemacht, dass ich beide 
Timer auf 0x0000 bzw. 0x00 setze und im nächsten Schritt über
"PWME = 0x06;" dann den 16-bit und den 8-bit Kanal gleichzeitig 
aktiviere.

Hmm

von Falk B. (falk)


Lesenswert?

Vielleicht werden die beiden Timer von verschiedenen Vorteilern 
gespeist. Die müsste man reseten/synchronisieren. Versuch mal beide 
Timer mit maximalem Takt ohne Vorteiler zu betreiben.
Ist der Phasenversatz immer gleich, wenn du dein Programm neu startest?

von Siggi G. (bize)


Lesenswert?

Falk Brunner schrieb:
> Vielleicht werden die beiden Timer von verschiedenen Vorteilern
> gespeist.
Ja, die zwei Timer werden von verschiedenen Prescalern gespeist.
>Die müsste man reseten/synchronisieren.
Das habe ich schon versucht:
PWME = 0x00; (Alle Counter aus)
PWMCNT01 = 0x0000; (16 bit Counter)
PWMCNT2 = 0x00; (8 bit Counter)
PWME = 0x06; (Counter01 und Counter2 anschalten)
Hat aber nicht viel geholfen leider.

> Versuch mal beide
> Timer mit maximalem Takt ohne Vorteiler zu betreiben.
> Ist der Phasenversatz immer gleich, wenn du dein Programm neu startest?
Nein ist er nicht. schwer zu erklären, aber ich würde einfach mal sagen 
er pendelt um einen mittleren phasenversatz. würde ich sagen, dass der 
phasenversatz immer innerhalb eines gewissen bereichs liegt, in etwas 
25% plus minus 5%.

von Falk B. (falk)


Lesenswert?

@  Siggi G. (bize)

>Ja, die zwei Timer werden von verschiedenen Prescalern gespeist.

Dann versuch mal sie von einem Prescaler zu speisen oder ganz ohne 
Prescaler.

>>Die müsste man reseten/synchronisieren.
>Das habe ich schon versucht:
>PWME = 0x00; (Alle Counter aus)
>PWMCNT01 = 0x0000; (16 bit Counter)
>PWMCNT2 = 0x00; (8 bit Counter)
>PWME = 0x06; (Counter01 und Counter2 anschalten)
>Hat aber nicht viel geholfen leider.

Und wo ist der Prescaler Reset?

>> Ist der Phasenversatz immer gleich, wenn du dein Programm neu startest?
>Nein ist er nicht. schwer zu erklären, aber ich würde einfach mal sagen
>er pendelt um einen mittleren phasenversatz. würde ich sagen, dass der
>phasenversatz immer innerhalb eines gewissen bereichs liegt, in etwas
>25% plus minus 5%.

Klingt nach prescaler.

von Siggi G. (bize)


Lesenswert?

Falk Brunner schrieb:
> @  Siggi G. (bize)
>
>>Ja, die zwei Timer werden von verschiedenen Prescalern gespeist.
>
> Dann versuch mal sie von einem Prescaler zu speisen oder ganz ohne
> Prescaler.
>
>>Die müsste man reseten/synchronisieren.
>Das habe ich schon versucht:
>PWME = 0x00; (Alle Counter aus)
>PWMCNT01 = 0x0000; (16 bit Counter)
>PWMCNT2 = 0x00; (8 bit Counter)
>PWME = 0x06; (Counter01 und Counter2 anschalten)
>Hat aber nicht viel geholfen leider.
>
> Und wo ist der Prescaler Reset?

>
> Klingt nach prescaler.

Was ist ein Prescaler Reset?
Ich dachte ein Prescaler ist nur ein Wert den man irgendwo setzt??

von Falk B. (falk)


Lesenswert?

@  Siggi G. (bize)

>Was ist ein Prescaler Reset?

Ein Reset des Prescalers.

>Ich dachte ein Prescaler ist nur ein Wert den man irgendwo setzt??

Das ist die Einstellung des Prescalers.

Ein Prescaler ist ein Stück Hardware, das den Takt teilt, je nach 
Einstellung. Damit werden u.a. Timer getaktet. Wenn es mehr als einen 
Prescaler (Hardware!) gibt, kann es passieren, dass die zwar mit dem 
gleichen Eingangstakt laufen, aber der interne Zählwert nicht die 
gleiche Phase hat. Das passiert, wenn man einen mal anhält und den 
anderen nicht.
Wie das genau bei deinem Prozessor ist, musst du im Datenblatt GENAU 
nachlesen.

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.