XMEGA 128A1 ADC negative Spannung

OP #1886706
Lesenswert?

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.
#1887840
Lesenswert?

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
(Firma: TravelRec.) Persönliche Seite #1887967
Lesenswert?

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.
#1890096
Lesenswert?

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
(Firma: TravelRec.) Persönliche Seite #1890675
Lesenswert?

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.
#1891189
Lesenswert?

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.
(Firma: TravelRec.) Persönliche Seite #1892667
Lesenswert?

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.
#1892919
Lesenswert?

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.
(Firma: TravelRec.) Persönliche Seite #1893286
Lesenswert?

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.
Gast #1893345
Lesenswert?

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-
#1894303
Lesenswert?

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
(Firma: TravelRec.) Persönliche Seite #1894405
Lesenswert?

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.
#1894572
Lesenswert?

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
(Firma: TravelRec.) Persönliche Seite #1894850
Lesenswert?

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.
#1896454
Lesenswert?

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! :)
(Firma: TravelRec.) Persönliche Seite #1896471
Lesenswert?

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. :-(
#1897317
Lesenswert?

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.
#1913814
Lesenswert?

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
#1916557
Lesenswert?

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
#1916628
Lesenswert?

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
#1921970
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren