Forum: Mikrocontroller und Digitale Elektronik Timer synchronisieren. Bitte hilfe bei Logikproblem


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Folgendes Problem: (STM32F0)

Ich möchte einen Timer auf externe 50Hz synchronisieren.
Dazu habe ich an TIM1 mittels ETR einen 100 Hz rechteck angeschlosssen.
Dieser kommt von der Nulldurchgangserkennung.

Nun zähle ich immer auf 2 (somit eine Periode = 50Hz)
Nach dieser Zeit, setze ich den Timer3 TIM3 auf 0 (TIM3->CNT = 0)

TIM3 hat eine Periode von 50Hz eingestellt.
Läuft also theoretisch selbst bereits mit 50Hz.
Durch das nullstellen sollen kleinste Abweichungen synchronisiert 
werden.

Das Problem:

Ich habe an TIM3 noch ein paar Output Compares im Toggle mode.
Warum Toggle? Ich möchte auch über "0" hinaus eine Zeit einstellen 
können.


TIM3 CNT  -----------------|-------------------|------------- |= Null
Output    ____________|---------|_________|---------|________

Dies mache ich so, dass ich im Compare Interrupt jeweils den nächsten 
Compare wert lade.

Nun das eigentliche Problem:

Wenn der Wert sehr knapp um 0 herum ist, so kann es sein dass der 
Ausgang bereits getoggelt hat, das der Zähler TIM3 bereits einen 
overflow hatte.
Nun komme ich mit TIM1 kurz darauf und stellen den CNT erneut auf 0. Nun 
toggelt der Ausgang erneut und invertiert.

Wie kann ich dieses Verhalten elegant umgehen?

Danke

von Joe F. (easylife)


Lesenswert?

Man kann beim STM32 doch bestimmt auch den Auto-Reload eines Timers 
disablen...

von Thomas E. (thomase)


Lesenswert?

Warum nimmst du nicht den externen Takt direkt als Zeitbasis, anstatt 
einen internen Takt darauf zu synchronisieren?

von Teo D. (teoderix)


Lesenswert?

Holger K. schrieb:
> Nun komme ich mit TIM1 kurz darauf und stellen den CNT erneut auf 0. Nun
> toggelt der Ausgang erneut und invertiert.

Ein Timer1-Flag lässt das in Timer3 erledigen. Jitter!?

von Holger K. (holgerkraehe)


Lesenswert?

Thomas E. schrieb:
> Warum nimmst du nicht den externen Takt direkt als Zeitbasis,
> anstatt
> einen internen Takt darauf zu synchronisieren?

Ja aber dann hab ich ja nur 50Hz.

Ich möchte innerhalb dieser 50Hz noch signale generieren welche synchron 
zu diesen sind.

Teo D. schrieb:
> Ein Timer1-Flag lässt das in Timer3 erledigen. Jitter!?

Ja, ich habe Jitter.
Wie meinst du dass mit dem Timer Flag?

von Teo D. (teoderix)


Lesenswert?

Holger K. schrieb:
> Ja aber dann hab ich ja nur 50Hz.

Ich würd mir eher sorgen machen das die ausfallen könnten.

Holger K. schrieb:
> Wie meinst du dass mit dem Timer Flag?

Na irgendein Flag das von Timer1 kommt und erst in Timer3 ausgewertet 
wird und so keinen eigenen Aufruf von Timer3 erzeugt.
Das würde aber zusätzlich einen kleinen Jitter ergeben. Ich weiß ja nich 
was du vorhast aber man müsste sicher nicht bei jeder Gelegenheit 
Synchronisieren.

von Holger K. (holgerkraehe)


Lesenswert?

Teo D. schrieb:
> Ich würd mir eher sorgen machen das die ausfallen könnten.

Das ist kein Problem.
Es handelt sich um ein Testgerät. Liegen keine 50Hz an so kann man auch 
nicht testen.

Teo D. schrieb:
> Na irgendein Flag das von Timer1 kommt und erst in Timer3 ausgewertet
> wird und so keinen eigenen Aufruf von Timer3 erzeugt.

Alles Klar.

Also würde ich beim Überlauf von TIM3 auf das Flag warten und erst dann 
den Timer weiterlaufen lassen?

