Frequenz toggeln

Gast #331880
Lesenswert?

Hi
kann mir eventuell jemand erklären wie das mit dem toggeln, um auf eine
bestimmte Frequenz zu kommen, funktioniert?
Also um zum Beispiel mit einem 8 Mhz µC an einem Pin eine Frequenz von
35 Khz zu erzeugen.

Wenn ich die Werte habe kann ich doch nen Timer benutzen,mit dem Wert
vorladen,und bei Überlauf nen Interrupt machen um Pin zu setzen und zu
löschen.
Stimmt das so ungefähr?

Meine Frage ist nun wie ich auf die Wert(e)komme und was ich beim
Timing beachten muß.

Vielen Dank schonmal für eure Hilfe!
Gast #331881
Lesenswert?

>Wenn ich die Werte habe kann ich doch nen Timer benutzen,mit dem Wert
vorladen,und bei Überlauf nen Interrupt machen um Pin zu setzen und zu
löschen.
>Stimmt das so ungefähr?

ja, so kann man das machen. Grössere AVR haben auch die Möglichkeit,
Pins mit einem Timer ganz alleine zu togglen (onCompare-Pins).
#331882
Lesenswert?

Du brauchst die doppelte Toggle-Frequenz, also 70 KHz, also einen Teiler
von ca 114 (8MHz / 70 KHz).

Du stellst den Base-Teiler für den Timer auf 1, der Timer zählt dann
bis auf 256 (8-Bit) dann tritt ein Overflow-Interrupt auf (beim AVR
zumindest) Im Overflow-Interrupt setzt du den Timer dann auf
TCNT=256-114 (evtl noch etwas mehr, da 1-2 Takte durch die
Interrupt-Behandlung verloren gehen) und togglest den Pin.
Das aber lastet den AVR ziemlich schnell aus, so dass man für andere
Sachen nicht mehr so viel Rechenzeit hat.

Alternativ kann man das auch über einen PWM-Pin machen, da
initialisiert man der Timer einmal und er (der AVR) macht dann alles
selber.

Wie's mit anderen Controllern aussieht weiß ich leider nicht.

Gruß
Roland
Gast #331883
Lesenswert?

Hallo Carsten,

also eigentlich ganz einfach: Das Prinzip mit dem Timer hast du soweit
schon richtig erkannt und verstanden.

Um die Timerwerte zu berechnen mußt du nur wissen, mit welchem Takt
dein Timer betrieben wird, also die Frequenz des Mikrocontrollers und
den Prescaler (Vorteiler, welcher den Takt des MCs in einem definierten
Verhältnis teilt und damit den Timer versorgt). Dieser Takt mit dem der
Timer betrieben wird, bestimmt die Zeit (auch Periodendauer) eines
Zählschrittes, also z.B. von 1 zu 2 (Periodendauer = 1 / Frequenz).

Wenn der Zählbereich des Timers nicht ausreicht, also du eine
"relativ" kleine Frequenz erzeugen willst, dann erhöhe den
Prescalerwert um in einen Bereich zu gelangen, in dem du die Frequenz
abbilden kannst.

Dein Beispiel weitergeführt:
Frequenz des Mikrocontrollers: f_mc = 8Mhz
Frequenz des Ausgangssignales: f_out = 35 kHz
Timergröße: 8 Bit

Die Frage, welche sich jetzt stellt, aller wieviel µs mußt du den Pin
umschalten:
T_out = 1 / f_out = 1 / 35 kHz = 28.57... µs
Um sehr genau an diesen Wert heranzukommen, ist es wichtig, den
kleinstmöglichen Wert für den Prescaler zuverwenden.
T_mc = 1 / f_mc = 0,125 µs
die Anzahl der Zählschritte ergibt sich dann aus
(T_out / 2) / T_mc = 114,285...
T_out / 2 deswegen, da du immer nur bis zu dem Zeitpunkt zählen mußt,
an dem du das Ausgangssignal invertierst, also je nur eine halbe
Periodenlänge.
Da du nur ganze Zahlen als Werte für den Timer verwenden kannst,
verwendest du 114 (liegt ja zwischen 0 und 255, dem Wertebereich des
Timers) und du brauchst keinen Prescaler verwenden.
Zur Kontrolle noch mal die Frequenz ausrechenen, die am Ende wirklich
erzeugt wird:
f_out_real = 1 / T_out_real = 1 / (2  T_mc  114) = 35,088 kHz
ergibt ne Anweichung von 0,25%

Viel Spaß beim toggeln...
Gast #331885
Lesenswert?

Vielen Dank soweit für eure Hilfe.
Hab übrigens vergessen zu erwähnen daß ich nen Atmega verwende.
Hier bin ich gerade im Datenblatt zu Werke und versuche die Methode von
Rahul mit den onCompare Pins zu verstehen.
Außerdem hab ich hier ja einen 16 bit Timer zur Verfügung!?
Gast #331886
Lesenswert?

Die Methode heißt bei den AVRs übrigens CTC-Modus. Schau Dir das mal
genauer an. Wenn Du mit Überläufen arbeitest, musst Du nämlich immer
das Zählregister des Timers mit dem Startwert laden, wodurch 1. der
Programmieraufwand steigt und 2. das ganze ungenauer wird. Im CTC-Modus
initialisierst Du das ganze einmal und dann brauchste Dich nicht mehr
drum zu kümmern...
Gast #331891
Lesenswert?

Oh, da hab ich mich zweideutig ausgedrückt. Das übliche "Problem" dass
der Mikrocontroller bei 0 beginnt zu zählen, also bei 114 Zählschritten
muß der OC-Wert 114-1 also 113 sein. Das Rücksetzten des Timers von 113
auf 0 braucht ja auch einen Takt.

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