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
elseif(waveform==SAW){
9
PORTA=pgm_read_byte(&saw_table[t]);
10
}
11
elseif(waveform==TRIANGLE){
12
PORTA=pgm_read_byte(&triangle_table[t]);
13
}
14
elseif(waveform==PULSE){
15
PORTA=pgm_read_byte(&pulse_table[t]);
16
}
17
elseif(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
constuint8_tsaw_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?
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
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.
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.
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.
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.
> 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.
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.
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.
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.
> 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!
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.