Forum: Mikrocontroller und Digitale Elektronik ADC-ATmega2560


von batty m. (battyman)


Lesenswert?

Tach an alle,

ich kämpfe immer noch mit meinem ADC des ATmega2560 und meiner 
Wechselspannungsmessbrücke.

Ich habe wie immer ein Verständnisproblem mit dem Datenblatt. Ich dachte 
bis dato, dass ich den MC keine negative Spannung aussetzen darf. Wenn 
ich das jetzt aber richtig gelesen habe kann ich über "Differential 
Channel" dies doch tun, ist das richtig?

Ich möchte folgendes tun:
- Signalkabel 1 mit AC
- Signalkabel 2 mit entgegengesetzter AC

beide AD-Eingaänge würden demnach eine sinusförmige Spannung (mit 
Durchgang durch den Nullpunkt) bekommen. Diese möchte ich wandeln  und 
dann gegeneinander verrechnen.

Mein Problem ist derzeitig, dass ich nicht so genau weiß, wie ich das 
Sinussignal in den MC bekomme ohne diesen zu zerstören???

Kann mir bitte einer dabei auf die Sprünge helfen bzw. das anders als im 
DS erklären?

Vielen lieben Dank

von Georg G. (df2au)


Lesenswert?

Im Datenblatt findest du unter "absolute Grenzen", dass kein Pin mehr 
als wenige Millivolt negativer als GND sein darf.

Ein Sinussignal koppelt man über einen Kondensator auf den Eingangspin 
und legt den Pin mittels zweier Widerstände gleichspannungsmässig auf 
die Mitte zwischen VCC und GND.

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> Im Datenblatt findest du unter "absolute Grenzen", dass kein Pin mehr
> als wenige Millivolt negativer als GND sein darf.
also ist das doch richtig, wie ich es als normal verstanden habe. Dachte 
nur jetzt das es mittlerweile erweiterte Funktionen bzw. Beschaltung 
möglich sind , um doch ein solches Signal direkt einspeisen zu können.

> Ein Sinussignal koppelt man über einen Kondensator auf den Eingangspin
> und legt den Pin mittels zweier Widerstände gleichspannungsmässig auf
> die Mitte zwischen VCC und GND.
Wirkt denn der zwischen geschaltete Kondensator nicht als Widerstand??? 
Ich habe doch eine Wechselspannung anliegen, wodurch das zur Impedanz 
wird. Mit den ohmschen Widerständen bastel ich mir doch ein 
Hochpassfilter zusammen und hau mir tiefe Frquenzen raus. Mein 
Sinussignal läuft derzeitig mit 1,9kHz.
Weiterhin, hat doch diese Einbindung auch einen Einfluss auf die davor 
geschaltete Messbrücke (in der auch Kondensatoren enthalten sind), 
wodurch ich mir an dieser Stelle die Messung versaue, ist doch richtig 
oder???

von batty m. (battyman)


Lesenswert?

So nach dem Duschenn kann man auch wieder besser denken  ;-) denn wenn 
der Dreck von den Füssen läuft rutsch so einiges runter.

Georg G. schrieb:
> Im Datenblatt findest du unter "absolute Grenzen", dass kein Pin mehr
> als wenige Millivolt negativer als GND sein darf.
also ist das doch richtig, wie ich es als normal verstanden habe. Dachte
nur jetzt das es mittlerweile erweiterte Funktionen bzw. Beschaltung
möglich sind , um doch ein solches Signal direkt einspeisen zu können.

> Ein Sinussignal koppelt man über einen Kondensator auf den Eingangspin
> und legt den Pin mittels zweier Widerstände gleichspannungsmässig auf
> die Mitte zwischen VCC und GND.
Das mit dem Kondensator zwischen schalten:
Meine Sinusspannung kommt an den Kondensator an, lädt diesen mit 
(Tau=...) auf. Durch die negative Sinuswelle würde der Kondensator sich 
wieder entladen. Da die Zyklen durch die Frequenz der Sinusspannung 
nicht mehr erreicht werden, da zu schnell, wir der Kondensator zur 
Impedanz!!!

So, nun schalte ich aber über einen Widerstand nach Vcc und mittels 
einen Anderen an GND an.
Die positive Halbwelle kommt am Kondensator an und lädt diesen wieder. 
Danach kommt es wieder zur negativen Halbwelle, durch den Anschluss an 
Vcc wird diese jedoch am Kondensator ausgeglichen, wodurch die Ladung 
nicht abgegeben wird sondern eben gehalten. Soweit alles richtig???
Wozu jetzt aber noch einen an GND, hab ich denn einen Überschuss an 
posiiver Spannung die ich darüber ableiten möchte?
Ich gehe mal davon aus, dass die Auslegung des Spannungsteilers dann mit 
zwei gleichgroßen Widerständen ausgestattet wird, um den Teilungsfaktror 
1/2 zu bekommen, korrekt??? -> D.h., ein Spannungsteiler mit 
Signalanhebung auf 2,5V - arichtig??

1.) Nur wie und nach welcher Maßgabe lege ich eigentlich die Größen der 
Widerstände und des Kondensators fest?

2.) Und Beeinflusse ich meine Messbrücke durch die Zuageb von Vcc nicht 
doch??? Denn einen Rückfluss von Gleichspannung darf ich für meinen 
Messaufbau nicht haben!!! -> Elektrolyse von Flüssigkeiten ist schlecht!

Bitte um Hilfe. Oder korrektur meiner Gedankengänge bzw. Verständnisses

von Georg G. (df2au)


Lesenswert?

batty man schrieb:
> 1.) Nur wie und nach welcher Maßgabe lege ich eigentlich die Größen der
> Widerstände und des Kondensators fest?
Der AD hat einen Eingangswiderstand in der Größenordnung Megaohm. Wenn 
du also zwei Widerstände mit je 100kOhm nimmst, wird die Mitte 
hinreichend genau getroffen. Der Eingangswiderstand des Gebildes ist 
dann etwa 50kOhm. Mit einem Kondensator von 22nF hast du bei 2kHz einen 
Fehler im Bereich Promille. Genauer ist dein AD auch nicht. Nimm 100nF, 
die sind in jeder Bastelkiste und es passt.

> 2.) Und Beeinflusse ich meine Messbrücke durch die Zuageb von Vcc nicht
> doch??? Denn einen Rückfluss von Gleichspannung darf ich für meinen
> Messaufbau nicht haben!!!
Deine Messbrücke sieht keine Gleichspannung. Wie soll die auch über den 
Kondensator kommen?

Es wäre hilfreich, wenn du ein Schaltbild zeigen würdest.

Wenn du jegliche Rückwirkung vermeiden möchtest, bleibt dir nur ein 
OpAmp zwischen Brücke und AD. Dessen Auslegung ist aber auch nicht 
trivial und bringt dir auch Fehler in die Messung. Fang klein an und 
sieh, was herauskommt. Daraus lernst du und kannst es dann verbessern.

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> Der AD hat einen Eingangswiderstand in der Größenordnung Megaohm. Wenn
> du also zwei Widerstände mit je 100kOhm nimmst, wird die Mitte
> hinreichend genau getroffen. Der Eingangswiderstand des Gebildes ist
> dann etwa 50kOhm. Mit einem Kondensator von 22nF hast du bei 2kHz einen
> Fehler im Bereich Promille. Genauer ist dein AD auch nicht. Nimm 100nF,
> die sind in jeder Bastelkiste und es passt.

