Timer synchronisieren. Bitte hilfe bei Logikproblem

OP #5191724
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
OP #5191882
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?
#5191887
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.
OP #5191965
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)
Gast #5192331
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.
OP #5192479
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

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