Frequenzerzeugung mit ATmega

Gast #1023229
Meine Aufgabe ist über einen ATmega 4 unterschiedlich einstellbare 
Frequenzen von 0-20kHz zu erzeugen. Im CTC-Mode würde das relativ 
einfach funktionieren, aber man bräuchte für jede Frequenz einen Timer 
(insgesamt 4), so wie ich das aus dem Datenblatt sehe. 4 Timer dafür zu 
verwenden ist zu viel, da ich noch welche für andere Zwecke benötige.

Meine Idee ist jetzt einen Timer-Interrupt mit 20kHz (alle 50us) zu 
definieren. In der ISR werden dann 4 Zähler verwaltet und hochgezählt 
bis zu einem einstellbaren Wert. Bei erreichen des Wertes soll der 
entsprechende PIN getoggelt werden. Auf diese weise wären 4 verschiedene 
Frequenzen in 1Hz-Schritten realisierbar. Soweit die Theorie.

Da der ATmega auch noch andere Aufgaben übernehmen soll, wäre 
interessant zu wissen, wieviel Zeit die Bearbeitung der ISR ca. in 
Anspruch nimmt. Der ATmega soll mit ca. 8MHz getaktet werden. Oder ist 
eine externe einstellbare Frequenzerzeugung unumgänglich?

Gruß MaBu
Gast #1023274
Ja richtig! Der Timer-Interrupt muss natürlich mit 40kHz laufen um beide 
Flanken erzeugen zu können.

Meine Frage: ist der ATmega damit überfordert alle 25us die ISR 
aufzurufen, 4 externe Variablen zu inkrementieren und 4 Abfragen 
externer Variablen durchzuführen?
#1023290
Schau mal im Datenblatt hinten in die Befehlsliste (Instruction Set 
Summary), da steht auch bei, wieviele Takte jeder einzelne Befehl 
braucht. Dazu kommt dann noch Einsprung und Rückkehr aus dem Interrupt, 
minimal 8 Takte. bei 8MHz-Takt also 1µs.

Gruß
Jadeclaw.
Gast #1023416
3 Möglichkeiten:
1. für jede Frequenz einen eigenen Timer, da brauchst Du einen anderen 
Controller.

2. einen Timer, der per Software alle 4 Frequenzen erzeugt:
eine Tabelle, bei welchem nächsten Zählerstand die Pins getoggelt werden 
müssen.
Bei jedem Interrupt den Timer auf den jeweils nächsten Eintrag der 
Tabelle setzen (naheliegende Zählerstände zusammenfassen).

3. DDS, z.B. Jespers "Poor Man's DDS"
Für Rechteck geht das ohne Sin-Tabelle noch einfacher.
Gast #1030980
Ich habe mir jetzt Samples vom AD9833 und AD5932 bestellt und werde 
diese testen. Ist zwar etwas überdimensioniert, aber so bleibt später 
noch Raum für höhere Anforderungen.

Ich bin zwar nicht sicher, ob der "Square-Wave Output" nicht doch zu 
viel Jitter im DutyCycle verursacht. Problematisch wird es, wenn hier 
Einstellungen ungleich der 2er-Basis getroffen werden. Ich benötige 50% 
DutyCycle. Falls doch muss der "Triangle Output" und ein hinterher 
geschalteter Komparator herhalten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.