Kann ich auch anstatt der 100kOhm an der Stelle 1MOhm verwenden oder ist 
dies eher kontraproduktiv? Wenn 22nF besser sind kann ich auch die 
benutzen, das ist nicht das Problem

von Georg G. (df2au)


Lesenswert?

Auch das geht. Die Fehler, die du da einbaust, gehen im Rauschen unter 
(aus deinen Fragen schliesse ich nämlich, dass dir die Erfahrung mit 
ADCs fehlt. Und da lernt man nur unter Schmerzen durch eigene Erfahrung. 
Das Layout und die Masseführung sind wichtig, die Entkopplung der 
Referenz...)
Viel Erfolg!

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:

> ...Erfahrung mit
> ADCs fehlt. Und da lernt man nur unter Schmerzen durch eigene Erfahrung.
> Das Layout und die Masseführung sind wichtig, die Entkopplung der
> Referenz...)

Jup, die fehlt mir leider. Also ich würde mal so behaupten dass ich 
vieles mittlerweile dazu gelernt habe, gerade im Bezug auf Elektronik 
und Schaltungstechnik. Leider reicht das anscheinend noch lange nicht. 
Das mit dem Layout und Masse habe ich schon mitbekommen, denn das ist 
meine 4 Messbrücke die ich gebaut habe und die zum ersten Mal auch einen 
funktionalen AC-Abgleich herstellt. Das mit dem Lernen durch Erfahrung 
ist super, deswegene mache ich das ja auch alles, leider habe ich nur 
nicht mehr so viel Zeit mein Projekt zu bearbeiten. Wusste nicht das 
dies so heftig wird.  :-(

Aber vielen Dank, ich probier alles aus und speicher ab was ich sehe und 
versuch zu verstehen warum dem so ist. Ich habe voll die Masseprobleme 
und weiß auch nicht woher und an welcher Stelle ich mist baue. Alles 
echt nicht so einfach.

von M. K. (sylaina)


Lesenswert?

batty man schrieb:
> Alles
> echt nicht so einfach.

Schaltbilder und Bilder vom Aufbau können uns helfen dir Tipps zu geben 
wo du den Bock schießt aber so ganz ohne Bilder…meine Glaskugel läuft 
immer noch nicht zuverlässig.

von batty m. (battyman)


Angehängte Dateien:

Lesenswert?

So das Bild wäre mein derzeitiger Schaltungsaufbau (nach Hinweis von 
Georg G), wobei Cx mein zu bestimmender Kondensator ist. Der 
Brückenabgleich (4nF zu 4nF) ist möglich, sofern ich mit einem 
Multimeter an den zwei Brückenpins messe. Benutzte Frequenz liegt dabei 
um die 1,9kHz. Maximaler AC-Effektiv-Wert beträgt 3,9V (bei ca. 0,766nF 
zu 4nF).

Dazu ist die gesamte Verdrahtung aus Coax bestehend. Das Signal leite 
ich durch die Adern. Die Metallhülle ist an allen Seiten (rechte und 
linke Ende) mit den anderen Verbunden und zusammen auf Masse gelegt.


Nun nach den Tipp habe ich mein Gleichrichter entfernt und anschließend 
mit einem 100nF Kondensator mit hinterliegenden Spannungsteiler 
erweitert.

Zum Messen habe ich nun aus einem Labornetzteil +5V als Vcc und GND 
entsprechend der Zeichnung angeschlossen. Mein Brückeneingangssignal 
kommt von einem Funktionsgenerator mit eben 1,9kHz. Die Pins für den 
ADC0 und ADC1 habe ich an Messspitzen zum Oszi. GND der Messspitzen an 
GND-Seite vom Spannungsteiler.
Heraus kommen zwei schöne sinusförmige Wellen mit einem positiven Offset 
von DC = 2,5V. Verrechne ich nun am Oszi die Werte so kommt für "Math" = 
3,04V eff. raus und liegt ein wenig unterhalb zum Brückenpin gesehen, 
aber im zu erwartenden Bereich.

-> Eigentlichschon mal voll freu und bisher das beste Messergebnis. :-D
Ein ganzen Großen Dank an dieser Stelle!!! THX

Neu aufkeimende Fragen durch Schaltungsänderung:
Nun muss ich doch zwei AD-Eingänge nutzen und habe zu dem noch den 
Wechselspannungsanteil drauf, den es ja auch auszuwerten gilt.
Wie kann ich denn nun die zwei Kanäle geeignet auslesen, so dass dies 
immer zum selben Zeitpunkt geschieht??? Muss ja dann Kanal1 minus Kanal2 
(bzw. ADC-Wert1 minus ADC-Wert2) rechenen. Dazu muss das doch auch alles 
zeitlich passen, auch wenn ich natürlich im Vorfeld das Abtasttheorem 
beachte und im Bereich mit ca 4kHz eine Wandlung machen muss???

von holger (Gast)


Lesenswert?

>Nun muss ich doch zwei AD-Eingänge nutzen

Warum? Wahrscheinlich habe ich den Grund überlesen.

>Wie kann ich denn nun die zwei Kanäle geeignet auslesen, so dass dies
>immer zum selben Zeitpunkt geschieht?

Das geht gar nicht weil es nur einen ADC gibt. Die Messungen
passieren nacheinander mit umschalten des Multiplexers.

Vieleicht ist ein uC mit echten zwei ADCs die bessere Wahl für dich.

von batty m. (battyman)


Lesenswert?

holger schrieb:

> Das geht gar nicht weil es nur einen ADC gibt. Die Messungen
> passieren nacheinander mit umschalten des Multiplexers.
>
> Vieleicht ist ein uC mit echten zwei ADCs die bessere Wahl für dich.
genau da liegt ja mein Problem. Ich muss beide Brückenleitungen 
auswerten, um mein echtes Potential zu kennen. Ich habe nur den einen MC 
und es ist auch nicht mehr machbar einen anderen eventuell geeigneteren 
zu beschaffen.
Das ich beide nicht zur gleichen Zeit wandeln kann ist mir ja bewusst 
und deswegen frage ich wie es hier so die könner anstellen würden um 
solch ein Problem wie meines zu bewerkstelliegen???

Also ich sehe die Probleme in den Startzeitpunkt, der Wandlungstakte und 
der verwendeten Frequenz, da für ein Brückenabgleich auch die 
Eingangsfrequenz geändert werden muss, wodurch es dann natürlich auch zu 
Zeitverschiebungen bei der Wandlung kommt. Durch das Sinussignal ist 
auch die Approximation wahrscheinlich nicht in nur standard 13 takten 
gemacht.

Ich stell mir das so vor, dass ich den ADC-Eingang auf eine Steigende 
Flanke triggern müsste und dann bei 512 starten würde (DC-Offset bei 
2,5V) wenn die Wandlung in immer gleichen Wandlungstakten von statten 
gehen würde könnte ich ja anschießend den AD-Eingang wechseln und 
gleiches von vorne tun. Anschließend würde ich die entstandenen 
ADC-Werte gegeneinander verrechnen und kann mit den folgenden Aufgaben 
weiter machen.

Kann man das so realiseren oder gäbe es einen besseren Weg???

von Georg G. (df2au)


Lesenswert?

Der ADC tastet das Signal unmittelbar vor der Wandlung ab und hält es 
intern in einem Kondensator für die Dauer der Wandlung fest. Die 
Kurvenform der Spannung am Eingang hat keinen Einfluss auf das Ergebnis.

Mit MUX5:0 auf 010000 macht der ADC automatisch eine Differenzmessung 
zwischen ADC0 und ADC1. Wo ist dann das Problem?

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> Der ADC tastet das Signal unmittelbar vor der Wandlung ab und hält es
> intern in einem Kondensator für die Dauer der Wandlung fest. Die
> Kurvenform der Spannung am Eingang hat keinen Einfluss auf das Ergebnis.
Heißt also für mich, dass er den Eingang für eine bestimmte Zeit öffnet 
und das ankommende Signal auf den internen Kondensator geht, wobei der 
Spannungs-Effektivwert dabei ausschlaggebend ist - richtig?? Das heißt 
der ist für mehr als nur ein Wellenabschnitt offen??? - Sorry nur wenn 
ich es schon lerne dann würde ich es auch gern verstehen, da es die 
Gehversuche mit der AD-Wandlung sind.  ;-)

