Hallo,
ich möchte mit einem ATTiny25 einen einfachen Funktionsgenerator
realisieren, als Mittel der Wahl habe ich DDS ins Auge gefaßt.
Aktuell sieht meine DAC wandlung via PWM so aus:
1 | ISR(TIM1_COMPA_vect)
|
2 | {
|
3 | static uint8_t i;
|
4 | static uint8_t sprungweite;
|
5 | sprungweite = (uint8_t)ADCWert[FREQUENZ]*256/PLLCLOCK;
|
6 | switch(ADCWert[SIGNALART])
|
7 | {
|
8 | case SINUS:OCR1A=pgm_read_byte(&sinetable[i+sprungweite]);
|
9 | break;
|
10 | case RECHTECK:OCR1A=pgm_read_byte(&squaretable[i+sprungweite]);
|
11 | break;
|
12 | case SAEGEZAHN:OCR1A=pgm_read_byte(&sawtoothtable[i+sprungweite]);
|
13 | break;
|
14 | case DREIECK:OCR1A=pgm_read_byte(&triangletable[i+sprungweite]);
|
15 | break;
|
16 | }
|
17 | i++;
|
18 | }
|
Soweit ich DDS verstanden habe läßt sich meine Ausgabefrequenz wie in
der ISR berechnen, doch will ich auch die Amplitude digital aus den
Lookuptables erzeugen.
Genau hier stehe ich auf dem Schlauch, meines Verständnisses nach muß
ich nun noch zusätzlich einen Offset addieren, um einen geringeren Wert
aus der Tabelle zu lesen, 0 wäre dann volle Amplitude.
Wie berechne ich das jetzt ohne die Frequenz ebenfalls zu ändern ?
Oder habe ich mich total vertan ?
Danke !