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
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.
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???
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
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.
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
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!
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.
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.
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???
>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.
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???
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?
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
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 :-)
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?
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
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...
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.
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
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.
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_tADC_Read_Avg(uint16_tchannel,uint16_tnsamples)//uint16_t nsamples ist doch ein normaler Integer
2
3
int32_tsum=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.
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.
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_tSpannung;//da RefSpannung ein großer Wert ist
2
int16_tadcval;//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.
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.
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
voidADC_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
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
returnADCW;//AD-Wandler auslesen und ausgeben
27
}
28
29
intmain(void)
30
{
31
int16_tadcval;
32
charPuffer[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???
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
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???
batty man schrieb:> ich noch nicht so ganz, warum es eben zu keinen Nulldurchbruch mit> neg.-ADCW kommtBitte 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.
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
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
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:
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???
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
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.
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??!!
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
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!!
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.