> Mit MUX5:0 auf 010000 macht der ADC automatisch eine Differenzmessung
> zwischen ADC0 und ADC1. Wo ist dann das Problem?
In meinem Verständnis was ich vor mir habe (Signal, Anzahl etc.) und das 
nicht genau Wissen, was der MC eben alles so kann, auch wenn ich das 
Datenblatt schon des Öfteren gelesen habe. (-> für mich als Einsteiger 
und ohne jegliche Elekronikerfahrung, Chemielaborant, ist das wie 
Gesetzestexte lesen und am Ende doch nichts verstanden)

Danke für eure Geduld für meine einfachen Fragen

von Georg G. (df2au)


Lesenswert?

Suche im Datenblatt nach "Analog Input Circuitry". Dort findest du ein 
Prinzipschaltbild des Eingangs.

Bei deiner Differenzmessung wird analog die Differenz zwischen z.B. ADC0 
und ADC1 gebildet. Das Ergebnis bekommst du als Zahl mit Vorzeichen im 
Bereich von -512 bis +511.

Die Wandlung beginnt damit, dass das Differenzsignal für etwa 2 
Taktzyklen auf den Haltekondensator durchgeschaltet wird. Das ist aber 
nicht der Effektivwert sondern der Momentanwert!

Da deine Brücke eine Wechselspannung ausgibt, reicht es nicht, nur eine 
Wandlung zu machen. Mit etwas Pech erwischt du gerade den Nulldurchgang. 
Also viele Messungen und den Maximalwert nehmen (denn du willst ja auf 
Minimum abgleichen).

Wenn dir die 10Bit Auflösung nicht ausreichen, kannst du über MUX5:0 
auch noch einen Verstärker (bis 200x) vorschalten.

Das Datenblatt solltest du auf jeden Fall im Bereich ADC durchlesen, 
drüber schlafen und dann noch einmal lesen.

"Wo ist das Problem" war scherzhaft gemeint. Das geht allen so. Sobald 
man weiß, wie es funktioniert, versteht man auch das Datenblatt :-)

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:

> Bei deiner Differenzmessung wird analog die Differenz zwischen z.B. ADC0
> und ADC1 gebildet. Das Ergebnis bekommst du als Zahl mit Vorzeichen im
> Bereich von -512 bis +511.
D.h., dass mein Offset von DC = 2,5V mit AC-Nulldurchgang den ADC-Wert 0 
ergibt, denn:
Jegliche Auslenkung meiner AC-Differenz bildet nun den entsprechenden 
ADC-Wert, der auf 5V Vref umgerechnet wird
Wenn ich das jetzt richtig sehe, darf meine AC-Maximum keine 2,5V 
übersteigen, denn:
 und ist somit am Vcc angelangt. Korrekt, oder ist das bei 
Differenzmessung mit dem Übersteigen des VRef an dieser Stelle nicht 
relevant??? Wäre ja wichig zu wissen, damit ich die 
Brückeneingangsspannung dann darauf anpasse. Ich glaube jetzt muss ich 
nochmal in mich gehen. Habe das Gefühl ich bring kurzeitig mal alles 
durcheinander, sorry.

> Die Wandlung beginnt damit, dass das Differenzsignal für etwa 2
> Taktzyklen auf den Haltekondensator durchgeschaltet wird. Das ist aber
> nicht der Effektivwert sondern der Momentanwert!
>
> Da deine Brücke eine Wechselspannung ausgibt, reicht es nicht, nur eine
> Wandlung zu machen. Mit etwas Pech erwischt du gerade den Nulldurchgang.
> Also viele Messungen und den Maximalwert nehmen (denn du willst ja auf
> Minimum abgleichen).
Das meinte ich ja. Also das ich mir genau diesen zufälligen Reinfall mit 
erkennender Flanke und dann Wandlungsstart entgegnen wollte.
Ich hätte nun 100 Messungen durchgeführt und daraus eben den Mittelwert 
gebildet.

> Wenn dir die 10Bit Auflösung nicht ausreichen, kannst du über MUX5:0
> auch noch einen Verstärker (bis 200x) vorschalten.
Ok, nur was verrät mir dieser Zusatz im Datenblatt bei der Benutzung von 
MUX5:0??
"To reach the given accuracy, 10× or 200× Gain should not be used for 
operating voltage below 2.7V." -> meine Messspannung kann doch unterhalb 
von 2,7V liegen (bzw. tut sie ja auch wenn die Differenz gegen Null 
geht), warum sollte ich genau dort die Verstärkung nicht nutzen - also 
in wie fern wird denn die Genauigkeit schlechter? Um den Faktor 10 bzw. 
200?

von batty m. (battyman)


Lesenswert?

Ok, ich habe wieder ein wenig mit meinem Board geforscht.

Also mein ADC-Projekt habe ich jetzt so abgewandelt, dass ich aus einer 
internen RefSp von 2,56V auf 5V hochgezogen habe. Weiterhin habe ich 
meinen Teiler von 1024 auf auf 512 runterskaliert um auf meinem Text-LCD 
gleich von Digitalwert auf Spannung zurückrechnen und anzeigen lasse.

Vorversuch für Erstüberprüfung:
- Labornetzteil mit zwei Gleichspannungsausgängen
- +Ausgang1 an ADC0 und +Ausgang2 an ADC1 mit zusammengekoppelter Masse 
für gleichen Bezugspunkt
- Am MC zwischen ARef und GND liegen exakt 4,979V an
- aktivieren des ADC
- starten des ADC
- warten bis ADC fertig
- mach das 100mal, addiere auf und teil anschließend
- Wertumrechnung und Ausgabe LCD

-> So lange +Ausgang1 größer-gleich +Ausgang2 ist, ist alles super 
funktional und reagiert sofort auf kleine Änderungen, wobei meine 
Anzeigeauflösung nun von damals 2mV auf jetzt ca 10mV verschlechtert 
ist, aber egal das ist eben erstmal so - viel wichtiger das es mit der 
Differenzmessung funktioniert.
Heißt, dass bei Differnz von Null auch 0V auf meiner Anzeige erscheint. 
Wird die Differnz pos. größer, so erhöht sich der Anzeigewert von 0 auf 
maximal 5V, je nach Spannungsgrößen.

