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).
Interrupts zählen und in Abhängigkeit dessen den Reloadwert ändern!
Repetition Counter is da genau das Richtige, stimmt! Garnicht an das Teil gedacht ??
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.
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.