Forum: Mikrocontroller und Digitale Elektronik ADC-Kanäle beeinflussen sich gegenseitig? (


von Tino K. (tinokuba)


Lesenswert?

Halle liebe µC-Community,
erstmal möchte ich hier erwähnen wie toll ich diese seite+forum finde. 
Sie hat mir schon oft bei meinen projekten geholfen.
nun nachdem ich immer nur gelesen habe melde ich mich jetzt auch mal zu 
wort:



mein anliegen besteht in folgendem:

Ich verwende einen Beschleunigungssensor (MMA7330L), der Messungen in 
den 3 Raumachsen macht und für jede Raumachse (also X, Y und Z) auf 
einem jeweiligen Pin eine analoge Spannung ausgibt.
ich hab die pins an jeweils einen Pin des internen ADC des mega16 
angeschlossen. nebenbei habe ich an einen weiteren adc-kanal noch einen 
luftdrucksensor von motorrola (MPX4115A) angeschlossen.

als testapplikation werden kanäle nacheinander gemessen und die rohen 
digitalwerte auf ein LCD-display ausgegeben.

ich habe nun folgendes problem:
wenn ich die platine hin und her drehe ändern sich logischerweise die 
messwerte des beschleunigungssensors, da die fallbeschleunigung anders 
auf die achsen des sensors einwirkt. X-/Y-/Z-Wert ändern sich 
logischerweise auf dem LCD-display. Die sache ist nun die das auch der 
Luftdruckwert ziemlich stark anfängt zu schwanken, was ja unlogisch ist 
da sich beim drehen der platine nicht der luftdruck ändert.

nach langer fehlersuche hab ich aus verzweiflun etwas getan was man 
eigentlich keinem sagen sollte:

vor der messung eines kanals hab ich die anderen kanäle per software als 
ausgang definiert und auf 0 gesetzt...

logischerweise wurde der beschleunigungssensor daraufhin sehr warm und 
die stromaufnahme stieg (da ich ja die ausgänge kurzgeschlossen hab), 
aber siehe da die luftdruckmesswerte blieben konstant und auch die 
beschleunigungsmesswerte wurden auf einmal sehr viel genauer und 
schwankten nicht mehr so stark wie vorher.

also komm ich zu dem schluss das sich die ADC-Kanäle des AVR gegenseitig 
beeinflussen. Ich denk mal das wird für die meisten von euch nichts 
neues sein



Hat einer von euch eine Idee für die Lösung dieses problems?
ich meine das kurzschließen eines sensors ist ja nicht gerade elegant...

ich hatte noch die idee per transistoren die sensoren vom ADC zu trennen 
wenn sie gerade nicht ausgelesen werden, aber die weisen doch, wenn ich 
mich nicht irre, einen Spannungs-Drop auf welcher den Messwert 
verfälscht, oder?


ich danke schonmal im Vorraus...

von Christoph B. (christophbudelmann) Benutzerseite


Lesenswert?

Tino K. schrieb:
> ich hatte noch die idee per transistoren die sensoren vom ADC zu trennen
> wenn sie gerade nicht ausgelesen werden, aber die weisen doch, wenn ich
> mich nicht irre, einen Spannungs-Drop auf welcher den Messwert
> verfälscht, oder?

Ich glaube nicht, dass das Übersprechen im Atmega selbst geschieht, 
sondern zwischen den Leitungen zum Atmega hin. Eventuell solltest du 
nochmal dein Platinenlayout überarbeiten oder hier mal zur Diskussion 
stellen.

Abblockkondensatoren an AREF und AVCC hast du? Ist die Masse AGND 
irgendwie von der Masse GND getrennt (bzw. nur an einer einzigen Stelle 
wieder zusammengeführt)?

Gruß

Christoph

von AtomDragon (Gast)


Lesenswert?

Ahm, ich glaube iwo mal gelesen zu haben das man den ADC Multiplexer 
intern iwie auch auf GND legen kann und das am besten vor jeder Messung 
tuen sollte!

von Tino K. (tinokuba)


Lesenswert?

danke für die schnellen antworten :)


@Christoph Budelmann
abblockkondensatoren hab ich. 100n versteht sich...

ich wüsste nicht wie ich das layout verbessern köntte. die leitungen 
gehen parallel voneinander weg (weil die pins ja nebeneinander liegen) 
und verzweigen dann zum jeweiligen sensor.

eine weitere info vielleicht noch: ich habe die pins der verbleibenden 
adc-kanäle anfangs als I/O-Ports weiter genutzt, wenn ich da aber eine 1 
angelegt hab, haben sich wiederum die sensor-messdaten stark verändert. 
so bin ich ja auch eigentlich erst darauf gekommen das die kanäle 
übersprechen könnten.
später hab ich die dann einfach während einer messung einfach auf 0 
gelegt und die messdaten wurden besser.

ich hab hier im forum einen beitrag gefunden in dem es um den parallelen 
twi-betrieb und adc-betrieb bei einem mega8 gefunden (bei dem sich ja 
twi- und adc pins teilen) und da wurde auch davon abgeraten während 
einer adc-messung das twi zu benutzen, da es die messwerte verfälschen 
kann. also scheint die problematik nicht unbekannt zu sein...



@AtomDragon
achso? das würde natürlich einiges erklären, aber ich dazu hier noch 
nichts gefunden. auch im datenblatt nicht, aber das ist ja sehr lang, 
vielleicht hab ich was übersehen...

von Reinhard R. (reinhardr)


Lesenswert?

Der AVR hat nur einen einzigen AD-Wandler, dem ein Multiplexer voran 
geschaltet ist um auf mehrere Kanäle zu kommen. Teile der internen 
Schaltung des AVRs müssen deshalb bei jedem Kanalwechsel die Spannung 
wechseln. Das geschieht aufgrund diverser Kapazitäten nicht beliebig 
schnell, so dass vor allem die vorangegangene Messung noch einen 
Einfluss haben kann.

Versuche mal nur den Barometer auszulesen, ohne den Kanal zu wechseln 
oder den Beschleunigungssensor kurz zuschließen. Wie sieht dann das 
Ergebnis aus?

Falls der Multiplexer schuld ist, kannst du deine Ergebnisse verbessern 
indem du jeden Kanal mehrmals misst, bevor du zum nächsten gehst, oder 
wie oben erwähnt zwischendurch eine GND Messung durchführst. Die erste 
Messung nach dem Umschalten kann man ev. dann verwerfen.

Gruß
Reinhard

von Peter D. (peda)


Lesenswert?

Ich habe immer sehr gute Erfahrungen mit den AVRs gemacht, die Meßwerte 
stehen, wie ne Eins.

Ich tippe daher auf ein Softwareproblem.


Peter

von spess53 (Gast)


Lesenswert?

Hi

Mögliche Fehlerquelle sind auch:

- ADC- Takt zu hoch
- Die Impedanzen deiner Sensoren sind zu hoch. Nach dem Umschalten des
  Multiplexers muss der Sample- and Hold-Kondensator umgeladen werden. 
Wenn
  deine Sensoren nicht genug Strom liefern beeinträchtigen sich die 
Kanäle.

MfG Spess

von Tino K. (tinokuba)


Lesenswert?

@ Reinhard R.
Danke, das probier ich gleich mal aus.

@Peter Danneger.
ich glaub auch nicht das es am AVR liegt. dann wär es sicherlich 
bekannter.

die software ist so aufgebaut wie es in dem hiesigen tutorial 
beschrieben ist. wenn ich nur einen messwert am ADC hab funktioniert es 
ja auch, aber sobald weitere hinzu kommen eben nicht.
komisch...

von Peter D. (peda)


Lesenswert?

Tino K. schrieb:
> die software ist so aufgebaut wie es in dem hiesigen tutorial
> beschrieben ist.

Wenn Du meinst.

Es reicht ein einziges falsches Zeichen und schon verhält sich ein 
Programm völlig anders.


Peter

von Anon Y. (avion23)


Lesenswert?

Hallo Tino,
ich hatte das selbe Problem. Ich habe dann nur jede zweite Messung 
verwendet und die Welt war wieder in Ordnung.

Impedanz der Sensoren sollte < 10kΩ sein.

Und vielleicht die ADC Frequenz senken, sollte den internen 
Kondensatoren mehr Zeit zum umladen geben.
Ich merke gerade, das ist das selbe wie von  spess53 ;)

von Tino K. (tinokuba)


Lesenswert?

@Peter Dannegger
Ja ich weiß, davor ist man nie gefeid. Fehler schleichen sich immer ein. 
Deshalb hab ichs ja immer und immer wieder überprüft und sogar dann noch 
2 mal von vorn neu geschrieben, aber ohne erfolg.


@spess53 & Anon Ymous
danke für die Info mit der Impedanz. Hab mal ins Datenblatt des 
Beschl-Sensors geschaut und da liegt wohl der Hund begraben^^

"Output Impedance: 32kOhm"

ich versuchs mal mit ADC-Takt senken bzw. immer nach dem umschalten den 
1. Messwert zu verwerfen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Du könntest auch einen Kondesator zusätzlich an den ADC Pin gegen GND 
versuchen.

von Thomas (kosmos)


Lesenswert?

wenn der Sensor eine Ausgangsimpedanz von nur 32 kOhm hat und man einen 
Kondensator einfügt wird das Signal noch weiter bedämpft. Wenn der 
Kondenstor voll ist hilf es der Sample&Hold Stufe sicherlich, wenn er 
aber ziemlich leer ist wegen niedrigen Werten des Sensors und der Wert 
des Sensors steigt dann wird das Signal des Sensors ja noch stärker 
belastet.

Wenn dann nur ein sehr kleiner Kerko um hohe Frequenzen zu bedämpfen, 
ansonsten lieber die Taktfrequenz des ADCs runterschrauben oder nach dem 
Umschalten des Multiplexers 1-2 Messungen verwerfen.

von Klaus (Gast)


Lesenswert?

Hallo,

ich habe gerade ein ähnliches Problem bei einem ATMega32.
Zum testen habe ich die Sensoren abgebaut und
einen der Eingänge über einen Spannungsteiler
(1 KOhm zwischen VCC und GND) angeschlossen.

Verbinde ich nun den zweiten Eingang mit VCC oder GND,
ändert sich der ermittelte Wert am ersten Port um einige "Zähler" !
Die Spannungsänderung an diesem Port ist sogar messbar, obwohl
sich weder die Versorgungsspannung noch der Spannungsteiler
verändern...


Hier mal ein paar Codeschnipsel:

Initialisierung des ADC:
1
void init(){
2
  // ADC Prescaler: 128 => 16000000/128= 125Khz
3
  ADCSRA=(1<< ADPS2) | (1<< ADPS1)  | (1<< ADPS0);
4
  // und den ADC starten
5
  ADCSRA |= (1<< ADEN);
6
};

Wandlung und Ergebnisrückgabe:
1
uint16_t analogRead(uint8_t Port){
2
3
    uint16_t result= 0;
4
5
  ADMUX  = Port;
6
  ADMUX |= (1<< REFS0);
7
8
  
9
  for (uint8_t i= 0;i<4;i++)
10
  {
11
    ADCSRA |= (1<< ADSC);
12
    while (ADCSRA & (1<< ADSC) );
13
          result+= ADCW; 
14
  }
15
  
16
  result /= 4;
17
  
18
19
  return result;
20
};

In der Hauptschleife werden die Werte ermittelt und
über die serielle Schnittstelle zum PC gesendet:
1
      WADC = analogRead(WTempADC);
2
      BADC = analogRead(BFillADC);


Danke für eure Gedanken zu dem Problem...

von Klaus (Gast)


Lesenswert?

Nachtrag:

In meiner Verzweiflung habe ich die Wandlung des
zweiten Ports mal ganz herausgenommen.

Das Ergebnis bleibt aber das selbe. Der angelegte
Spannungspegel am zweiten Port beeinflusst den
Spannungspegel am ersten Port, auch wenn am
zweiten Port keine Wandlung vorgenommen wird...

von Klaus (Gast)


Lesenswert?

Nachtrag 2: <sorry>

Da mein miniMega Board kleine DIP Switches an den
analogen Eingängen hat, habe ich mal nacheinander
alle verbleibenden Eingänge  (ausser der oben genannten)
auf VCC gelegt. Mit jedem so geschalteten Pin erhöht
sich die Spannung am ersten Eingang weiter...

von Anja (Gast)


Lesenswert?