-> ist jedoch der +Ausgang2 größer (negativer Differnz- ADC-Wert) zeigt 
mir mein Display kein Vorzeichen mit an und zählt lustig von '10' (erst 
Null und dann 9,9..) wieder abwärts. D.h., dass bei immer größer 
werdender Neg.-Diff der Anzeigewert von 9,9.. in Richtung 0 kleiner 
wird. Eigentlich müsste der Wert doch minusbehaftet von Null weggehend 
werden???

Meine Deklarationen habe ich alle von unsigned auf signed abgeändert. 
Ich denke mal ich habe das Problem der Wert-Justage ob rechts oder 
linksbündig, wobei ich diesen Sachverhalt noch nicht genau verstanden 
habe.

Ich habe exktra mal die Zeile
1
ADMUX = (1<<REFS0);
um
1
ADMUX = (1<<REFS0) | (1<<ADLAR);
erweitert, jedoch kamm dann auch für den positiven 
Differenz-Spannungs-Fall nur Mist heraus, wodurch ich diese wieder 
rückgängig gemacht habe. Was habe ich nicht beachtet?

THX

von c-hater (Gast)


Lesenswert?

batty man schrieb:

> Ok, nur was verrät mir dieser Zusatz im Datenblatt bei der Benutzung von
> MUX5:0??
> "To reach the given accuracy, 10× or 200× Gain should not be used for
> operating voltage below 2.7V." -> meine Messspannung kann doch unterhalb
> von 2,7V liegen

OMG

"operating voltage" != "measure voltage"

Kauf' dir ein Wörterbuch...

von Georg G. (df2au)


Lesenswert?

Deine Rechnungen bezüglich Differenzbildung und Maximalwert waren 
richtig. Und du hast auch richtig erkannt, dass niemals und nirgends 
Vref (VCC in deinem Fall) überschritten werden darf.

Die Ausgaben deines Versuchs mit dem Labornetzgerät deuten für mich erst 
einmal auf einen Fehler in der Software hin. Zeig uns das Programm, dann 
geht es einfacher.

von spess53 (Gast)


Lesenswert?

Hi

>Also mein ADC-Projekt habe ich jetzt so abgewandelt, dass ich aus einer
>internen RefSp von 2,56V auf 5V hochgezogen habe.

Bei differentieller Messung gilt

                                  min                max
VREF     Reference Voltage        2.7             AVCC - 0.5     V
                                                  ^^^^^^^^^^

MfG Spess

von batty m. (battyman)


Lesenswert?

Na dann ist ja erstmal mehr richtig gedacht wie ich selbst erwartet habe 
:-D
1
#include <avr/io.h>              
2
#include "lcd.h"                  
3
#define F_CPU 8000000UL                
4
#include <util/delay.h>        
5
#include <avr/interrupt.h>   
6
7
#define CHARS_PER_LINE  20   //Zeilenlänge des LC-Displays EA W204B-NLW 
8
#define RefSpannung    49789000          //Referenzspannung gemessen mit Multimeter "VOLTCRAFT VC 850"
mit
1
void ADC_Init(void)            // ADC0 = Port F - Pin 0 (BA:  ATmega2560)
2
{                              // ADC1 = Port F - Pin 1
3
  ADMUX = (1<<REFS0);  /* | (1<<ADLAR); */    //setzt die Referenzspannung als intern und mit AVcc = 5V
4
  ADCSRA = (1<<ADPS2) | (1<<ADPS1);  //Taktfrequ.-Teilungsfaktor (Prescaler Select) = 64 für f = 125 kHz
5
  ADCSRA |= (1<<ADEN);               //aktiviert den AD-Wandler
6
  ADCSRA |= (1<<ADSC);               //startet die AD-Wandlung
7
  
8
  while (ADCSRA & (1<<ADSC))  {      //wartet auf Beendigung der Wandlung
9
  }
10
  
11
  (void)ADCW;                        //im Register abgelegter ADC-Wert
12
}
13
14
int16_t ADC_Read(uint8_t channel)    //AD-Wandlung - Einzelmessung
15
{                            //Kanal 16 für Differenzmessung ADC0 minus ADC1
16
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);      //Wahl des Kanals - Maskierung der 5 Mux-Bits
17
  ADCSRA |= (1<<ADSC);                  //startet die AD-Wandlung
18
  while (ADCSRA & (1<<ADSC))  {              //wartet auf Beendigung der Wandlung
19
  }
20
  return ADCW;                      //AD-Wandler auslesen und ausgeben
21
}
22
23
int16_t ADC_Read_Avg(uint16_t channel, uint16_t nsamples)  //AD-Wandlung - Mehrfachmessung mit Mittelwert (engl. Average)
24
{                              //Kanal 16 für Differenzmessung ADC0 minus ADC1
25
  int32_t sum = 0;                    //32-Bit Variable für Summe
26
  for (uint16_t i = 0; i < nsamples; i++)          //von 0 bis Anzahl der Messung
27
  {
28
    sum += ADC_Read(channel);              //Aufaddierung der Einzelmessungen
29
  }
30
  return (uint16_t)(sum / nsamples);            //Ausgabe des Mittelwertes
31
}
und
1
int main(void)
2
{
3
  char Puffer[6];                  //Zwischenspeichervariable für Integer To ASCII Umwandlung
4
  ADC_Init();
5
        while (1)              //durchläuft die Anweisungen so lange Brückenspannung ungleich Null ist
6
        {
7
          adcval = ADC_Read_Avg(16, 100);      //Mittelwertübergabe aus 100 Diff.-Einzelmessungen - Kanal 16
8
        
9
          Spannung = (RefSpannung/512)*adcval;  //Ref.-Sp. [µV] (plus Kommastelle zum Runden) durch Auflösung mal aktueller ADC-Wert
10
          Spannung = Spannung + 55555;      //Rundung auf die volle mV-Stelle
11
                              //Kommastelle >5 wird plus 1, <5 bleibt unverändert
12
          my_itoa(Spannung, Puffer);        //Übergabe des Ist-Spannungswertes zum String-Umwandler
13
          LCD_Ausgabe(Puffer,0,2,3);        //Spannungswert-Ausgabe mit Komma an der 2.Stelle [V] und drei Nachkommastellen [mV]
14
          lcd_string(" V");            //Einheitsangabe
15
          _delay_ms(200);
16
          lcd_setcursor(0,0);            //setzt Curser an die erste Stelle um den neuen Wert zu überschreiben
17
        }
18
}

von Georg G. (df2au)


Lesenswert?

batty man schrieb:
> return (uint16_t)(sum / nsamples);            //Ausgabe des Mittelwertes

Hier ist der Wert plötzlich wieder unsigned?

Und denk bitte daran, dass der Compiler mit "Integer" rechnet, wenn es 
nicht anders vereinbart ist (z.B. beide Produktterme sind Long). 
Stichwort "implizite Typumwandlung".

Lass doch im ersten Versuch die Umwandlung in Volt weg. Schreib dir die 
ADC Rohwerte in ein Array und sieh es dir als Hex-Wert an.

