Probleme mit R2R Wandler an ATMega32

#2391979
Lesenswert?

Hallo zusammen,

für gewöhnlich bin ich ja der Softwerker, habe aber jetzt vermutlich ein 
Hardwareproblem.

Ich bastle gerade an einem Funktionsgenerator. Ich habe diesen 
weitestgehend nach dem DDS-Generator, der hier im Artikelbereich 
vorgestellt wird, aufgebaut. Zunächst habe ich das mit einem ATMega8 
gemacht. Da ich aber noch ein Display brauche, sowie diverse Taster, 
habe ich jetzt einen ATMega32 genommen. (Siehe Anhang)

Der Witz an der Sache ist, das nun das Signal am R2R Ausgang schon 
kaputt ist, sprich wenn ich z.B. einen Array für einen Sägezahn am PORTA 
ausgebe, gehen die Werte nicht, wie zu erwarten, stetig Stufe für Stufe 
nach oben, sondern zwischendurch auch mal ein kleines Stück runter. So 
sieht das ganze zwar ungefähr wie ein Sägezahn aus, aber eben etwas 
"hoppelig". das Gleiche bei allen anderen Wellenformen. Ich hoffe Ihr 
versteht, was ich meine. Leider kann ich auf meinem alten Hameg keinen 
Screenshot machen. ;)

Der Witz ist: Auf dem ATMega8 war das Signal wie erwartet und nach dem 
Bessel Filter auch völlig sauber. Es hat alles einwandfrei funktioniert. 
Bei beiden habe ich einen 16MHz Quarz verwendet und die Fuses auch 
entsprechend gesetzt.

Ich erzeuge die Ausgabe in der ISR für den TIMER1 ungefähr so:
1
ISR(TIMER1_OVF_vect) {
2

3
  preloadTimer();
4

5
  if (waveform == SINE) {
6
    PORTA = pgm_read_byte(&sine_table[t]);
7
  }
8
  else if (waveform == SAW) {
9
    PORTA = pgm_read_byte(&saw_table[t]);
10
  }
11
  else if (waveform == TRIANGLE) {
12
    PORTA = pgm_read_byte(&triangle_table[t]);
13
  }
14
  else if (waveform == PULSE) {
15
    PORTA = pgm_read_byte(&pulse_table[t]);
16
  }
17
  else if (waveform == RANDOM) {
18
    PORTA = pgm_read_byte(&random_table[t]);
19
  }
20

21
  t+=interval;
22

23
}

Die Tabelle für den Sägezahn schaut dann ungefähr so aus (gekürzt)
1
const uint8_t saw_table[256] PROGMEM = {
2
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
3
  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
4
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
5
  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
6
  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
7
  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
8
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
9
        ...

Hat jemand eine Idee, an was das liegen könnte? hab ich irgendwas 
übersehen, was am ATMega32 anders ist?
Angehängte Dateien:
#2392035
Lesenswert?

Die Widerstände sind alle mit 0.5% Toleranz. Das Signal war ja wie 
gesagt mit dem ATMega8 ganz sauber, was ja auch das Seltsame an der 
Sache ist.

Ich habe jetzt eure Änderungsvorschläge umgesetzt, es ist zwar etwas 
besser geworden, aber sauber ist es leider immer noch nicht.

> 1. Hier hängen diverse Vcc- und GND-Anschlüsse in der Luft.

Die sind alle an +5V bzw. -5V angeschlossen müsste ich das anders 
zeichnen, damit es schaltplantechnisch stimmt?

> Miss erst mal am Ausgang des R-2R, und mach bis es da gut ist.

Ich hab jetzt alles nach dem R2R ersteinmal aussen vor gelassen. Ich 
bekomme trotzdem kein sauberes "Treppenstufensignal" hin.

> Und der LF356 ist kein R/R OpAmp.

Kannst Du mir genauer erklären warum?

Danke für eure Mühe.
Gast #2392045
Lesenswert?

Matthias P. schrieb:
> Ich hab jetzt alles nach dem R2R ersteinmal aussen vor gelassen. Ich
> bekomme trotzdem kein sauberes "Treppenstufensignal" hin.

Hast du dir auch die Rechtecksignale direkt an den Portausgängen 
angesehen?

Mit R18 (100kΩ) belastest du das R2R Netzwerk noch recht kräftig. IMHO 
ist es besser, den ersten OP als Elektrometerverstärker zu schalten.
#2392057
Lesenswert?

> Hast du dir auch die Rechtecksignale direkt an den Portausgängen angesehen?

Ja, ich habe irgendwie den Eindruck, daß die auch unsauber sind, was ich 
noch weniger verstehe. Ich hatte schon einen anderen ATMega32 versucht, 
weil ich den Verdacht hatte, daß einer kaputt ist, was nicht der Fall 
war.

Ich denke, ich sollte diese Lösung aufgeben und entweder einen AD9833 
nehmen oder mir einen fertigen Funktionsgenerator nehmen. Schade.

Wobei mir immer noch nicht klar ist, warum das mit dem ATMega8 
funktioniert hat.

Trotzdem Danke für eure Hilfe.
Gast #2392059
Lesenswert?

Matthias schrieb:
> Mit R18 (100kΩ) belastest du das R2R Netzwerk noch recht kräftig. IMHO
> ist es besser, den ersten OP als Elektrometerverstärker zu schalten.

Man könnte auch einfach R18 z.B. auf 470kΩ vergrößern und, um dem 
Rail-to-Rail Problem erstmal aus dem Weg zu gehen, R19 nur auf 220kΩ 
vergrößern, falls nicht unbedingt die volle Amplitude erforderlich ist.
#2392072
Lesenswert?

Matthias P. schrieb:
>> Hast du dir auch die Rechtecksignale direkt an den Portausgängen angesehen?
>
> Ja, ich habe irgendwie den Eindruck, daß die auch unsauber sind, was ich
> noch weniger verstehe. Ich hatte schon einen anderen ATMega32 versucht,
> weil ich den Verdacht hatte, daß einer kaputt ist, was nicht der Fall
> war.

Versuch doch mal einen Buffer (74HC245,74HC541) zwischen Atmega und 
Laddernetwork zu schalten. Damit koenntest du die Ausgaenge sauber 
bekommen.
#2392116
Lesenswert?

Matthias schrieb:
> Mit R18 (100kΩ) belastest du das R2R Netzwerk noch recht kräftig.

Das dürfte aber nichts ausmachen, solange die Spannungen an den Portpins 
nicht zusammenbrechen. Einer der großen Vorteile des R2R-Netzwerks ist 
der konstante (d. h. von der Ausgangsspannung unabhängige) 
Innenwiderstand. In diesem Fall kann man sich diesen Innenwiderstand 
einfach in Reihe mit dem 100-kOhm-Widerstand denken, die 
Ausgangsspannung des ersten OP (idealer Rail-To-Rail-OP vorausgesetzt) 
geht also nicht von 0 bis -VCC, sondern von 0 bis -VCC*100kOhm/110kOhm. 
Der Einfluss ist zwar da, aber konstant.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren