Forum: Mikrocontroller und Digitale Elektronik Frequenz toggeln


von Carsten (Gast)


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!

von Rahul (Gast)


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

von Roland P. (pram)


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

von Wadenbeisser (Gast)


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...

von Rolf Magnus (Gast)


Lesenswert?

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

Du meinst so riesige AVRs wie z.B den ATtiny13? ;-)

von Carsten (Gast)


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

von johnny.m (Gast)


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...

von Wadenbeisser (Gast)


Lesenswert?

Der 16 Bit-Timer zählt weiter als der 8 Bit-Timer, aber nicht genauer...
Um genauer zu werden mußt du die Frequenz erhöhen, also statt 8 MHz
deinen Atmel mit 16 MHz betreiben...

von Rahul (Gast)


Lesenswert?

@Rolf: Ich arbeite bis jetzt nur mit ATMegas. Dass der Tiny13 das auch
kann, wusste ich nicht.
Vielleicht hätte ich lieber "aktuelle" oder dergl schreiben sollen.

von Carsten (Gast)


Lesenswert?

Die Frequenz zu erhöhen wird schwer wegen Versorgungsspannung ;-)

von Carsten (Gast)


Lesenswert?

@ Wadenbeisser:
Kann es sein dass du eine +1 vergessen hast bei deiner Rechnung.
Hab im Datenblatt des Atmega8515 auf Seite 86 die Formel verglichen.
http://www.atmel.com/dyn/resources/prod_documents/doc2512.pdf

von Wadenbeisser (Gast)


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.

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.