: Bearbeitet durch User
von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> batty man schrieb:
>> return (uint16_t)(sum / nsamples);            //Ausgabe des Mittelwertes
> Hier ist der Wert plötzlich wieder unsigned?
Ah - danke, hatte ich noch übersehen. Ist abgeändert.

> Und denk bitte daran, dass der Compiler mit "Integer" rechnet, wenn es
> nicht anders vereinbart ist (z.B. beide Produktterme sind Long).
> Stichwort "implizite Typumwandlung".
Wieso sind beide Long?
1
int16_t ADC_Read_Avg(uint16_t channel, uint16_t nsamples) //uint16_t nsamples ist doch ein normaler Integer
2
3
int32_t sum = 0; //1xlong
2^32 ist zwar ein LONG, doch bei nur 100-facher Messung mit einem 
Max-ADCVAL-Wert von 512 im Bereich und wenn ich nun anschließend durch 
100 teile reicht doch die Um-Deklaration für ADC_Read_Avg mit int16_t.

> Lass doch im ersten Versuch die Umwandlung in Volt weg. Schreib dir die
> ADC Rohwerte in ein Array und sieh es dir als Hex-Wert an.
Klingt einfach und logisch, aber an meiner Umsetzung hapert es bei 
solchen Analysen. Deswegen nutze ich das LCD um mir was anziegen zu 
lassen, jedoch muss ich dort ja immer eine Zahl in einen String wandeln. 
Vllt. geht sogar auch dort was schief??!! Mhh - für die Wandlung und 
Ausgabe habe ich aus dem Tutorial my_itoa so benutzt wie es drin ist. 
Und diese ist mit Vorzeichen-Abfrage etc gebaut.

von Karl H. (kbuchegg)


Lesenswert?

batty man schrieb:

> Klingt einfach und logisch,

Ist es auch.

> aber an meiner Umsetzung hapert es bei
> solchen Analysen.

Du  meinst, du kommst nicht selbst auf die Idee erst mal alles 
wegzulassen, was nicht unbedingt notwendig ist und nur Potential für 
weitere Fehler hat?


Es gibt nichts, was so einfach wäre, dass man nicht trotzdem einen 
Fehler einbauen könnte.
Fazit: Fang so einfach wie möglich an. Jede weitere Komponente, und sei 
es nur eine Umrechnung in einen anderen Zahlenbereich, ist erst mal 
nichts anderes als eine mögliche Fehlerquelle. Brauchst du die 
Komponente unbedingt, weil sonst die Funktion nicht mehr gegeben ist? 
Wenn nein, dann lass sie fürs erste weg.

Du willst wissen, ob deine Brücke arbeitet?
Gut. Brauchst du dazu unbedingt die Ausgabe in Volt (oder µ-Volt)?
Nein!
Die Ausgabe des Wertes vom ADC, ungeschönt und ungeschminkt, erfüllt 
genau den gleichen Zweck: zu sehen, ob der ADC so arbeitet wie du dir 
das vorstellst.
Also lass die Umrechnung weg.

> Deswegen nutze ich das LCD um mir was anziegen zu
> lassen, jedoch muss ich dort ja immer eine Zahl in einen String wandeln.
> Vllt. geht sogar auch dort was schief??!! Mhh - für die Wandlung und
> Ausgabe habe ich aus dem Tutorial my_itoa so benutzt wie es drin ist.
> Und diese ist mit Vorzeichen-Abfrage etc gebaut.

Man kann auch fürs erste ganz einfach mal sprintf benutzen.
sprintf ist zwar eine eierlegende Wollmilchsau, aber erst mal wissen 
wir, das sprintf so gesehen keinen Fehler macht.

1
#define RefSpannung    49789000          //Referenzspannung gemessen mit 
2
3
....
4
5
          Spannung = (RefSpannung/512)*adcval;  //Ref.-Sp. [µV] (plus Kommastelle zum Runden) durch Auflösung mal aktueller ADC-Wert

welchen Datentyp hat 'Spannung'?
Dir ist hoffentlich klar, dass da riesige Zahlen raus kommen werden? Mit 
einem int hast du da nichts angefangen. Wenn Spannung aber kein int ist, 
warum benutzt du dann eine Funktion my_itoa? Das i in 'i to a' steht für 
int. D.h. in dem Fall wäre das dann die falsche Funktion dafür.

: Bearbeitet durch User
von batty m. (battyman)


Lesenswert?

Karl Heinz schrieb:
> Du willst wissen, ob deine Brücke arbeitet?
Nicht nur ob sie arbeitet, sondern die genaue 
Brückenausgangs-Wechselspannung. Ich kann für meinen Versuch nur 
Wechselspannung benutzen und diese möchte ich anstatt mit einem 
Multimeter eben mit einem MC erfassen, um anschließend mit den Wert 
Folgeaufgaben automatisch abarbeiten zu können.

> Gut. Brauchst du dazu unbedingt die Ausgabe in Volt (oder µ-Volt)?
> Nein!
Die Ausgabe in Volt brauch ich für die Erfassung natürlich nicht, jedoch 
möchte ich die akuell, anliegende Brückenspannung ablesen können und 
dafür brauch ich das LCD und dann will ich es am Ende auch in Normalform 
lesen können.

> welchen Datentyp hat 'Spannung'?
1
int32_t Spannung;  //da RefSpannung ein großer Wert ist
2
int16_t adcval;        //da die Übergabe von ADC_Read_Avg auch eine 16-Bit ist

> Dir ist hoffentlich klar, dass da riesige Zahlen raus kommen werden? Mit
> einem int hast du da nichts angefangen. Wenn Spannung aber kein int ist,
> warum benutzt du dann eine Funktion my_itoa? Das i in 'i to a' steht für
> int. D.h. in dem Fall wäre das dann die falsche Funktion dafür.
Das es Integer zu ASCII heißen soll habe ich ja geschnallt und dann hat 
es zudem auch noch kurioserweise bis dator gut und wie erwartet 
funktioniert. So bald ich eine positive Differnzspannung habe ist ja 
auch alles genau so wie ich es haben möchte und was auch wirklich 
zwischen den beiden Ausgängen des Labornetzteils als Differenz anliegt. 
In dem Augenblick wo ich eben eine negative Differenz haben müsste, ist 
meine Anzeige nicht mehr kongruent und zählt anstatt von 0 in den 
Minusbreich kleiner werden, eben von 9,9 an abwärts.

von Karl H. (kbuchegg)


Lesenswert?

batty man schrieb:

>> Gut. Brauchst du dazu unbedingt die Ausgabe in Volt (oder µ-Volt)?
>> Nein!
> Die Ausgabe in Volt brauch ich für die Erfassung natürlich nicht, jedoch
> möchte ich die akuell, anliegende Brückenspannung ablesen können und
> dafür brauch ich das LCD und dann will ich es am Ende auch in Normalform
> lesen können.

Du verstehs es immer noch nicht.

Du bist in der Entwicklungsphase!

Das du zum Schluss irgendwann mal die Spannung am LCD stehen haben 
willst, ist doch klar.
Aber du brauchst sie nicht in der Form von Volt, während du die 
Programmentwicklung machst! Du willst ZUVIEL auf EINMAL. Und das kannst 
du eben noch nicht.

