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...
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
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!
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...
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
Ich habe immer sehr gute Erfahrungen mit den AVRs gemacht, die Meßwerte stehen, wie ne Eins. Ich tippe daher auf ein Softwareproblem. Peter
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
@ 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...
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
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 ;)
@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.
Du könntest auch einen Kondesator zusätzlich an den ADC Pin gegen GND versuchen.
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.
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...
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...
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...
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.
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)
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.
<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)
@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 !?
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.
Ja, schon klar... hatte hier aber nichts mit dem Problem zu tun...
Hallo, Ein Übersprechen kann auch durch Flußmittel verursacht werden. Dies war bei mir der Fall
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.