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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Man kann beim STM32 doch bestimmt auch den Auto-Reload eines Timers 
disablen...

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


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

von Teo D. (teoderix)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Du willst also eine PLL mit einem bestimmten ganzzahligen Faktor in 
Software basteln?

von Holger K. (holgerkraehe)


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

Eigentlich ja :)

von Teo D. (teoderix)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Vllt. hilft dir dieser (sehr alte) Thread:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.