: Bearbeitet durch User
von batty m. (battyman)


Lesenswert?

Karl Heinz schrieb:
> Du verstehs es immer noch nicht.
Sorry hatte dich nicht ganz verstanden. Das ich für die Entwicklung das 
mit sprintf umsetzen soll habe ich gerafft. Dachte an dieser Stelle 
jetzt nur, dass du das auf für mein realisiertes Projekt meintest, 
sorry.

So nun habe ich mein AD-Wandlungsprogramm auf sprint umgestellt und 
folgendes kam dabei heraus (mit AREF = 5V):
1.)
 +Ausgang1 = +Ausgang2 => 2,5V = 2,5V -> ADCW = 0

2.)
 +Ausgang1 = +Ausgang2 => 2,5V : 0V -> ADCW = 271

3.)
 +Ausgang1 = +Ausgang2 => 5V : 0V -> ADCW = 487

4.)
 +Ausgang1 = +Ausgang2 => 2,5V : 2,501V -> ADCW = 1023

Heißt für mich, dass mein Wandlungswert nicht stimmt und ich anstatt von 
-512-0-511 ein Wertebereich von 0-1023, wobei der erste Teil naheliegend 
wäre und bei Null-Durchgang fängt er dann eben von oben 1023 an und 
zählt dann wieder abwärts.

Benutzt habe ich Kanal 16 (BA:2560 -> ADC0 minus ADC1 mit 1*Gain).

Wo ist denn nun mein Denkfehler?

Mein Übungsprogramm:
1
#include <avr/io.h>
2
#include <stdio.h>              
3
#include "lcd.h"                  
4
#define F_CPU 8000000UL                
5
#include <util/delay.h>        
6
7
void ADC_Init(void)            // ADC0 = Port F - Pin 0 (BA:  ATmega2560)
8
{                              // ADC1 = Port F - Pin 1
9
  ADMUX = (1<<REFS0);      //setzt die Referenzspannung als intern und mit AVcc = 5V
10
  ADCSRA = (1<<ADPS2) | (1<<ADPS1);  //Taktfrequ.-Teilungsfaktor (Prescaler Select) = 64 für f = 125 kHz
11
  ADCSRA |= (1<<ADEN);               //aktiviert den AD-Wandler
12
  ADCSRA |= (1<<ADSC);               //startet die AD-Wandlung
13
  
14
  while (ADCSRA & (1<<ADSC))  {      //wartet auf Beendigung der Wandlung
15
  }
16
  
17
  (void)ADCW;                        //im Register abgelegter ADC-Wert
18
}
19
20
int16_t ADC_Read(uint8_t channel)    //AD-Wandlung - Einzelmessung
21
{                            //Kanal 16 für Differenzmessung ADC0 minus ADC1
22
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);      //Wahl des Kanals - Maskierung der 5 Mux-Bits
23
  ADCSRA |= (1<<ADSC);                  //startet die AD-Wandlung
24
  while (ADCSRA & (1<<ADSC))  {              //wartet auf Beendigung der Wandlung
25
  }
26
  return ADCW;                      //AD-Wandler auslesen und ausgeben
27
}
28
29
int main(void)
30
{
31
  int16_t adcval;
32
  char Puffer[20]; 
33
  lcd_init();                 
34
  ADC_Init();
35
        while (1)              
36
        {
37
          adcval = ADC_Read(16);
38
          sprintf( Puffer, %d", adcval);
39
          lcd_string(Puffer);
40
          _delay_ms(500);
41
          lcd_setcursor(0,0);
42
        }
43
        return 0;
44
}

Ich habe extra nur mit einer Einzelmessung gearbeitet um weitere 
Eventuallitäten zu unterbinden. Das Labornetzteil ist in seiner 
Spannungserhaltung sauber und gleichbleibend genug, was sich nachher ja 
durch meine Brücke stark ändern wird. Das müsste doch vorerst genug 
einfach gehalten sein.

Mhh???

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Heißt für mich, dass mein Wandlungswert nicht stimmt und ich anstatt von
>-512-0-511 ein Wertebereich von 0-1023,

Du interpretierst das nur falsch.

1023 = 0x3FF -> -1

MfG Spess

von batty m. (battyman)


Lesenswert?

spess53 schrieb:
> Du interpretierst das nur falsch.
>
> 1023 = 0x3FF -> -1
>
> MfG Spess

Mhh, mein ADC-Wert kommt also von 522 bis bis 1023 für den negativen 
Bereich und von 0 bis 488 für den Positiven. Das ich das für mich genau 
so interpretieren kann und auch schon gemacht habe ist klar, nur weiß 
ich noch nicht so ganz, warum es eben zu keinen Nulldurchbruch mit 
neg.-ADCW kommt, sondern eben von der 10-Bit Obergrenze nach unten 
zählt???

Weiterhin ist es doch komisch das ich 501 negative Werte erhalte, die 
Null und 488 Positive -> das sind doch bloß 990-Werte und keine 1024???

von Georg G. (df2au)


Lesenswert?

batty man schrieb:
> ich noch nicht so ganz, warum es eben zu keinen Nulldurchbruch mit
> neg.-ADCW kommt

Bitte lies doch das Datenblatt, Abschnitt 26.7 "ADC Conversion 
Result". Falls du lieber Bilder magst: Figure 26-15 zeigt es sehr gut.

Dein ADC misst richtig, du interpretierst nur die Ergebnisse falsch.

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> Bitte lies doch das Datenblatt, Abschnitt 26.7 "ADC Conversion
> Result". Falls du lieber Bilder magst: Figure 26-15 zeigt es sehr gut.
>
> Dein ADC misst richtig, du interpretierst nur die Ergebnisse falsch.

So, das habe ich zum zichsten Mal getan. Aus der Zeichnung konnte ich 
das immer noch nicht wirklich interpretieren, aus der Tabelle mit dem 
Bsp, dann schon eher. Hatte "kurz  :-D "gebraucht und eine lange 
Excel-Tab. (mit wirklich allen Werten und Umrechnung von pos-Dezimal, 
neg-Dez., Hexadezimel und Binärcode) später, - dann habe ich mein 
Problem und damit den besagten Groschen bekommen. Noch ein paar wenige 
Minuten Später war dann meine Logik und Rechnung mit der des MC 
kongruent und ich habe dann wirklich das gerafft, schwere Geburt...voll 
sorry  ;-)
Nun kann ich aber wie gewünscht meine Spannung anzeigen und das von - 
bis +.

1.) - So, nun aber mal wieder zum eigentlichen. Trotzdem habe ich nicht 
den vollen Bereich, warum auch immer weiß ich noch nicht wirklich:
-502...o...488; an irgend einer Stelle haperts noch oder ist das normal 
das es weniger als 10-Bit-Auflösung jedoch weit aus mehr als eine 
9-Bit-ige?

Weiterhin folgendes:
2.) - In einem Differenzbereich von -30...0...30 kann kein genauer Wert 
ermittelt werden und meine Anzeige springt nur so fröhlich bis >1000 
immer hin und her. Wenn ich das jetzt richtig verstanden habe liegt es 
an dem zu kleinen und damit nicht genauen Erkennung der Differenz - ist 
das so richtig???