Hallo Klaus,

> Die Spannungsänderung an diesem Port ist sogar messbar, obwohl
> sich weder die Versorgungsspannung noch der Spannungsteiler
> verändern...

Heißt das daß Du außen am Prozessorpin die Spannungsänderung mit dem 
Multimeter messen kannst?
Dann würde ich auf eine falsche Verdrahtung der Analogmasse tippen.

von Klaus (Gast)


Lesenswert?

Hallo Anja :o)

ja, genau. Die Spannungsänderung kann ich an den
Prozessorpins messen. Die Spannungen zwischen AREF/ AVCC
und AGND/GND bleiben konstant. Einen Fehler kann ich im
Schaltplan des miniMega Boards(Elektor) nicht finden.
Da muss ich mir wohl den Aufbau nochmal genauer ansehen,
denn:

Ich habe hier auch noch zwei Pollin AVR-NET-IO.
Den programmierten uC habe ich einfach mal in eines dieser
Boards gesteckt. Dort funktionieren die ADC Eingänge
tatsächlich fehlerfrei. Relevante Schaltungsunterschiede
sehe ich an der Stelle aber nicht. Den auf dem NET-IO Board
fehlenden Kondensator an AREF habe ich ergänzt...

Naja... vielleicht hilft ja nachlöten ;o)

von Uhu U. (uhu)


Lesenswert?

Der µC enthält nur einen ADC, der über einen Multiplexer auf 
verschiedene Pins geschaltet wird.

Diese Umschaltprozeß braucht etwas Zeit, bis der MUX usw. auf den neuen 
Zustand eingeschwungen ist. Gibst du ihm die Zeit nicht, dann siehst du 
einen Einfluß des vorherigen Kanals auf den aktuellen.

Aber das ist alles hier im Thread schon beschrieben worden und du bist 
nur zu faul zum lesen.

von Klaus (Gast)


Lesenswert?

<Argh>

manchmal sieht man den Wald vor lauter Bäumen nicht...

Das miniMega Board hat ein Pulldown Widerstandsarray (8x10k)
am PortA. Dieses Array kann über einen Jumper deaktiviert werden
(Masseverbindung wird unterbrochen). Die ADC Kanäle bleiben dann
aber durch das Array (mit jeweils 2x 10k Ohm) miteinander verbunden.

Ich habe das Array nun entfernt und die ADC Wandlung läuft
fehlerfrei und ohne Beeinflussung der Kanäle untereinander :o)

von Klaus (Gast)


Lesenswert?

@Uhu

Danke für deinen sehr brauchbaren Kommentar :o( .

Hättest du meine Beiträge vernünftig gelesen, so
hätte dir wohl auffallen müßen, das der Fehler
nicht in der Wandlung begründet war.

in meinen Codeschnipseln wäre dir die Umschaltung des
Multiplexers dann eventuell auch aufgefallen !?

von Simon K. (simon) Benutzerseite


Lesenswert?

Klaus schrieb:
> in meinen Codeschnipseln wäre dir die Umschaltung des
> Multiplexers dann eventuell auch aufgefallen !?

Wenn du verlangst, dass andere deine Beiträge lesen, solltest du das 
auch bei anderen machen.

Es war die Rede davon, nach dem Umschalten eine Zeit zu warten, bis der 
Mux auch umgeschaltet hat und sich der Sample&Hold Kondensator 
aufgeladen hat.
Das steht aber auch im Datenblatt, meine ich. Also die Zeit, bis man die 
nächste Wandlung machen kann nachm Umschalten.

von Klaus (Gast)


Lesenswert?

Ja,

schon klar... hatte hier aber nichts mit dem Problem zu tun...

von branhel (Gast)


Lesenswert?

Hallo,

Ein Übersprechen kann auch durch Flußmittel verursacht werden. Dies war 
bei mir der Fall

von chris (Gast)


Lesenswert?

schalt mal zwischen jeder messung die kanäle auf 0V also $0F ins admux 
schreiben, hatte das prob vor kurzen auch hohe spannung gemessen danach 
kleine spannung und die war ein deutig zu hoch admux auf $0F kurz 
geschaltet und siehe da prob war gelöst vielleicht hilfts ja

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
Noch kein Account? Hier anmelden.