www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenz toggeln


Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wadenbeisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ;-)

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Wadenbeisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Frequenz zu erhöhen wird schwer wegen Versorgungsspannung ;-)

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Autor: Wadenbeisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.