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.
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).
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?
> 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?!?
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.
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.
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.
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.
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.
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?
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.