Dafür müsste Timer3 aber immer ein wenig schneller sein als die 50Hz. 
Ansonsten läuft er über nachdem das Flag bereits kam.

Oder wie hast du dir das vorgestellt?
Kann man beim STM32 den autoreload deaktiveiren?

Teo D. schrieb:
> Ich weiß ja nich
> was du vorhast aber man müsste sicher nicht bei jeder Gelegenheit
> Synchronisieren.

Signale synchron zu den anliegenden 50Hz erzeugen.
Toleranz +- 200uS akzeptabel (Jitter 50uS akzeptabel)

von Walter T. (nicolas)


Lesenswert?

Du willst also eine PLL mit einem bestimmten ganzzahligen Faktor in 
Software basteln?

von Holger K. (holgerkraehe)


Lesenswert?

Walter T. schrieb:
> Du willst also eine PLL mit einem bestimmten ganzzahligen Faktor
> in
> Software basteln?

Eigentlich ja :)

von Teo D. (teoderix)


Lesenswert?

Hör auf über meinen Blödsinn nach zu denken!

KA. wo ich da war..... Das war einfach nur Schwachsinnig.... :(

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Holger K. schrieb:
> Eigentlich ja :)

Ich wollte nur das Problem verstehen. Zur Lösung kann ich nichts 
beitragen. Das ist weitab meiner Kenntnisse.

von Teo D. (teoderix)


Lesenswert?

Mir fällt nix ein, außer T1 u. T2 zusammen zu legen oder das komplett 
anders angehen.

von Holger K. (holgerkraehe)


Lesenswert?

Teo D. schrieb:
> Mir fällt nix ein, außer T1 u. T2 zusammen zu legen oder das
> komplett
> anders angehen.

erzähl mir mehr zu deinem Konzept :)

von Teo D. (teoderix)


Lesenswert?

Holger K. schrieb:
> Teo D. schrieb:
>> Mir fällt nix ein, außer T1 u. T2 zusammen zu legen oder das
>> komplett
>> anders angehen.
>
> erzähl mir mehr zu deinem Konzept :)

Du hast doch 2 gleich schnelle Timer (zumindest harmonische)!? Pack die 
Funktionen in einen....

Man könnte den TimerInterrupt gesperrt lassen und nur vom Synk. Impuls 
freigeben...

von Jacko (Gast)


Lesenswert?

So simpel, wie du es machen willst, erinnert mich das an die
alte Videotechnik. Dort wurde immer ein ETWAS zu langsam laufender
Oszillator vom Videotakt (egal, ob Zeile, oder Halbbild) auf das
darzustellende Signal synchronisiert.

Bei einem µC mit einigen MHz Takt kann man doch einen Timer mit
99,x Hz, (10,y ms) oder 49,x Hz (20,y ms) konfigurieren.

Z.B. 8 MHz µC-Takt, 100,x Hz Signaltakt

Timer Prescaler = 1/512
Timer CTC-Wert  = 156 (157 Zustände)
8.000.000  512  157 = 99,5223 Hz bzw. 10,048 ms

Wenn du keine zusätzlichen Compare-Ereignisse in den
letzten möglichen Zählerständen (154, 155, 156) benutzt,
dürfte das synchronisieren auf die externen 100,0 Hz gut
funktionieren.

Allerdings: Bis die Synchronisation eingeschwungen ist,
kann erst mal je nach Phasen-Lage für 1..2 100 Hz-Perioden
wirrer Murks produziert werden.

von Holger K. (holgerkraehe)


Lesenswert?

Danke für die Antworten.

Letzte klingt nach einem Plan.

Dafür müsste ich aber die Auto-Reload funktion des Timers deaktivieren 
können. Weiss jemand wie das bei einem STM32F0 für TIM3 geht?

Ich habe im reference Manual nichts gefunden. Ausser das wenn ARR auf 0 
ist, der Zähler auch blockiert ist. Aber das ist nicht das ziel.

Danke

von Joe F. (easylife)


Lesenswert?

Vllt. hilft dir dieser (sehr alte) Thread:

Beitrag "STM32 one-pulse-timer geht nur einmal"

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.