Forum: Mikrocontroller und Digitale Elektronik STM32: Timer-Wert periodisch ändern


von Tom (Gast)


Lesenswert?

Hallo

ich möchte folgendes tun. Ich lasse auf einem STM32F407 einen Timer ein 
Rechtecksignl erzeugen. Wie ihr wisst, muss man dazu ja einen 
Reload-Wert für das Counter Register berechnen. Ich möchte nun folgendes 
tun: ich will, dass der Timer während 100 Zyklen den Reload-Wert 100 
benutzt, dann für 10 Zyklen den Reloadwert 101 benutzt und dann wieder 
100. Also periodisch zwischen zwei verschiedenen Reloadwerten 
umschalten.

Geht so etwas? wie könnte ich das realisieren, dass das mit den 
Taktzyklen genau aufgeht?

Die Anwendung soll erst mal egal sein, ich werde dann später dazu mehr 
erklären. Aber gibt es Prinzipiell eine Möglichkeit? die Frequenz des 
ausgegebenen Signals soll 125 kHz betragen.

Mein Timer läuft und ich weiss auch, wie ich den Reload-Wert ändere, 
aber wie ich es Taktzyklengenau schaffe, da habe ich keine Idee.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Könnte ein Job für den RepetitionCounter sein. Ich habe damit noch nicht 
rumgemacht, aber wernn ich das richtig verstehe, kann man dem Timer 
damit anweisen, eine bestimmte Zahl Zyklen zu durchlaufen und dann ein 
Update Event o.ä. auszulösen (sollte auch eine ISR zünden können).

von Ingo Less (Gast)


Lesenswert?

Interrupts zählen und in Abhängigkeit dessen den Reloadwert ändern!

von Ingo Less (Gast)


Lesenswert?

Repetition Counter is da genau das Richtige, stimmt! Garnicht an das 
Teil gedacht ??

von Tom (Gast)


Lesenswert?

Habt ihr da vielleicht ein Beispiel? ich sehe das grade nicht wie das 
funktionieren soll.

Ich habe leider gerade keine Hardware zur Hand, aber meint ihr so aus 
dem Stegreif, dass der STM32 schnell genug ist, um bei 125 kHz die 
Interrupts zählen zu können und dann noch innerhalb eines Taktes den 
Prescaler ändern zu können?

von rfewf (Gast)


Lesenswert?

> und dann noch innerhalb eines Taktes den Prescaler ändern zu können?

Wieso Prescaler ändern?

Du willst doch nur die Periode zwischen 100 und 101 umschalten?!?

von Tom (Gast)


Lesenswert?

Ja, habe mich verschrieben. Das Count-Register meinte ich natürlich 
(also den Reload Wert).

Später möchte ich noch weitere Taktänderungen vornehmen können, z.B. 3 
Takte mit Reloadwert 101 und dann 97 Takte mit Reloadwert 100. Das Ziel 
ist, ähnlich wie bei einer FNPLL, im mittel eine Frequenz zu erzeugen, 
die mit der Auflösung der Register eigentlich sonst nicht machbar wäre. 
Zwar gibt das einen Taktjitter, aber dafür habe ich, über viele Perioden 
gemittelt, eine Frequenz erzeugen können, die ich sonst nicht könnte.

von chris (Gast)


Lesenswert?

Tom schrieb:
> innerhalb eines Taktes

Du musst doch nicht innerhalb eines Taktes ändern, sondern nur bevor der 
Timer den neuen Reload-Wert erreicht.

Also wenn du von 101 auf 100 ändern willst, darf dein Timer halt maximal 
99 sein, damit du die 100 nicht verpasst.
D.h. du hast dafür nach dem Timer-Reset 99 Timer-Takte Zeit, was bei 
deinen 125 kHz pro Periode ja ca. 8 µs sind. Das sollte schon zu 
schaffen sein.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tom schrieb:
> und dann noch innerhalb eines Taktes den
> Prescaler ändern zu können?

Das macht der Timer bei einem Update Event, M.W. ist da ein Buffering, 
so das man den Reloadwert vorgibt und dann den Timer ins Update Event 
laufen lässt - dann wird der neue Wert in den Counter übernommen.

Tom schrieb:
> Habt ihr da vielleicht ein Beispiel? ich sehe das grade nicht wie das
> funktionieren soll.

Lies den entsprechenden Abschnitt zu Timern in RM0090, das ist die 
Referenz.

von Tom (Gast)


Lesenswert?

Danke euch für die Tipps. Ich werde es einfach ausprobieren. Aber ihr 
habt recht, die 8 Mikrosekunden müssten grad knapp reichen.

Denkt ihr, mein Vorhaben ist Blödsinn, solche "Zwischenfrequenzen" 
erzeugen zu wollen? Ich glaube es müsste funktionieren, aber ich weiss 
es eben nicht und will es darum ausprobieren.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Tom schrieb:
> Aber ihr
> habt recht, die 8 Mikrosekunden müssten grad knapp reichen.

Du hast die Posts gar nicht gelesen, oder? Erstens gibt es den 
Repetition Counter und zweitens sind die Register gebuffert, ein neuer 
Wert wird erst beim Update Event übernommen - und zwar automatisch. 
Probiers einfach aus.

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

Doch ich habe die Posts gelesen. Den Repetition Counter habe ich noch 
nie benutzt. Ich habe es gestern versucht auf einem Discovery Board zu 
implementieren aber ich bin noch auf ein anderes Problem gestossen. Denn 
ich wusste nicht sicher, welchen Timer Mode ich denn jetzt benutzen 
soll. Ich habe PWM benutzt, und dann muss man im CCR Register den Duty 
Cycle noch jeweils nachführen, was lästig ist.
Ich muss dazu sagen, dass ich schon länger nichts mehr mit dem F407 
gemacht habe. Kann mir jemand vielleicht ein kleines Beispiel zeigen?

von Jim M. (turboj)


Lesenswert?

Tom schrieb:
> Mein Timer läuft und ich weiss auch, wie ich den Reload-Wert ändere,
> aber wie ich es Taktzyklengenau schaffe, da habe ich keine Idee.

Muss man nicht taktzyklengenau machen, wenn man den nächsten Wert 
einliesst.

Ansonsten könnte man auch über DMA nachdenken, d.h. der Timer triggert 
einen DMA Transfer der den nächsten Wert schreibt. Gängige DMA 
Controller können zyklische Transfers spätestens im Scatter-Gather Mode, 
oft sogar direkt.

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.