Forum: Mikrocontroller und Digitale Elektronik Probleme mit R2R Wandler an ATMega32


von Matthias P. (matthias_p65)


Angehängte Dateien:

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?

von Edi R. (edi_r)


Lesenswert?

Der Widerstand ganz unten (ich glaube R17, ist schlecht zu erkennen), 
der auf GND geht, muss auch 2R sein, also 20 kOhm.

von Purzel H. (hacky)


Lesenswert?

Und der LF356 ist kein R/R OpAmp. Miss erst mal am Ausgang des R-2R, und 
mach bis es da gut ist.
Ein AD9833 waere die bessere Wahl gewesen.

von Bernhard R. (barnyhh)


Lesenswert?

1. Hier hängen diverse Vcc- und GND-Anschlüsse in der Luft.
2. AREF sollte beschaltet sein.
3. Bei 8 Bit Auflösung sollten die Widerstände eng toleriert sein (eher 
"besser" als 1%).
4. R17 stimmt wohl nicht (s.o.).

Bernhard

von Matthias P. (matthias_p65)


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.

von Matthias (Gast)


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.

von Purzel H. (hacky)


Lesenswert?

Der LF356 kann nur bis Vcc-2V oder so am ausgang gehen, resp von Vss+2V 
an hoch. Da der R2R an Vcc haengt ist der halbe Berich schon nicht mehr 
erhaeltlich. Nimm einen RR-OpAmp, zB einen AD 8602A, oder so. Er muss 
RR-IO sein.

von Helmut L. (helmi1)


Lesenswert?

Mess doch mal die Ports vom Atmega direkt mit dem Skope ob die alle 
sauber gegen GND und +5V schalten. Nicht das da ein Ausreiser drin ist.

Matthias P. schrieb:
>> Und der LF356 ist kein R/R OpAmp.
>
> Kannst Du mir genauer erklären warum?

Der kann nicht bis an die Versorgungsspannung seinen Ausgang ansteueren. 
Da bleiben immer ein paar V stehen.

von Matthias P. (matthias_p65)


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.

von holger (Gast)


Lesenswert?

AVCC und AGND sind nicht angeschlossen.

von Matthias (Gast)


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.

von Purzel H. (hacky)


Lesenswert?

Das korekte Verhalten eines OpAmp kann man messen. Der (+) und der (-) 
Eingang muessen identisch sein. Wenn das nicht der Fall ist, klebt der 
Ausgang er an der Speisung und nicht da wo er sein sollte.

von Helmut L. (helmi1)


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.

von Matthias P. (matthias_p65)


Lesenswert?

> AVCC und AGND sind nicht angeschlossen.

You made my Day!!!

AGND anzuschliessen hat das Problem behoben!

Ich war schon fast ein wenig frustriert, aber jetzt ist es ganz sauber.

Geilomat! Danke sehr!

von Matthias P. (matthias_p65)


Lesenswert?

Nachtrag: Es war der nicht angeschlossene AVCC Pin.

von Edi R. (edi_r)


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.

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.