Nachdem ich nun das ganze mit dem Labornetzteil ausgiebig getestet habe, 
habe ich mich nun wieder meiner Brücke zugewandt. Funktionsgenerator 
ein, 1,9kHz und Brückenabgleich mit AC-Multimeter. Ran an den MC und 
siehe da von 1,94 bis 2,697V ist alles möglich, natürlich je nach dem 
wann ich die Messung voll führen lasse. Ach so, ich mach das jetzt auch 
schon wieder mit der 100-fach-Mitterwertbildung.
3.) - Da es schon beim Nullabgleich >1V anzeigt, stellt sich mir die 
Frage, warum ich die 2,5V DC-OFFSET rausgerechnet werden? Und der 
Wechselspannungsanteil müsste doch auch an dieser Stelle sich 
gegeneinander aufheben.

4.) - Und wie kann ich sicher stellen, dass ich immer an der Selben 
Periodenstelle anfange zu messen, um die heftigen Schwankungen entgegen 
zu wirken. Das mit der Mehrfachmessung und dem Auslesen des Max-Wertes 
ist auch klar. Da ich, wie man vllt. schon gemerkt hat nicht Sattelfest 
mit dem MC-Umgang bin, weiß ich nur nicht wo ich die gemessenen Werte 
hinschreiben und anschließend auswerten kann bzw. den Maximalen benutzen 
kann???

Wirklich herzlichen Dank für die Gedult mit mir und der Hilfestellung 
bei meinem Problem. Das hilft mir echt (auch wenn es nicht gleich danach 
aussieht) und ich versteh an den gewissen Stellen dann auch das DS 
besser. Dieses ist nicht gerade mein bester Freund. :D

: Bearbeitet durch User
von batty m. (battyman)


Lesenswert?

Hallo liebe Gemeinde,

das mit den Array beschreiben und nach 100 Messungen den Max-Wert 
entnehmen ist an und für sich ja schon gut, jedoch ist mir jetzt 
aufgefallen, dass so fern ich in den Nullabgleich komme folgendes 
Problem habe:
- ich habe bis ADCW = 511 eine positive Zahl ... dort könnte ich das mit 
dem Max-wert umsetzen
- komme ich gegen Null kann es bei den 100 Messungen vorkommen, das er 
mal darunter rutscht und damit mindestens ADCW = 1023 und somit den 
größten Max-Wert erreicht
- dabei kann es aber doch auch vorkommen, dass ich eine neg. Diff. habe, 
wodurch ich doch nach dem Min-Wert gucken müsste???

Oh man ist das n schwieriger Logik-Fall - Verdamm*** 
Wechselspannungs-Geschichte

von Georg G. (df2au)


Lesenswert?

1.) Die ADC Werte mit Vorzeichen merken, also ist 1023 eine -1
2.) den absolut größten Wert nehmen.

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> 1.) Die ADC Werte mit Vorzeichen merken, also ist 1023 eine -1
> 2.) den absolut größten Wert nehmen.

Andere Frage:
ich kann doch auch 100-Messungen  vornehmen und dabei gleich 
Fallunterscheidung auf pos. OT-Spannung machen. Damit habe ich doch 
schon erst einmal die Vorunterscheidung zwischen Positiver und negativer 
Spannungsdifferenz. Während den 100-Messungen kann ich doch in dieser 
Fallunterscheidung gleich noch nach den Max- und Min- Werten gucken und 
abschließend immer von einander abziehen. Dann müsste ich meine 
Wellennulllienie herausbekommen. Diese liegt doch dann relativ zur 
Bezugsebene und stellt somit meine Spannung dar oder habe ich jetzt 
wieder ein gravierenden Denkfehler drin???
Ich habe mir das jetzt so vorgestellt:
1
uint16_t max;               //OT-Wechselspannung
2
uint16_t min;               //UT-AC
3
uint8_t i;                  //Anzahl von Messungen
4
uint8_t k;                  //Häufigkeit Pos-Messung
5
uint8_t l;                  //Häufigkeit Neg-Messung
6
int16_t p_Diff;
7
int16_t n_Diff;
8
char Puffer [10];
9
10
while (1) {
11
12
  max = 0;                  //Max-Startwert für jede neue Runde
13
  min = 1023;               //Min-Startwert für jede neue Runde
14
  k = 0;
15
  l = 0;
16
17
  for (i=0; i<100;i++) {    //100 Messungungsdurchläufe generieren
18
    adcval = ADC_Read[16];  //Auselesen des ADCW (ADC0-ADC1)
19
    if (adcval < 512) {     //Prüfung auf pos. Spannung
20
      k++;                  //Häufigkeit bei 100-Messungen
21
      if (max < adcval) {   
22
        max = adcval;       //Überschreiben des Max-Wertes
23
      } 
24
      if (min > adcval) {
25
        min = adcval;
26
      }
27
      p_Diff = max - min;   //Berechnung der Nullebene für echten ADCW
28
    }
29
    else {                  //bei neg. Spannung
30
      l++;                  //Häufigkeit des Falleintritts/100 Mess
31
      if (max < adcval) {   
32
        max = adcval;       //Überschreiben des Max-Wertes
33
        max -= 1024;        //Umrechnung auf neg.-Dezimalzahl
34
      } 
35
      if (min > adcval) {
36
        min = adcval;       //Überschreiben der Min-Spannung
37
        min -= 1024;        //Umrechnung auf neg.-Dezimalzahl
38
      }
39
      n_Diff = max + min;   //Berechnung der Nullebene für echten ADCW
40
    }
41
  }
42
  if (k > l) {
43
    Puffer = " ";
44
    sprintf (Puffer, "%5d", p_Diff);
45
  }
46
  else {
47
    Puffer = " ";
48
    sprintf (Puffer, "%5d", n_Diff);
49
  }
50
  lcd_string (Puffer);
51
}

Kann jmd meine Gedanken nachvollziehen? Und wenn ja, ist dies mit dem 
was ich eigentlich machen möchte funktional umsetzbar? Das mit den 
Absolutwerten und dem merken des Vorzeichens habe ich für mich so noch 
nicht als funktional im Kopf abgeleget! Ich habe doch 3 Zustände:
- OT und UT sind pos
- OT ist pos und UT ist neg
- OT und UT sind neg
oder nicht???

: Bearbeitet durch User
von batty m. (battyman)


Lesenswert?

Tach auch, neuer Zwischenstandsbericht  ;-)

ich habe das jetzt einfach mit den Max-Werten probiert und so lange mein 
Brückenabgleich mit einem Max-KondensatorKapazität hergestellt ist, ist 
das soweit auch echt funktional. Ich darf auf keinen Fall einen Abgleich 
in Kondensator-Zwischenstellung machen, da ich dann einen neg- und pos- 
Spannungsausschlag bekommen kann.
Also ich habe jetzt erstmal für die Vereinfachung ein Abgleich Auf 
Kapazitäts-Max getätigt.

Was jetzt dabei raus kommt ist folgendes:
1.)
- mein ADCW ist minimal 2 und niemals 1 oder gar 0 auch wenn an gleicher 
Messabnahmestelle mein Multimeter mir AC = 0,000V ausgibt

2.)
bei der maximalen Verstellung der Kapazitäten zu einandern:
- mein ADCW ist maximal 486 und keine 511 !!!

