Hallo,
ich möchte einen Signal mit dem dds Verfahren auf meinem ATmega32
ausgeben.
Jetzt habe ich hier im Forum folgende Formel zur Bestimmung des
Additionswertes (Tabellenzähler):
1 | Additionswert = Ausgabefrequenz * Auflösung Tabellenzähler * Nachladewert_Timer / F_CPU
|
Nutze ich einen 16Bit Tabellenzähler
1 | //Timer ISR
|
2 | Tabellenzaehler+=Additionswert;
|
3 | //Auf Tabellenlänge 2048
|
4 | OFFSET= STEP / 32;
|
5 | OCR1BL=pgm_read_byte(&signal[OFFSET]);
|
funktioniert alles einwandfrei. Ich bekomme das Signal mit relativ
genauer Frequenz ausgegeben.
Nun möchte ich aber einen 32Bit Tabellenzähler nutzen um die Auflösung
der Wunschfrequenz zu erhöhen.
Wenn ich die oben angegebene Formel benutze und folgendes Rechne:
1 | (50 * 0xFFFFFFFF * 256)/16000000UL)
|
komme ich auf einen Wert (Taschenrechner) von: 3435974
Soweit so gut
Tabellenzähler deklariere ich jetzt als uint32_t und den Additionswert
habe ich zum Test als Konstante mit dem Ausgerechneten Additionswert
festgelegt.
Die ISR sieht so aus:
1 | //Timer ISR
|
2 | Tabellenzaehler+=3435974;
|
3 | //von 32 Bit auf Tabellenlänge 2048
|
4 | OFFSET= (uint16_t)(Tabellenzaehler / 2097152UL);
|
5 | OCR1BL=pgm_read_byte(&signal[OFFSET]);
|
Leider stimmt die Frequenz des Ausgegebenen Signals nicht mehr.
Jetzt habe ich den Additionswert mit zwei Tastern (Additionswert+=10
bzw. Additionswert-=10) einstellbar gemacht und den Additionswert bei
50Hz mit JTAG Debugger ermittelt. Der Wert liegt bei ~50Hz bei 4026386.
Eingesetzt in die ISR komme ich lässt sich das Ergebnis bestätigen.
Leute, kann mir jemand erklären wo mein (Denk)Fehler liegt ?
Bitte keine Diskussionen um das Konzept (Tabellenlänge, 32Bit
Tabellenzähler, etc.).
Danke
technikus