Liste der Anhänge anzeigen (Anzahl: 1)
ATXmega128A1 Rev. H unerklärliches ADC-Phänomen
Hallo zusammen,
ich habe ein mir nicht ganz erklärliches Phänomen bei einem Projekt von mir.
Wie der Titel schon vermuten lässt, geht es um die AD-Wandlung auf meinem ATXmega128A1-Breakoutboard.
Ich habe zwei Linearpotentiometer als unbelasteten Spannungsteiler, mit denen ich eine Position ermitteln möchte, was auch vom Prinzip her funktioniert, dank der Hilfe von Kampis Tutorial. Leider tritt an bestimmten Stellungen der Potentiomer das Phänomen auf, dass die AD-Wandlung 10 mal funktioniert und dann wird der maximale Wert, der als Referenz gemessen wurde über USART rausgeschrieben. Ich bilde zusätzlich den Mittelwert der letzten 10 Messwerte, um ein wenig das Flattern bei der 12Bit-Auflösung rauszunehmen.
Die Ausgabe sieht dann zum Beispiel so aus:
Code:
USART up and running.
lower: 745 upper: 812
lower:3644 upper:3645
Correction Lower: 2.899 Correction Upper: 2.833
...
lower: 1014 upper: 6
lower: 1014 upper: 1014
lower: 1014 upper: 7
lower: 1014 upper: 6
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 8
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 7
lower: 1014 upper: 1014
lower: 1014 upper: 8
lower: 1014 upper: 4
lower: 1014 upper: 8
lower: 1014 upper: 4
...
An diesem Beispiel ist glaube ich relativ ersichtlich, dass die Messungen mit upper:1014 zwischendrinne ziehmlicher mumpitz sind.
Ein ähnliches Phänomen habe ich in der genau anderen Richtung auch, nur dass da ein negativer Wert auftauch mit -430. Als Ausgabe sieht das dann ungefähr so aus:
Code:
...
lower: 4 upper: 1014
lower: 3 upper: -430
lower: 0 upper: 1014
lower: 1 upper: 1014
lower: 3 upper: 1014
lower: 4 upper: 1014
lower: 3 upper: 1014
lower: 5 upper: 1014
lower: 5 upper: 1014
lower: 4 upper: 1014
lower: 3 upper: 1014
lower: 2 upper: 1014
lower: 5 upper: -430
lower: 3 upper: 1014
lower: 4 upper: 1014
lower: 2 upper: 1014
lower: 3 upper: 1014
...
Jetzt ist vielleicht noch interessant, wie ich auf diese Werte komme und das passiert mit folgender Berechnung:
Position = (Messwert - Offset)/((maximalerMesswert - minimalerMesswert)/anzahlMesspunkte)
AnzahlMesspunkte ist in meinem Fall 1000.
Damit wäre beschrieben, wie ich auf diese lustigen Werte komme.
Da der Beitrag wahrscheinlich schon lang genug ist, packe ich die wichtigsten Auszüge aus meinem Code in den Anhang.
Die ADC ist als 12Bit Singleended unsigned mit einer externen Referenzspannung von 3,3V an Pin0 initalisiert. (näheres im Code)
Um die Frage nochmal zu konkretisieren, die ich habe:
Kennt jemand das Problem und hat evtl. eine Lösung dafür, oder muss ich mit diesen "Ausreißern" leben, die mir evtl das Leben ein wenig schwerer machen könnten. Sprich ich muss eine Plausibilitätsprüfung für die Werte einfügen.
Achja, wer auch eine Idee hat, wie ich die werksseitigen Kalibrierungswerte rausbekomme, so dass ich zum Schluss kein Offset mehr habe von der ADC, der darf sie auch gerne Posten, da wäre ich nicht sauer drüber ;)
Danke und Grüße
Oreas
P.S.: habe versucht so viel wie geht zusammen zu kürzen im Anhang und hoffe alles ausreichend kommentiert zu haben. Sollte dem nicht der Fall sein, so stehe ich gerne Rede und Antwort. Und sry, dass alles in einer Datei gelandet ist ^^
Liste der Anhänge anzeigen (Anzahl: 1)
Hey Daniel,
hatte ich auf deiner HP auch schon gesehen, aber der Compiler wehrt sich wehement mit folgender Fehlermeldung dagegen:
"expected identifier before '__builtin_offsetof'"
und da bin ich seit gestern Abend noch nicht weiter gekommen.
Ich hatte in einem anderen Forum http://www.mikrocontroller.net/topic/120008 diesen Beitrag gefunden und das mal eingebaut und der Compiler beschwert sich nicht. Was mich daran aber etwas Stutzig macht ist, dass
ADCA. CALL = 255
ADCA.CALH = 0
ist und das kann ich irgendwie schwer glauben.
Das Delay hatte ich eingebaut, weil ich festgestellt hatte, dass die Werte dann zuverlässiger kommen, als wenn ich das weg lasse, aber ich nehme es mal raus. Das mit den 100kHz im Kommentar (habe ich gerade eben erst gesehen) stimmt leider nicht meht ^^ das sind nur 10kHz wir im Kommentar zum Timer beschrieben. Lade dann noch gleich eine geänderte Version hoch, sry.
Aber im Endeffekt wirst du wahrscheinlich recht haben, dass ich ein richtiges Timing-Problem generiert habe, dass der Interrupt einfach zu lange braucht und ich mir was andere einfallen lassen muss.
Trotzdem gerne weiter Kommentare/Anregungen posten, wie ich mein Problem lösen kann. Ich entwickel auch gerne unter Anleitung selbst, solange jemand dann mal drüber schaut, ob das, was ich gemacht habe nicht vllt doch etwas Mist ist ;)
EDIT: da ist sie schon :)