für die entgegengesetzte Stellung der Kapazitätsweret:
- mein ADCW ist minimal 522 und keine 512 !!!

-> Damit habe ich doch einen Auflösungsverlust von 25 Werten! Kann mir 
wenigstens dieser Zusammenhang erläutert werden? DEnn dieses Phänomen 
habe ich beim Labornetzteil mit DC, als auch jetzt bei meiner Messbrücke 
mit AC.

THX

von Georg G. (df2au)


Lesenswert?

batty man schrieb:
> 1.)
> - mein ADCW ist minimal 2 und niemals 1 oder gar 0 auch wenn an gleicher
> Messabnahmestelle mein Multimeter mir AC = 0,000V ausgibt
Da hast du gleich einen guten Hinweis darauf, was sich dein ADC an 
Rauschen und Störungen einfängt.

> 2.)
> bei der maximalen Verstellung der Kapazitäten zu einandern:
> - mein ADCW ist maximal 486 und keine 511 !!!
Vermutlich ist die Referenzspannung zu nahe an VCC. Bei 
Differenzmessungen muss mindestens ein Abstand von iirc 500mV 
eingehalten werden. Das Datenblatt hilft dir da weiter.

> für die entgegengesetzte Stellung der Kapazitätsweret:
> - mein ADCW ist minimal 522 und keine 512 !!!
Das kann nicht sein, weil in der anderen Richtung negative Werte 
geliefert werden. Offenbar hast du das immer noch nicht realisiert. 
Ansonsten: Schau ins Datenblatt, ob es auch für den unteren Wert einen 
Sicherheitsabstand zu GND geben soll.

von batty m. (battyman)


Lesenswert?

Georg G. schrieb:
> batty man schrieb:
>> 1.)
>> - mein ADCW ist minimal 2 und niemals 1 oder gar 0 auch wenn an gleicher
>> Messabnahmestelle mein Multimeter mir AC = 0,000V ausgibt
> Da hast du gleich einen guten Hinweis darauf, was sich dein ADC an
> Rauschen und Störungen einfängt.
Ah ok. Gut zu wissen. Ich habe jetzt einfach nur den Faktor 2 abgezogen 
und fertig. Damit kann ich erstmal leben. Das wird dann auch die 
Erklärung dafür sein, warum hintenraus ich immer ca. +/-0,1V als 
Unterschied zw. Messwert Multimeter und MC bekomme.

>> 2.)
>> bei der maximalen Verstellung der Kapazitäten zu einandern:
>> - mein ADCW ist maximal 486 und keine 511 !!!
> Vermutlich ist die Referenzspannung zu nahe an VCC. Bei
> Differenzmessungen muss mindestens ein Abstand von iirc 500mV
> eingehalten werden. Das Datenblatt hilft dir da weiter.
Ich benutze die interne Ref.-Sp. von 5V und es liegen gemessen zw. 
AREF-Pin und GND 4,988V an. Also wird dem schon so stimmen und ist halt 
so. Mein AC-Spannungsmaximum ist 3,3V laut Multimeter (Eff.-Wert!). 
Rechne ich noch Sqrt(2) dazu, so bin ich knapp bei 4,7V Paek. Aus diesem 
Grund geht auch nur 5V als Ref.-Sp..

>> für die entgegengesetzte Stellung der Kapazitätsweret:
>> - mein ADCW ist minimal 522 und keine 512 !!!
> Das kann nicht sein, weil in der anderen Richtung negative Werte
> geliefert werden. Offenbar hast du das immer noch nicht realisiert.
> Ansonsten: Schau ins Datenblatt, ob es auch für den unteren Wert einen
> Sicherheitsabstand zu GND geben soll.
Also anders ausgedrückt, egal was ich bisher gemacht und probiert habe, 
bekomme ich vom Wandler keine Negativwerte sondern:
ADCW = 511 => 511
ADCW = 0 => Null
ADCW = 1023 => -1
dann entspricht ADCW = 512 doch => -512

egal wie ich es am Labornetzteil geprüft habe, ich habe den digitalen 
Wandlungswert ohne jegliches umrechnen, interpretieren, etc. als ganz 
normale reelle Zahl von eben 0 bis 1023 erhalten, wobei ab einem ADCW = 
512 das eine negative Spannungsdifferenz entsprechen würde. Die Ausgabe 
liefert einfach immer ein positives Ergebnis.
Demnach ist dann ADCW = 513 => -511 ; ADCW = 514 => -510 usw. bis eben 
ADCW = 1022 => -2 und ADCW = 1023 => -1.
Möchte ich für mich mein ADCW als negative Zahl dargestellt bekommen so 
muss ich ab ADCW >511 immer ADCW -= 1024 rechnen. Dann gibt mir mein MC 
auch die entsprechenden Negativwerte aus.
Was habe ich denn hier nicht verstanden??? Ich kann doch nichts anderes 
mitteilen, als das was ich vor mir habe. Das ihr mehr Ahnung und 
Erfahrung damit habt ist mir klar und wenn ihr wehement meint ich mache 
an irgend einer Stelle was vollkommen falsch, dann glaub ich das ja, nur 
ich seh eben nicht was??!!

von spess53 (Gast)


Lesenswert?

Hi

>Ich benutze die interne Ref.-Sp. von 5V und es liegen gemessen zw.
>AREF-Pin und GND 4,988V an. Also wird dem schon so stimmen und ist halt
>so.

Bei differentieller Messung darf die Referenzspannung max. VCC-0,5V 
betragen.

Siehe:

Table 31-10. ADC Characteristics, Differential Channels (Continued) 
S.367

Stimmt also nicht.

MfG Spess

von batty m. (battyman)


Lesenswert?

spess53 schrieb:

> Bei differentieller Messung darf die Referenzspannung max. VCC-0,5V
> betragen. ...
> Stimmt also nicht.
Ähm sorry, ich meinte dass das von eurer Aussage schon stimmen wird, 
nicht das an dieser Stelle meine benutzten Einstellungen schon stimmen. 
Also das ich aufgrund der Tatsache VCC-0,5V keine vollen 511 sondern 
eben nur 486 bekomme.
Da ich aber doch die interne Ref benutze gehts eben nicht anders, bzw. 
ich muss mir eine externe über den AREF-Pin einspeisen und die auf 4,5V 
einstellen und anschließend mein Spannungs-Differnz-Maximum (Peak) der 
Brücke reduzieren, um die 4,5V nicht zu übersteigen.

ahh, oder aber ich hebe Vcc einfach auf 5,5V an... Das müsste doch auch 
gehen. Gleich mal Probieren. ---

Bearbeitet:
- Gut das mit den 5,5V Vtarget funzt nicht, denn auch die VRef hat sich 
damit auf 5,5V erhöht. Verdammt, dann doch was basteln und extern von wo 
auch immer hernehmen. Es könnt alles so einfach sein, isses aber nich!!

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

batty man schrieb:
> Es könnt alles so einfach sein, isses aber nich!!

Im Prinzip schon, du hast die Lösung selbst schon geschrieben: Halte 
Abstand von den Grenzen GND und VCC, reduziere deinen Pegel ein wenig. 
Das ist dann nicht 100% nach Datenblatt, funktioniert aber.

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.