Hallo,
ich kann das Datenblatt des XMEGAS nicht so richtig verstehen.
Kann der ADC negative Spannung messen? Sprich einen
Bereich von z.B -1 Volt bis +1 Volt. Weil da wid immer von einem
signed mode geredet. Und nach einem Schaubild wo 0 Volt in der
mitte ist und oben und unten jeweils die Grenzen Seite 295 Datenblatt.
Knut Ballhause schrieb:> DOCH. Der XMega kann negative Spannungen bis zur Flussspannung der> internen Dioden messen, also bis etwa -0.6V.
Die kann er tatsächlich ohne Linearitätsverlust messen?
Man sollte vielleicht dazu sagen, dass man so nicht messen sollte, oder
ist das nach Datenblatt explizit vorgesehen?
Das ist so vorgesehen und bis nahe an die Flußspannung auch ohne extra
Linearitätsfehler. Dieses Feature ist zum Beispiel dazu gedacht, um
Nullspannungsdurchgänge detektieren zu können, ohne Biasspannungen zu
benötigen, oder für Strommessungen an einem Shunt, der gegen Masse
liegt.
Hallo,
also ich habe nun auch schon den einen oder anderen Versuch mit dem ADC
gemacht, leider ohne Erfolg.
Vielleicht habe ich auch ein Verständnisproblem, deswegen hier mal ein
paar Fragen:
1. Man kann beim XMEGA128A1 verschiedene Referenzspannungen einstellen.
Wenn ich nun "Internal 1V" auswähle und mich im "Signed Mode" und
"SingleEnded" befinde, müsste ich doch, wenn ich den pos. Pin und den
neg. Pin (Gnd) verbinde, als Zahlenwert eine 0 erhalten, oder?
2. Wird meine Referenzspannung zu meinem ADC-Signal dazuaddiert? Dann
würde ich mich ja bei "Internal 1V" zwischen 0 und 2V bewegen, oder?
Ich versuche gerade einen Klopfsensor zu messen. Dieser hat 2 Ausgänge
(2 Pins). Wenn ich ihn an den Oszi anschließe (1 Pin - GND), dann
liefert er mir bei Anregung natürlich eine positive und negative
Spannung, eben um den GND herum.
Beim XMEGA müsste ich dafür doch den "Differential Mode (with gain)"
oder?
Gruß Joe
Joe F. schrieb:> 1. Man kann beim XMEGA128A1 verschiedene Referenzspannungen einstellen.> Wenn ich nun "Internal 1V" auswähle und mich im "Signed Mode" und> "SingleEnded" befinde, müsste ich doch, wenn ich den pos. Pin und den> neg. Pin (Gnd) verbinde, als Zahlenwert eine 0 erhalten, oder?
Ja, in etwa. Der Wert schwankt etwa zwischen +10 ($000A) und -10
($0FF6), je nach Offsetfehler.
Joe F. schrieb:> 2. Wird meine Referenzspannung zu meinem ADC-Signal dazuaddiert? Dann> würde ich mich ja bei "Internal 1V" zwischen 0 und 2V bewegen, oder?
Nein. Die Referenzspannung ist das obere Limit. Bei 1V Referenz kannst
Du von etwa -0.6...+1.0V messen
Joe F. schrieb:> Ich versuche gerade einen Klopfsensor zu messen. Dieser hat 2 Ausgänge> (2 Pins). Wenn ich ihn an den Oszi anschließe (1 Pin - GND), dann> liefert er mir bei Anregung natürlich eine positive und negative> Spannung, eben um den GND herum.> Beim XMEGA müsste ich dafür doch den "Differential Mode (with gain)"> oder?
Geht auch Single-ended unsigned. Gain brauchst Du nicht. Benutze
unbedingt einen Strombegrenzungswiderstand >10k in Serie zum ADC-Pin.
Knut Ballhause schrieb:> Geht auch Single-ended unsigned. Gain brauchst Du nicht. Benutze> unbedingt einen Strombegrenzungswiderstand >10k in Serie zum ADC-Pin.
Verstehe ich nicht ganz!
Mein Klopfsensor liefert doch pos. und *neg.* Spannung!!! Wie soll vor
allem die neg. Spannung bei "Single-ended unsigned" interpretiert
werden?
Gruß Joe
Lies doch mal das Datenblatt/Manual! 0V entsprechen einem gelesenen Wert
von 200 unter 0V werden Werte kleiner 200 geliefert und über 0V Werte
größer 200.
Knut Ballhause schrieb:> Lies doch mal das Datenblatt/Manual! 0V entsprechen einem gelesenen Wert> von 200 unter 0V werden Werte kleiner 200 geliefert und über 0V Werte> größer 200.
Das Datenblatt habe ich ja gelesen!!! Du meinst sicher das Schaubild
25-11. Aber da liegt ja das Problem!
Wenn man von Spannungen zwischen -1V bis +1V ausgeht, dann geht ja
Single-ended unsigned nicht, denn die max. neg. Spannung -0,6V betragen
darf und nicht weniger!!!
Wenn ich falsch liege, korrigiert mich bitte!?!?
Dann geht ja wohl Single-ended unsigned nicht oder?
Gruß Joe
Stelle doch bitte nochmal eine Frage, die man auch verstehen kann. Ich
habe Dir gesagt, was geht. Wenn Du meinst, dass Dir das nicht reicht,
dann ist es halt so. Der ADC ist prinzipbedingt nicht dazu geeignet, bei
voller Auflösung bipolar um Masse herum zu messen, aber er kann kleine,
negative Spannungen messen. Dies geht sowohl im Single-Ended, als auch
Differenzialmodus. Such Dir etwas aus, programmiere und probiere es und
schau´ ob Du damit zurecht kommst.
Joe F. schrieb:> Ich versuche gerade einen Klopfsensor zu messen. Dieser hat 2 Ausgänge> (2 Pins). Wenn ich ihn an den Oszi anschließe (1 Pin - GND), dann> liefert er mir bei Anregung natürlich eine positive und negative> Spannung, eben um den GND herum.
Dabei nimmt die Spannung Werte von -1V bis +1V an.
Für die Auswahl des ADCs kann ich verschiedene MODE wählen, "Un/signed
Single-ended" und "Differential (with gain)". Welcher wäre hier der
geeignetere???
Gruß Joe
PS: Ich hoffe, dass die Frage nun eindeutig ist.
Das dachte ich mir schon. Danke für die Bestätigung.
Ich muss wohl den Differentialmodus nehmen, denn mir ist wichtig, dass
ich den "Start", also das Klopfen, feststellen kann.
Gruß Joe
Joe F. schrieb:> Ich muss wohl den Differentialmodus nehmen,
Damit wird es nicht besser, da sich dadurch die physischen Gegebenheiten
nicht ändern. Es ist wohl schlauer, den ADC auf Vcc/2 vorzuspannen und
Deinen Klopfsensor über einen Kondensator einzukoppeln. Wenn Du denn
unbedingt beide Halbwellen auswerten mußt. Meine Klopfsensoren oder
Drumfelder, die mit Piezos ausgestattet sind, wurden bisher über eine
Schottky-Diode und einen kleinen Puffer-C von 100nF und einen
Serienwiderstand an den ADC angeschlossen und erzeugen damit nur
Spannungen über 0V. Beide Halbwellen auszuwerten, brächte lediglich
einen Zeitvorsprung von etwa 1ms, da die Sensoren, einmal ausgelenkt,
auch sofort wieder zurückfedern und somit eine Spannung in der
Gegenrichtung abgeben. Je nachdem, von welcher Seite auf den Kristall
geklopft wird, hat man entweder 0 -> + -> - oder 0 -> - > + mit
nachfolgendem Ausschwingen, aber das macht bei der Auswertung keinen
Unterschied. Es sei denn, Du willst noch Frequenzen messen und nicht nur
das reine Klopfen feststellen.
Knut Ballhause schrieb:> Damit wird es nicht besser, da sich dadurch die physischen Gegebenheiten> nicht ändern.
Sorry, wenn ich hier nochmal nachhacken muss, ABER
wenn ich mir die pdf (XMEGA A MANUAL) durchlese, steht auf Seite 295
(Schaubild 25-9: Signed differential input...), dass Vinn höher sein
kann als Vinp -> das heißt doch, dass die gemessene Spannung zwischen
Vinp und Vinn negativ sein muss. So würde ich mir auch das (-) bei RES
erklären.
Joe F. schrieb:> dass Vinn höher sein> kann als Vinp
Das ist richtig. Aber nur innerhalb der Versorgungsspannung +- 0.5V
Joe F. schrieb:> das heißt doch, dass die gemessene Spannung zwischen> Vinp und Vinn negativ sein muss.
Nein. Heisst es nicht. Der ADC liefert zwar negative Messwerte
(vorzeichenbehaftet), aber keine negativen Spannungswerte.
Joe F. schrieb:> So würde ich mir auch das (-) bei RES> erklären.
Nein. Das ist die negative Auflösung von $0FFF bis $0800. Die positive
Auflösung geht von $0000 bis $07FF.
Hi.
Statt der Einpulsgleichrichtung und Glättung kann man auch einen
einfachen Summierverstärker nutzen, der durch eine Referenzspannng einen
Offset erzeugt. Über den Verstärkungsfaktor oder einem nachgeschalteten
Spannungsteiler kann man dann die Spannung in den Bereich des ADC's
teilen. Ich mess auf diese Art mit meinem XMega ein Tachosignal dessen
Pegel zwischen +45V und -45V liegt.
-bla-
bla schrieb:> Statt der Einpulsgleichrichtung und Glättung kann man auch einen> einfachen Summierverstärker nutzen, der durch eine Referenzspannng einen> Offset erzeugt.
Wurde doch schon erwähnt. Dazu braucht man keinen Summierer, das geht
passiv mit Spannungsteilern und Kondensatoren.
Knut Ballhause schrieb:> Datum: 12.10.2010 08:51> Wurde doch schon erwähnt.
Stimmt.
Zum Thema: Ich habe mal als Testobjekt statt den Klopfsensor einen
Funktionionsgenerator genommen, diesen habe ich auf DC(1V) eingestellt.
Wenn ich nun den ADC auf differentiell einstelle und dabei den PIN1 und
PIN2 mit dem Funktionionsgenerator verbinde (GND wird extra nicht mit
dem Funktionionsgenerator verbunden), müsste dieser mir doch immer einen
konstanten Wert liefern, da die Differnez zwischen PIN1 und PIN2 immer
1V ist. Ist das soweit korrekt?
Wenn das stimmt, dann verstehe ich die Funktion des ADC richtig, wenn
nicht, dann... naja. :(
Problem:
Ich habe das gerade eben getestet und der Wert springt total. Ich denke,
dass da ein starkes Rauschen ist, weil GND nicht verbunden ist. :(
Knut kannst du vielleicht irgendwie eine Zeichnung über die passive
Kopplung miteinfügen, da ich nun wirklich probieren will beide
Halbwellen auszuwerten?
Gruß Joe
1. Ein großes Danke schön, dass du soviel Geduld mit mir hast. :)
2. Das Prinzip deiner Schaltung ist mir schon klar. Du hebst einfach
meine +-1V um Vcc/2 an. Somit liege ich im Bereich des ADC und kann
normal abtasten.
3. Aber was mir immer noch nicht in meinen "Schädel" hineingeht, warum
zum Teufel (Entschuldigung für die Wortwahl) klappt es nicht, wenn ich
ohne diesen Zusatz (deine Schaltung) den ADC auf "differential"
einstelle?!?!?!
> Aber nur innerhalb der Versorgungsspannung +- 0.5V
Sogar dann klappt es nicht. Wozu ist denn diese Differenzmessung denn
sonst da?
Gruß Joe
Sensor --------o o---------- PIN1 ADC
(+-1V) --------o o---------- PIN2
Einstellung vom ADC:
- Differential Mode
- Vcc/1.6
- 12 Bit
Warum geht es nicht so? (Ohne jetzt auf Widerstände zu achten!)
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)
Hintergrund:
Die ADC-Eingänge müssen auf ein Potential innerhalb der
Versorgungsspannung gezogen werden, damit sie nicht floaten.
Idealerweise ist das auch hier VRef/2. Ansonsten würdest Du bereits die
sich nähernde Hand in Richtung Klopfsensor auswerten. Im
Differentialmodus bekommst Du nun bei positiver Halbwelle ADC-Werte von
$0000...$07FF und für die negative Halbwelle ADC-Werte von
$FFFF...$F800. Zuzüglich möglicher Offsetfehler, die Du kompensieren
mußt.
Großes Dankeschön!
Es scheint zu funktionieren. Ich habe im Moment keinen galvanisch
getrennten Funktionionsgenerator, dadurch sind die GNDs miteinander
verbunden und es kommt nur Murks raus. Sobald ich den
Funktionionsgenerator trenne, scheint der Wert stabil zu sein! Hier
werden auch die 1,5V (Vcc/2) mit dem Wert 1682 angezeigt. Ich versuche
es demnächst mit meinem Laptop, dann berichte ich nochmal.
Dankeschön nochmal!
Gruß Joe
PS: Ich lade dich gerne auf ein Bier ein, wenn du in der Nähe von KA
wohnst! :)
Joe F. schrieb:> Es scheint zu funktionieren.
Das ist gut!
Joe F. schrieb:> Hier> werden auch die 1,5V (Vcc/2) mit dem Wert 1682 angezeigt.
Bei Leerlauf des Signals sollte im Differenzmodus aber ~0 angezeigt
werden. Lege statt Vcc mal eine externe Referenz sowohl an die
Widerstände, als auch an den ADC-Referenzpin und nutze diesen Wert als
Bezug. Die Referenzquelle kann eine grüne LED sein, die über 10k an Vcc
liegt.
Hmm. Nee, das mit dem Bier wird dann wohl nichts. Eigener Standort:
Harz. :-(
Knut Ballhause schrieb:> Bei Leerlauf des Signals sollte im Differenzmodus aber ~0 angezeigt> werden.
Stimmt, da hast du ja völlig recht!
Knut Ballhause schrieb:> Lege statt Vcc mal eine externe Referenz sowohl an die> Widerstände, als auch an den ADC-Referenzpin und nutze diesen Wert als> Bezug.
Das mit dem ADC-Referenzpin muss ich mal schauen, wo der genau ist, da
ich das Xplain Board mit dem Xmega verwende. Hier habe ich nur Port A
und D frei. Alle anderen Ports sind mit LEDs, Taster usw. belegt.
Hi Knut,
ich bin nun fertig mit meinen Klausuren und kann mich wieder dem Problem
widmen.
Natürlich habe ich mich erst wieder kurz einarbeiten müssen und habe mal
wieder die pdf vom XMEGA aufgemacht. Und siehe da, ich habe mal wieder
was gefunden.
Kapitel 25.10 Figure 25.20 -> Kann sein, dass es der selbe Aufbau wie
bei (paar Threads wieter oben) dir ist? Der einzige Unterschied ist,
dass hier im Bild noch Kondensatoren eingebaut sind. Oder ist es doch
was anderes? Kannst du mir mal kurz erklären, wozu man diese
Kondesatoren benötigt, ich kann das aus dem Text heraus nicht ganz
nachvollziehen?
Gruß Joe
Joe F. schrieb:> Kann sein, dass es der selbe Aufbau wie> bei (paar Threads wieter oben) dir ist?
Nein. Das ist der interne Aufbau des ADC und das hat nichts mit der
externen Beschaltung zu tun.
Knut Ballhause schrieb:> interne Aufbau des ADC
Sorry für diese dumme Frage. Wer lesen kann, ist klar im Vorteil!!!
Die Überschrift ist auch noch dick geschrieben: *25.10 ADC Input Model*
Hi Knut,
wie groß darf meine AREFA Spannung eigentlich sein? Darf ich da eine
Spannung von 3V oder höher anlegen?
Ich habe das nirgends im Datenblatt gefunden.
Gruß Joe
Hi Knut,
also ich habe mal die Schaltung aufgebaut. Funktioniert 1A leider mit
einem kleinen minus! :(
Bei 8 Bit Auflösung ist der Zahlenwert ziehmlich stabil. Sobald ich aber
auf 12 Bit wechsle, wandert mein Ergebnis +- 20. Ich denke, dass mein
Signal ein Rauschen erzeugt, wodurch diese 20 entstehen. ich habe nun
vor einen 100nF zwischen die Leitungen zu "klemmen", um eine saubere
Spannung zu erhalten. Meine Frage ist eigentlich, wo soll ich den am
besten hinbauen? Vor die 100k, also so nah wie möglich an Aref? Oder
lieber nach den "ersten" 100k also so nah wie möglich an die
Signalleitung? Oder vllt sogar an beiden Stellen?
Gruß Joe
Noch bevor ich es vergesse:
In diesem Musterbeispiel von AVR wird immer der Offset berechnet. Sollte
man diesen eigentlich vor jeden Ergebnis berechnen oder reicht es bei
der Initialisierung diesen einmal zu berechnen?
Gruß Joe
Ich habe meinen Fehler gefunden. :)
Mal wieder waren die Massen miteinander verbunden. Kaum habe ich den
Oszi abgetrennt, war der Wert stabil (+-5) auch bei 12 Bit.
Ich habe aber trotzdem einen 100nF zwischen dem pos und neg Pin
eingefügt und meine Referenzspannung auf intern VCC/1.6 gestellt. Es
funktioniert nun alles so wie ich es benötige.
Danke für deine Hilfe!!!
Gruß Joe
Hi Knut,
ich habe mal wieder ein kleines Problem. Vllt hast du das ja schon
gemacht.
Ich wollte nun die ADC-Werte in SRAM einlesen, um diese später
verarbeiten zu können.
Nun habe ich mir AVR1502 angeschaut. Hier werden die Tasten eingelesen
und dann wieder ausgegeben. Dasselbe wollte ich nun auf den ADC
anwenden. Ich dachte mir, wenn ich den ADC im Freerun modus laufen lasse
und den DMAC nur ab einem bestimmten Augenblick die Werte (Anzahl:1000)
übertragen lasse, müsste diese 1000 Werte im SRAM genau meinen
ADC-Werten entsprechen.
Hier mal meine Einstellungen:
ADC
1
voidADCA_init(void){
2
//ADCA signed Conversion Mode und Auflösung 12 Bit
3
ADC_ConvMode_and_Resolution_Config(&ADCA,
4
ADC_ConvMode_Signed,
5
ADC_RESOLUTION_12BIT_gc);
6
//Free running mode aktivieren
7
ADC_FreeRunning_Enable(&ADCA);
8
//ADC Clock (32MHz/x = y kHz)
9
ADC_Prescaler_Config(&ADCA,
10
ADC_PRESCALER_DIV4_gc);
11
//Referenzsignal für ADCA auf Iternal 1V
12
ADC_Reference_Config(&ADCA,
13
ADC_REFSEL_VCC_gc);//INT1V
14
// Setup channel 0 to have single ended input
15
ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
16
ADC_CH_INPUTMODE_DIFF_gc,//differential mode ohne gain
17
ADC_CH_GAIN_1X_gc);//gain faktor <- wird nicht verwendet
Die DMA-Einstellungen habe ich natürlich aus dem oberen Beispiel
verwendet und angepasst. Leider habe ich das Problem, dass nicht 1000
sondern nur 500 Werte im sample gespeichert werden und ich weiss nicht
warum?!?!
Was mir noch aufgefallen ist, dass mein Signal (Test mit Sinus)
irgendwie abgeschnitten ist, obwohl die Amplitude bei 0,5 V gewählt
worden ist. Ist hier nun die Einstellung vom ADC flasch? Oder ist der
DMAC beim auslesen zu schnell? (2te Frage kann ich eigentlich
ausschließen, denn bei dem DMAC ist die Triggersource auf den ADCA.CH0
eingestellt.)
Kannst mir da vllt etwas nachhelfen?
Gruß Joe