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.
Nein, negative Spannung ist an keinem Pin zulässig. Das Vorzeichen kommt bei Differenzmessung zwischen 2 Pins ins Spiel.
DOCH. Der XMega kann negative Spannungen bis zur Flussspannung der internen Dioden messen, also bis etwa -0.6V.
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.
-1V ist nicht möglich. Jedenfalls nicht mit ausreichender Auflösung und nicht ohne Spannungsteiler.
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 | ARef oder Vcc |
2 | | |
3 | | |
4 | .-. |
5 | | | 100k |
6 | | | |
7 | '-' |
8 | | |
9 | || | ___ |
10 | Sensor -------||-------o-----|___|------ ADC Eingang |
11 | || | |
12 | | 10k Single Ended |
13 | | 1µF .-. |
14 | | | | |
15 | | | | 100k |
16 | | '-' |
17 | | | |
18 | | | |
19 | | | |
20 | --- --- |
Wenn der Sensor ein Piezo ist, dann muß noch ein Widerstand von 1MOhm direkt über den Piezo geschaltet werden.
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!)
So wie Du meinst, geht´s nicht, aber so:
1 | ARef oder Vcc |
2 | | |
3 | o--------. |
4 | | | |
5 | | | |
6 | .-. .-. |
7 | 100k| | | | 100k |
8 | | | | | |
9 | '-' '-' |
10 | | | 10k ADC |
11 | | | ___ |
12 | Sensor + -----------o--------)----|___|------ pos |
13 | | | |
14 | | | 10k |
15 | | | ___ |
16 | Sensor - -----------)--------o----|___|------ neg |
17 | | | |
18 | | | |
19 | .-. .-. |
20 | 100k| | | | 100k |
21 | | | | | |
22 | '-' '-' |
23 | | | |
24 | --- --- |
25 | (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.
Ich schaue mal nach dem WE mal wieder vorbei und berichte ob es geklappt hat. Finde im Moment einfach keine Zeit. Gruß Joe
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
Kleiner als Vcc und aufgrund eines Erratum auch besser kleiner/gleich 2.4V.
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 | void ADCA_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 |
18 | //Positiven und negativen Eingang wählen
|
19 | ADC_Ch_InputMux_Config( &ADCA.CH0, |
20 | ADC_CH_MUXPOS_PIN1_gc, //PIN1 als positiv |
21 | ADC_CH_MUXNEG_PIN2_gc); //PIN2 als negativ |
22 | //Warten bis der ADC bereit ist
|
23 | ADC_Wait_32MHz(&ADCA); |
24 | //ADC A aktivieren
|
25 | ADC_Enable(&ADCA); |
26 | //Offset des ADCA berechnen
|
27 | //offset = ADC_Offset_Get_Signed(&ADCA, &(ADCA.CH0), true);
|
28 | }
|
DMA
1 | void SetupReadChannel( DMA_CH_t * dmaChannel ) |
2 | {
|
3 | DMA_SetupBlock( dmaChannel, //Channelangabe |
4 | (void const *) (0x224), //Quelladresse: ADC.CH0.RES = 0x224 ; ADC_Result = 0x200F |
5 | DMA_CH_SRCRELOAD_BURST_gc, |
6 | DMA_CH_SRCDIR_INC_gc, |
7 | samples, |
8 | DMA_CH_DESTRELOAD_BLOCK_gc, |
9 | DMA_CH_DESTDIR_INC_gc, |
10 | ADC_WERTE, |
11 | DMA_CH_BURSTLEN_2BYTE_gc, |
12 | 0, |
13 | false
|
14 | );
|
15 | |
16 | DMA_EnableSingleShot( dmaChannel ); |
17 | DMA_SetTriggerSource( dmaChannel, DMA_CH_TRIGSRC_ADCA_CH0_gc ); //ADCA als Triggerquelle |
18 | }
|
main
1 | int main(void){ |
2 | |
3 | clock_init(); //Clock initialisieren |
4 | ADCA_init(); //ADCA initialisieren |
5 | // The DMA channel to use for reading switch state.
|
6 | DMA_CH_t * ReadChannel = &DMA.CH0; |
7 | |
8 | // Prepare DMA
|
9 | DMA_Enable(); |
10 | SetupReadChannel(ReadChannel); |
11 | while(1){ |
12 | //ADC_result = ADC_ResultCh_GetWord_Signed(&ADCA.CH0,
|
13 | 2); |
14 | |
15 | DMA_EnableChannel( ReadChannel ); |
16 | DMA_ReturnStatus_blocking( ReadChannel ); |
17 | }
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.