mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMEGA 128A1 ADC negative Spannung


Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, negative Spannung ist an keinem Pin zulässig.

Das Vorzeichen kommt bei Differenzmessung zwischen 2 Pins ins Spiel.

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

alles klar Danke.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DOCH. Der XMega kann negative Spannungen bis zur Flussspannung der 
internen Dioden messen, also bis etwa -0.6V.

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-1V ist nicht möglich. Jedenfalls nicht mit ausreichender Auflösung und 
nicht ohne Spannungsteiler.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

                                 ARef oder Vcc
                                |
                                |
                               .-.
                               | | 100k
                               | |
                               '-'
                                |
                       ||       |      ___
       Sensor   -------||-------o-----|___|------ ADC Eingang
                       ||       |
                                |       10k       Single Ended
         |           1µF       .-.
         |                     | |
         |                     | | 100k
         |                     '-'
         |                      |
         |                      |
         |                      |
        ---                    ---


Wenn der Sensor ein Piezo ist, dann muß noch ein Widerstand von 1MOhm 
direkt über den Piezo geschaltet werden.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie Du meinst, geht´s nicht, aber so:


                                      ARef oder Vcc
                                        |
                                        o--------.
                                        |        |
                                        |        |
                                       .-.      .-.
                                   100k| |      | | 100k
                                       | |      | |
                                       '-'      '-'
                                        |        |     10k        ADC
                                        |        |     ___
                   Sensor +  -----------o--------)----|___|------ pos
                                        |        |
                                        |        |     10k
                                        |        |     ___
                   Sensor -  -----------)--------o----|___|------ neg
                                        |        |
                                        |        |
                                       .-.      .-.
                                   100k| |      | | 100k
                                       | |      | |
                                       '-'      '-'
                                        |        |
                                       ---      ---
(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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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! :)

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. :-(

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PortA, Pin0 wäre ein guter Kandidat für einen Referenzpin.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schaue mal nach dem WE mal wieder vorbei und berichte ob es geklappt 
hat. Finde im Moment einfach keine Zeit.

Gruß Joe

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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*

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner als Vcc und aufgrund eines Erratum auch besser kleiner/gleich 
2.4V.

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war ja ´ne schwere Geburt ;-).

Autor: Joe F. (joe1234)
Datum:

Bewertung
0 lesenswert
nicht 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
void ADCA_init(void){
  //ADCA signed Conversion Mode und Auflösung 12 Bit
  ADC_ConvMode_and_Resolution_Config(&ADCA, 
                    ADC_ConvMode_Signed, 
                    ADC_RESOLUTION_12BIT_gc);
    //Free running mode aktivieren
    ADC_FreeRunning_Enable(&ADCA);
  //ADC Clock (32MHz/x = y kHz)
  ADC_Prescaler_Config(&ADCA, 
              ADC_PRESCALER_DIV4_gc);
  //Referenzsignal für ADCA auf Iternal 1V
    ADC_Reference_Config(&ADCA, 
              ADC_REFSEL_VCC_gc); //INT1V
  // Setup channel 0 to have single ended input
  ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH0,
                                   ADC_CH_INPUTMODE_DIFF_gc,   //differential mode ohne gain
                                   ADC_CH_GAIN_1X_gc);    //gain faktor <- wird nicht verwendet
    //Positiven und negativen Eingang wählen
  ADC_Ch_InputMux_Config( &ADCA.CH0, 
                            ADC_CH_MUXPOS_PIN1_gc,         //PIN1 als positiv
                            ADC_CH_MUXNEG_PIN2_gc);        //PIN2 als negativ
  //Warten bis der ADC bereit ist
    ADC_Wait_32MHz(&ADCA);
    //ADC A aktivieren
  ADC_Enable(&ADCA);
  //Offset des ADCA berechnen
  //offset = ADC_Offset_Get_Signed(&ADCA, &(ADCA.CH0), true);        
}

DMA
void SetupReadChannel( DMA_CH_t * dmaChannel )
{
  DMA_SetupBlock( dmaChannel,          //Channelangabe
              (void const *) (0x224),    //Quelladresse: ADC.CH0.RES = 0x224 ; ADC_Result = 0x200F
                    DMA_CH_SRCRELOAD_BURST_gc, 
                    DMA_CH_SRCDIR_INC_gc,
              samples, 
                    DMA_CH_DESTRELOAD_BLOCK_gc, 
                    DMA_CH_DESTDIR_INC_gc,
              ADC_WERTE, 
                    DMA_CH_BURSTLEN_2BYTE_gc, 
                    0,
                    false
                );
  
    DMA_EnableSingleShot( dmaChannel );
  DMA_SetTriggerSource( dmaChannel, DMA_CH_TRIGSRC_ADCA_CH0_gc ); //ADCA als Triggerquelle
}

main
int main(void){

  clock_init();    //Clock initialisieren
  ADCA_init();    //ADCA initialisieren
  // The DMA channel to use for reading switch state.
    DMA_CH_t * ReadChannel = &DMA.CH0;
  
  // Prepare DMA
    DMA_Enable();
    SetupReadChannel(ReadChannel);
while(1){
    //ADC_result = ADC_ResultCh_GetWord_Signed(&ADCA.CH0, 
                          2);

    DMA_EnableChannel( ReadChannel );
    DMA_ReturnStatus_blocking( ReadChannel );
  }

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.