Forum: Mikrocontroller und Digitale Elektronik Frequenzerzeugung mit ATmega


von MaBu (Gast)


Lesenswert?

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

von Skua C. (skua)


Lesenswert?

Im Prinzip richtig gedacht aber mit 20kHz Timer wird das nix mit 1Hz 
Schritten bis 20kHz.
fMax = 10 kHz
1Hz Schritte Rechne noch mal nach.

von MaBu (Gast)


Lesenswert?

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?

von Skua C. (skua)


Lesenswert?

Wenn du dir mal die Zeiten anschaust die du machen kannst
50uS 20kHz
100uS 10kHz
150uS 6,6kHz


40kHz timer = 200 befehle pro zyklus.

von Jadeclaw D. (jadeclaw)


Lesenswert?

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.

von eProfi (Gast)


Lesenswert?

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.

von MaBu (Gast)


Lesenswert?

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.

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.