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
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.
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?
Wenn du dir mal die Zeiten anschaust die du machen kannst 50uS 20kHz 100uS 10kHz 150uS 6,6kHz 40kHz timer = 200 befehle pro zyklus.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.