Hallo,
ich versuche mit dem ATXMEGA384C3-AU eine Spannung am ADC PORT_A zu
messen.
Als Referenzspannung ist "AREFA" ausgewählt, an diesem liegt einfach die
Spannungsversorgung von 3,3V an. Die Spannungsversorgung AVCC und den
die AREF Beschaltung habe ich wie in
"Schematic-Checklist_Application-Note" ausgeführt.
Nun ist es aber so das ich einen ansteigenden Messfehler feststellen
kann. Der ermittelte Wert weicht von dem erwarteten ab, und ist immer zu
hoch. Ab ca. 2,6V ist der Wertebereich am Maximum angekommen. Spannungen
zwischen 2,6V und 3,3V kann ich überhaupt nicht messen, das der Wert
4095 beträgt. Ein Screenshot aus dem Excel ist anbei um dies anschaulich
zu machen.
Es sind insgesamt 6 Analogeingänge beschaltet, 4x ein Poti und 2x eine
Batteriespannungsmessung über einen 2:1 Spannungsteiler (9k76/3k24). Es
werden alle nacheinander 15mal gemessen und danach wird ein Mittelwert
in der Hauptschleife gebildet.
Ich kann den Fehler nicht finden, und bitte euch um Hilfestellung.
Vielen Dank schon mal vorab.
Die Inititialisierung des ADC ist wie folgt ausgeführt:
1
voidADCA_CH0_INI(void)
2
{
3
ADCA.CTRLB=ADC_RESOLUTION_12BIT_gc;//12 Bit Auflösung, rechts anschlag / convmode 0 unsigned
4
ADCA.REFCTRL=ADC_REFSEL_AREFA_gc;//External reference on PORT A
5
ADCA.PRESCALER=ADC_PRESCALER_DIV256_gc;//eine Messung aller 0,11ms (15x Mittelwert auf 6 Pins = 10ms Total) [ 1000ms / ((32.000.000Mhz/256PRESCALER)/14TakteProMessung) ]
Thomas W. schrieb:> Nun ist es aber so das ich einen ansteigenden Messfehler feststellen> kann. Der ermittelte Wert weicht von dem erwarteten ab, und ist immer zu> hoch.
Deine Referenzspannung besitzt einen anderen Wert, als du angenommen
hast. Dein "ansteigender Messfehler" ist ganz wesentlich ein
Skalierungsfaktor und beim letzten Wert (3V) wohl eine Übersteuerung.
Deine Messdaten in Form einer Pixelmatrix laden jetzt allerdings nicht
dazu ein, nachzurechnen.
Hast du die Referenzspannung und die Eingangsspannungen direkt am µC
gemessen oder woher kommen die Werte?
Vielen Dank für deine schnelle Antwort.
Mit dem DMM kann ich 3,29V messen.
Meist du ich sollte diese Spannung mit dem Oszi überprüfen?
Die Kritik mit der Pixelmatrix kann ich nicht ganz verstehen, bei mir am
Handy lädt das Bild ganz sauber. Eine Tabelle mit dem Messwerten ist
auch dabei. Oder meinst du etwas anderes?
Die Kuve in der Steilheit mathematisch anzupassen konnte realisieren,
aber Messwerte über 2,6V kann ich damit auch nicht erfassen.
Schon mal über einen Fehler in der Software sinniert?
Im (fast) oberen Bereich sieht das mehrfach nach 25% zuviel aus
Thomas W. schrieb:> Es> werden alle nacheinander 15mal gemessen und danach wird ein Mittelwert> in der Hauptschleife gebildet.
Mal ganz unabhängig davon, dass 15× nun wirklich nicht der wahre Sack
der Zwerge ist.
(sum(16×) + 2¹¹) >> 4 wohl schon eher.
S. L. schrieb:>> aber Messwerte über 2,6V kann ich damit auch nicht erfassen>> Liegt es vielleicht an dem "Max. AVcc-0.6"?> Nur eine Laienmeinung.
Danke. 3,3V - 0,6V = 2,7V das ist so ungefähr der Messwert ab wann der
Überlauf auftritt.
Thomas W. schrieb:> Die Kritik mit der Pixelmatrix kann ich nicht ganz verstehen, bei mir am> Handy lädt das Bild ganz sauber.
Eben - ein Bild.
Um mit den Daten rechnen zu können, ist ein PNG-Bild ein relativ
ungünstiges Format. OCR tue ich mir jetzt nicht an und abtippen mag ich
die Werte auch nicht ;-)
> Mit dem DMM kann ich 3,29V messen.> Meist du ich sollte diese Spannung mit dem Oszi überprüfen?
Wer von den beiden (DMM oder Oszi) besser misst, kannst du den
technischen Daten im Handbuch entnehmen. Das Oszi verrät dir, ob es sich
um eine saubere Gleichspannung handelt.
Rainer W. schrieb:> Thomas W. schrieb:> Eben - ein Bild.> Um mit den Daten rechnen zu können, ist ein PNG-Bild ein relativ> ungünstiges Format. OCR tue ich mir jetzt nicht an und abtippen mag ich> die Werte auch nicht ;-)>
Und ich dachte mir das Niemand eine fremde Excelsheet öffnen möchte, und
wollte der verbale Prügel aus dem Weg gehen.
> Wer von den beiden (DMM oder Oszi) besser misst, kannst du den> technischen Daten im Handbuch entnehmen. Das Oszi verrät dir, ob es sich> um eine saubere Gleichspannung handelt.
Ich dachte jetzt an einen Spannungsabfall während der Wandlung. Aber
scheinbar hat es sich erledigt, mit dem Hinnweis Aref MAX = AVCC-0,6V.
Das werde ich als nächstes prüfen.
Thomas W. schrieb:> Und ich dachte mir das Niemand eine fremde Excelsheet öffnen möchte, und> wollte der verbale Prügel aus dem Weg gehen.
Es gibt auch andere Formate, in denen man numerische Werte
transportieren kann als ausgerechnet als Bild.
CSV wäre so ein Kandidat.
Nachdem ich mir mal etwas 6MB Großes, welches Microchip allen Ernstes
als Datasheet bezeichnet, herunter geladen haben, stimme ich S.L. zu.
Hätte nicht gedacht, dass die Dinger kein ›normales‹ Aref vertragen.
Aber man kann ›Internal AVCC/2‹ selektieren und dann die Eingänge wohl
durch einen 1:2 Abschwächer laufen lassen. Obwohl das nur für
›differential input with gain‹ gilt, vielleicht hilft's ja wenn nur
wenige Eingänge gebraucht werden.
Bevor ich's vergesse, das was der Norbert oben zur Mittelwertbildung
geschrieben hat ist natürlich kolossaler Unsinn. Keine Ahnung welcher
Dämon ihn da heimgesucht hat.
Wenn man 2^n Werte sammelt, dann muss man selbstverständlich zur Rundung
2^(n-1) addieren und anschließend um n nach rechts schieben.
Norbert schrieb:> Aber man kann ›Internal AVCC/2‹ selektieren und dann die Eingänge wohl> durch einen 1:2 Abschwächer laufen lassen.
Möchtest du ratiometrisch messen oder absolute Spannungswerte?
Für Absolutmessungen ist es eine halb gute Idee, die Versorgungsspannung
als Referenz zu verwenden, weil du damit von deren Spannungsregler und
der Belastung abhängig bist.
Rainer W. schrieb:> Für Absolutmessungen ist es eine halb gute Idee, die Versorgungsspannung> als Referenz zu verwenden, weil du damit von deren Spannungsregler und> der Belastung abhängig bist.
Ich will das nicht, Thomas will das.
> Als Referenzspannung ist "AREFA" ausgewählt, an diesem liegt> einfach die Spannungsversorgung von 3,3V an.
Und genau das (die volle Vcc) geht ja wohl mit dem XMEGA Teil aus
unerfindlichen Gründen nicht. Daher der Würgaround mit halber Vcc und
halbierter Eingangsempfindlichkeit.
Bräuchte man's genau, dann externe Referenz (TL431 scheint ein netter
2.5V Kandidat zu sein)
Thomas W. schrieb:> Es werden alle nacheinander 15mal gemessen und danach wird ein> Mittelwert in der Hauptschleife gebildet.
Ich würde statt dieses starren "16 Werte einsammeln und dann Dividieren"
eine exponentielle Mittelwertbildung nehmen, die ähnlich wie ein
RC-Glied dem Eingangswert folgt. Und wenn man die schlau aufsetzt, dann
kann die direkt in der ISR laufen, ohne dass sie mehr Rechenzeit als die
jetztige "Einsammelfunktion" benötigt:
- https://www.lothar-miller.de/s9y/archives/25-Filter-in-C.html
Weil dein "ADC_Mittelwert" keinen Mittelwert, sondern die Summe von
Messwerten enthält, ist der der Variablenname "ADC_Mittelwert" falsch.
Deine ISR sähe bei mir dann so aus:
1
ISR(ADCA_CH0_vect)
2
{
3
ADCA.CH0.INTFLAGS=ADC_CH_CHIF_bm;
4
if(ADCA.CH0.RES>ADCA_CH0_Offset){
5
ADC_Buffer[ADC_CH0_PIN-1]-=ADC_Mittelwert[ADC_CH0_PIN-1];// alten Mittelwert abziehen
6
ADC_Buffer[ADC_CH0_PIN-1]+=ADCA.CH0.RES;// neuen ADC-Wert aufaddieren
7
ADC_Mittelwert[ADC_CH0_PIN-1]=ADC_Buffer[ADC_CH0_PIN-1]>>4;// neuen Mittelwert übernehmen
8
}
9
// Mux weiterschalten
10
if(ADC_CH0_PIN>ADCA_CH_PIN_Anzahl)ADC_CH0_PIN=1;
11
elseADC_CH0_PIN++;
12
// Messung starten
13
ADCA.CH0.MUXCTRL=(ADC_CH0_PIN&0x0F)<<3;
14
}
Beim jedem Zugriff auf ADC_Mittelwert könnte dann in der Hauptschleife
ein gültiger Wert gelesen werden, statt wie bisher noch das Ende des
Einsammelns abzuwarten und dann durch 16 zu dividieren.
BTW:
ADC_CH0_PIN --> Ein Tipp: nimm GROSSBUCHSTABEN nur für konstante Werte
wie z.B. Defines.
BTW2:
diese Zeile
1
if(ADC_CH0_PIN>=(ADCA_CH_PIN_Anzahl+1))...
wäre so leichter les- und verstehbar:
1
if(ADC_CH0_PIN>ADCA_CH_PIN_Anzahl)...
BTW3:
Dieser Kommentar sieht mir recht dubios nach einem hingebastelten
Workaround aus:
1
//nur wenn größer Offsetwert um echten O Wert bekommen zu können
Zuerst vielen Dank für dein Mühe. :-)
Lothar M. schrieb:> Weil dein "ADC_Mittelwert" keinen Mittelwert, sondern die Summe von> Messwerten enthält, ist der der Variablenname "ADC_Mittelwert" falsch.
So aus dem Zusammenhang gerissen hast du recht, die Variable speichert
nur die Summe aller Messwerte. Später in der Hauptschleife wird daraus
ein Mittelwert, aber auch mit anderer Variable
Ein gleitenden Mittelwert hat auch seine Vorzüge, dass steht außer
Frage. Ich habe es mir gespeichert (Danke dafür) und probiere es später
aus. Da ich Laie bin ist mir der Trick mit ">>4" nicht in den Sinn
gekommen, und Divisionen in der ISR wollte ich vermeiden.
> BTW: & BTW2: ...
ACK
> BTW3:> Dieser Kommentar sieht mir recht dubios nach einem hingebastelten> Workaround aus://nur wenn größer Offsetwert um echten O Wert bekommen zu> können
Ist es auch.
Den Hinweis "Vref_max=AVCC-0,6V" bin ich nachgegangen.
Der Aref wurde auf interne VCC/1,6V geändert. Die Referenzspannung
beträgt somit 3,29V/1,6V=2,05625V. Der Offset laut Datenblatt
(Vref*0,05) beträgt 0,1028125V.
Mittels Poti habe ich die Spannung an einem Eingangspin angelegt, und
mit dem DMM gemessen.
Falls ich mich nicht verrechnet habe dann habe ich weiterhin einen
Skalierungsfaktor, diesmal aber abfallen mit ansteigender Messspannung.
Dieser ist bei weitem nicht mehr so groß.
Anbei ein Screenshot aus einem EXCELsheet. [Wenn jemand unbedingt eine
.xlsx] haben möchte, dann reiche ich diese nach.]
Und der Offset ist auch noch vorhanden.
Ich dachte ich kann meine Potis einfach auswerten wenn ich diese als
Spannungsteiler über die Betriebsspannung (3,3V) laufen lasse, und den
Mittelabgriff direkt an den µC anschließe. Da nun feststeht das ich mit
dem ATXMega analoge Spannungen nur bis 2,7V messen kann, frage ich mich
wie ich am elegantesten die Potis auswerten kann. Spannungsteiler vor
das Poti? Spannungsteiler nach dem Mittelabgriff? Externe
Referenzspannungsquelle (2,5V) diese auch die Potis mit versorgen?
vielen Dank schon mal vorab
Thomas W. schrieb:> Externe> Referenzspannungsquelle (2,5V) diese auch die Potis mit versorgen?
Exakt! Ratiometrische Messung. In anderen Worten, wenn Vref wackelt,
wackelt proportional auch die ADC Eingangsspannung. Und die Messung ist
stabil und alles iss' gut.
Thomas W. schrieb:> Falls ich mich nicht verrechnet habe dann habe ich weiterhin einen> Skalierungsfaktor, diesmal aber abfallen mit ansteigender Messspannung.
Du hast Offset und Skalierungsfaktor vermischt. Außerdem leidet dein
letzter Wert immer noch an irgendeiner Übersteuerung. Der Knick fällt
doch sofort ins Auge. Wieso hat aber deine CNT_Soll-Kurve auch so einen
Knick?
> Dieser ist bei weitem nicht mehr so groß.> Anbei ein Screenshot aus einem EXCELsheet. [Wenn jemand unbedingt eine> .xlsx] haben möchte, dann reiche ich diese nach.]
Warum hängst du nicht direkt die Daten als CSV-Datei an - kein Problem
mit irgendwelchen Hinterhalten, kein proprietäres Dateiformat.
> Und der Offset ist auch noch vorhanden.
Darum bekommst du einen falschen Skalierungsfaktor.
Thomas W. schrieb:> Mittels Poti habe ich die Spannung an einem Eingangspin angelegt, und> mit dem DMM gemessen.
Wie ist denn die Eingangsschaltung? Welchen Wert hat das Poti und ist am
Eingang ein Kondensator?
Denn zum Wandeln muss der Sample&Hold Kondensator des A/D-Wanlers
geladen werden. Das kann einen Fehler bewirken, wenn die Signalquelle zu
hochohmig ist.
Thomas W. schrieb:> Falls ich mich nicht verrechnet habe dann habe ich weiterhin einen> Skalierungsfaktor, diesmal aber abfallen mit ansteigender Messspannung.
Welche Gleichung hast du für die Rechnung verwendet?
Mit
1
CNT = 2020,5 * U/V + 182
wird dein CNT_Ist recht gut getroffen, wenn man von dem 1,94V-Wert
absieht. Der liegt um 9 zu niedrig. Der 0,75V-Wert liegt auch etwas
niedrig (-5).
Der Knick am letzten Messwert entsteht da ich im Intervall von 0,25V
gemessen habe. Aber bei dem letzten Messwert habe ich (fast) einen
Überlauf bei 0,2V mehr als der vorhergehende Messintervall. Wenn ich den
Wert auf 2V änder dann ist auch der Knick weg.
Kannst du mir bitte auf die Sprünge helfen wo ich Offset und
Skalierungsfaktor vermische. Die Differenz (SOLL/IST) beträgt anfänglich
185 und sinkt dann auf 25 ab. Wäre Quasi ein Offset von ~25. Aber wenn
ich 0V am Pin anlege dann werden am ADC 185 ermittelt.
Laut Datenblatt muss ich noch einen "offset" beachten (Vref*0,05) =
0,1028125V
Für diese Messreihe habe ich nur ein Poti an den Pin gelötet, da ist
also kein C verbaut.
In keiner der Datenreihen ist eine Skalierung verrechnet. "Spannung IST"
und "CNT IST" wurden von DMM bzw. Display am µC abgelesen.
Nur "CNT SOLL" ist der Theoretische Wert den ich in "CNT" laut der
Spannung am PIN erwarten würde ((1,94V*100/1,95V)/100*4095)=4068. Vref
habe ich anhand der Formel aus dem Datenblatt errechnet
(1,95V=((4095/(4095+1))*2,056125V)-0,1028125V).
wird dein CNT_Ist recht gut
> getroffen, wenn man von dem 1,94V-Wert absieht. Der liegt um 9 zu> niedrig. Der 0,75V-Wert liegt auch etwas niedrig (-5).
Interessant finde ich die "+182" (bei 0V am Pin misst der ADC 185) und
"2020,5" (Vref = 3,29V/1,6V = 2,056V).
Ich habe mal dein Skalierungsfaktor und meine Zahlen in ein Diagramm
gestellt.
Den ADC auf interne Referenz konfigurieren wurde schon erwähnt. Ich
mache das immer, wenn es genauer sein soll als mit Vcc.
Prüfe den ADC Takt. Wenn die Taktfrequenz des ADC durch den falschen
prescaler zu hoch eingestellt ist kann man sich ebenfalls Abweichungen
von der Proportionalität einhandeln.
Nachtrag
Was für eine Impedanz sieht der ADC-Pin? Die sollte
im Rahmen drr Angaben im Datenblatt liegen und nicht zu hochohmig sein.
Thomas W. schrieb:> das Poti? Spannungsteiler nach dem Mittelabgriff? Externe> Referenzspannungsquelle (2,5V) diese auch die Potis mit versorgen?
Nimm das:
MCP1703AT-2052E/CB
Der liefert 2.048V am Ausgang (gerundet auf 2.05V). Und wenn Du Dir den
Wert 2.048V genau anschaust und dabei Zweierpotenzen im Blick hast, dann
kannst Du mit dieser Referenzspannung sehr einfach einen ADC-Count in
einen Spannungswert umrechnen. Bei einem 10 Bit ADC mit 1024 Counts
reicht eine Multiplikation mit 2, um den Spannungswert in mV zu
erhalten.
Bei 5V-Systemen werden auch 4.096V (gerundet auf 4.10V) als
Referenzspannung sehr gerne genommen.
Es gibt genauere Referenzspannungsquellen. Die können aber nur sehr
wenig Strom liefern - maximal 1 oder 2 mA. Der hier schafft 200mA, also
mehr als genug für die meisten Zwecke.
fchk
Thomas W. schrieb:> und Divisionen in der ISR wollte ich vermeiden.
Wenn du in einer ISR eine unsigned Variable durch eine Zweierpotenz
teilst, dann wird die vom Compiler durch Schiebeoperationen ersetzt.
>> Dieser Kommentar sieht mir recht dubios nach einem hingebastelten>> Workaround aus://nur wenn größer Offsetwert um echten O Wert bekommen zu>> können> Ist es auch.
Wäre es dann nicht sinnvoll, diesen Offset jedesmal vom ADC-Wert
abzuziehen? Oder andersrum: wie sehen die Rohwerte aus? Haben alle
Kanäle den gleichen Offset?
StefanK schrieb:> Was für eine Impedanz sieht der ADC-Pin? Die sollte> im Rahmen drr Angaben im Datenblatt liegen und nicht zu hochohmig sein.Thomas W. schrieb:>>> 4x ein Poti und 2x eine Batteriespannungsmessung über einen 2:1>>> Spannungsteiler (9k76/3k24).
Zumindest der Spannungsteiler für die Batteriespannung ist mit einer
Impedanz von 9k76||3k24 = 2k4 niederohmig genug. Und wenn die Potis 10k
haben, dann auch die, denn die höchste Impedanz wäre dann bei 5k||5k =
2k5.
Aber am einfachsten wäre es, die Impedanz mit jeweils einem 100nF
Kondensator am ADC Pin zu reduzieren.
J. T. schrieb im Beitrag #8040094:
> Man kann sich das Leben auch unnötig schwer machen...
Woher weiß ich, dass der Knick im CNT_Soll-Graphen nicht auch ein
Verschreiber ist?
Es mutet schon sehr merkwürdig an, wenn in einer Kurve, die angeblich
auf einer linearen Gleichung basiert, ein Knick auftritt. Das Bedarf
zumindest einer Erklärung. Mit einer "Gleichung", die keine ist, ist es
da nicht getan, zumal CNT_SOLL eine Kurve und kein einzelner Punkt ist.
Thomas W. schrieb:> Nur "CNT SOLL" ist der Theoretische Wert den ich in "CNT" laut der> Spannung am PIN erwarten würde ((1,94V*100/1,95V)/100*4095)=4068.
Aber wozu soll man sich das Leben unnötig schwer macht.
Messen und Mist liegen oft dichter beieinander, als mancher wahrhaben
möchte.
Das hat etwas mit Sorgfalt zu tun.
Lothar M. schrieb:> Wäre es dann nicht sinnvoll, diesen Offset jedesmal vom ADC-Wert> abzuziehen? Oder andersrum: wie sehen die Rohwerte aus? Haben alle> Kanäle den gleichen Offset?
Ja alle Kanäle haben in etwa den gleichen Offset
> Zumindest der Spannungsteiler für die Batteriespannung ist mit einer> Impedanz von 9k76||3k24 = 2k4 niederohmig genug. Und wenn die Potis 10k> haben, dann auch die, denn die höchste Impedanz wäre dann bei 5k||5k => 2k5.
Batterie 1 hat eine Impedanz von 4K8 und Batterie 2 den Wert den du
errechnet hast (2K4). Potis sind 10K
Woher nimmst du den Wert ob die Impedanz noch O.K.ist? Ist es diese
Zeile aus dem Datenblatt?
"Rin Input resistance Switched 4.5 k" (35.6 ADC Characteristics S. 71)
> Aber am einfachsten wäre es, die Impedanz mit jeweils einem 100nF> Kondensator am ADC Pin zu reduzieren.
Für die Batteriespannung habe ich "nur" 1nF Kondensatoren an den
Eingängen, für die Potis nicht. Das sollte ich ändern.
Rainer W. schrieb:> Woher weiß ich, dass der Knick im CNT_Soll-Graphen nicht auch ein> Verschreiber ist?
ich zitiere mich mal selbst ;-)
Thomas W. schrieb:> Der Knick am letzten Messwert entsteht da ich im Intervall von 0,25V> gemessen habe. Aber bei dem letzten Messwert habe ich (fast) einen> Überlauf bei 0,2V mehr als der vorhergehende Messintervall. Wenn ich den> Wert auf 2V änder dann ist auch der Knick weg.
Und damit es auch sichtbar wird habe ich in der Messreihe den letzten
Punkt auf der X-Achse auf 2V geändert, somit wir die Kurve "CNT SOLL"
(fast) linear. Den Wert "CNT IST" habe ich nicht angepasst da es ab 4095
einen Überlauf gibt.
Zusammengefasst lässt sich behaupten, das ich eine externe
Spannungsreferenz (z.B. MCP1703AT-2052E/CB) benötige. Die Impedanz an
allen ADC-Eingängen soll mittels Kondensator reduziert werden. Es ist
auf die maximale Eingangsimpedanz zu achten, deren Höhe ich noch nicht
kenne. Die Auswertung eines gleitenden Mittelwerts kann direkt in der
ISR durchgeführt werden, da Bitoperationen wenig Rechenzeit benötigen.
Ist der nach wie vor vorhanden Skalierungsfaktor üblich?
Vielen Dank bei allen Hilfestellern. Es gab auch Nörgler aber
"Salamitaktik" wurde mir (noch) nicht unterstellt. Dies macht mich schon
ein wenig froh. ;-)
Thomas W. schrieb:> frage ich mich wie ich am elegantesten die Potis auswerten kann.> Spannungsteiler vor das Poti?
Benutze das 10k Poti als Teil des Spannungteilers.
Thomas W. schrieb:> Rainer W. schrieb:>> Woher weiß ich, dass der Knick im CNT_Soll-Graphen nicht auch ein>> Verschreiber ist?>> ich zitiere mich mal selbst ;-)>> Thomas W. schrieb:>> Der Knick am letzten Messwert entsteht da ...
Wieso ist CNT_Soll ein Messwert?
Mir ist schleierhaft, was du da rechnest. Welche Gleichung benutzt du,
um die Kurve CNT_Soll zu berechnen?
Thomas W. schrieb:> Woher nimmst du den Wert ob die Impedanz noch O.K.ist? Ist es diese> Zeile aus dem Datenblatt?> "Rin Input resistance Switched 4.5 k" (35.6 ADC Characteristics S. 71)
1. Aus Erfahrung
2. Aus diesem DB-Wert, der das Thema sehr, sehr vereinfacht darstellt
Zu den grundsätzlichen Grundlagen und ausführlich siehe den
Beitrag "Re: Attiny85 ADC Eingangswiderstand - wie hoch"
Thomas W. schrieb:> ist auf die maximale Eingangsimpedanz zu achten, deren Höhe ich noch> nicht kenne.
Diese Werte stehen im Datenblatt Deines Prozessors und dürften im
"einige 10kOhm Bereich" liegen. Damit hast Du mit Deiner HW also kein
Problem, nichtmal ohne Kondensatoren, wobei es gute Praxis ist, sie zu
verwenden.
Thomas W. schrieb:> Die Auswertung eines gleitenden Mittelwerts kann direkt in der ISR> durchgeführt werden, da Bitoperationen wenig Rechenzeit benötigen.
Wenn Du 2^n Messwerte aufaddierst und dann (mittelwert>>n) machst, dann
ja, ansonsten lieber flag setzen und im H auptprog rechnen. Wenn du n=4
nimmst, also 16 Messungen aufaddierst, wird uint16_t mittelwert<0xFFFF
bleiben. Sofern Du die gemessenen Mittelwerte nur für Vergleiche nutzt,
dann brauchst Du nicht dividieren. Dadurch bekommst Du noch mehr
Genauigkeit (so als hättest Du eine höhere ADC Auflösung).
Hans W. schrieb:> Benutze das 10k Poti als Teil des Spannungteilers.>> VCC --[6k]--[10k]-- GND>> \_____ ADC
Wenn Du sehr genau messen willst, ist eine Kalibrierung Deiner
ADC-Kanäle sinnvoll bzw Unumgänglich. Genaue Multimeter hast Du ja. Und
solltest Du auch nach Überprüfung Deiner ADC Konfiguration den Knick
nicht wegbekommen, dann hilft Dir der Trick von Hans aus der Patsche,
was Dich aber etwas an Genauigkeit kostet, weil Du den Wertebereich des
ADC nicht mehr voll ausschöpfst. Es gibt zum Thema ADC Kalibrierung sehr
interessante Application Notes, die Du Dir mal ansehen kannst, wenn Du
das vertiefen willst.
StefanK schrieb:> Dadurch bekommst Du noch mehr Genauigkeit
Unsinn, der Wandler wird nicht besser, nur weil man Rauschen heraus
filtert, d.h. an der Genauigkeit ändert sich nichts.
Einzig die Auflösung wird besser, falls das Rauschen ausreichend groß
ist.
Rainer W. schrieb:> der Wandler wird nicht besser,
Hast Du irgendwo gelesen, dass der Wandler besser würde? Das steht da
nicht. Nicht mal zwischen den Zeilen.
@Thomas W: noch eine letzte Idee, konfiguriere Deinen ADC einfach mal
mit einer geringeren Auflösung, z.B. 10bit und schaue, ob der Knick
immer noch auftritt. Zumindest zur Auswertung der Potentiometer würden
10bit völlig ausreichen;-)
StefanK schrieb:> @Thomas W: noch eine letzte Idee, konfiguriere Deinen ADC einfach mal> mit einer geringeren Auflösung, z.B. 10bit und schaue, ob der Knick> immer noch auftritt. Zumindest zur Auswertung der Potentiometer würden> 10bit völlig ausreichen;-)
Ich hab es jetzt nicht genau in Kopf aber ich glaube es gibt nur die
Wahl zwischen 8bit und 12bit.
Es gibt keinen Knick. Das ist nur ein Darstellungsfehler.
StefanK schrieb:> Hast Du irgendwo gelesen, dass der Wandler besser würde? Das steht da> nicht.
Eine höhere Genauigkeit entspricht einem "besser" wesentlicher
Wandlereigenschaften wie z.B. INL oder DNL.
Thomas W. schrieb:> Es gibt keinen Knick. Das ist nur ein Darstellungsfehler.
Verzerrungen beim Screenshot oder Allergie von Excel gegen den letzten
Wert einer Kurve ;-(
Das wäre wohl etwas weit hergeholt.
Oder schiebst du das auf die JPG-Kompression deiner Screenshots, für die
PNG als verlustfreies Format angesagt wäre.
Was für einen Darstellungsfehler meinst du konkret?
Rainer W. schrieb:> Was für einen Darstellungsfehler meinst du konkret?
Schau dir bitte die Abstände der Skale auf der X-Achse an. Speziell der
letzte Abstand ist nur 0,2V statt 0,25V. Im Bild "Knicklos" habe ich es
korrigiert, aber nicht den Wert "CNT IST" angepasst Sondern nur "CNT
SOLL". Daher bitte in diesem Bild die "Kurve" "CNT IST" Ignorieren. Es
gibt keinen Messeert für "CNT IST" da der ADC bereits an 1,95V
überläuft.
Thomas W. schrieb:> Interessant finde ich die "+182" (bei 0V am Pin misst der ADC 185)
Zwei Vorschläge:
- Pin hart auf Masse legen und schauen, ob sich der Wert ändert.
- Sample-Zeit prüfen. Klingt nach Einschwingproblem. Und ADC-Takt
probeweise verringern.
Hallo Thomas,
ich hatte mit dem ADC vom ATXMega auch Probleme. Aber der funktioniert
einwandfrei!
Was bei deinem Code auffällt:
Du hast den ADC als Single-ended konfiguriert. Wenn du im Datenblatt
genau schaust, macht der ADC dann einen Offset (siehe Bild ADC1). Das
ist dafür, dass man auch Wert um 0V herum noch messen kann.
Dazu musst du aber, bevor deine Anwendung läuft, diesen Offset
abgleichen.
Dazu kannst du im Eingangmultiplexer die Eingänge intern auf Masse
ziehen.
Für den Gain-Error gibt es die Calibrierwerte (siehe Bild ADC2), die du
erst in die Calibrierregister vom ADC laden muss, damit die Kennlinie
stimmt.
Alles was du in der Mathematik versuchst über Mittelung und so weiter,
bringt die nichts, da dein Input schon falsch ist. Das kannst du maximal
auf einen Arbeitspunkt hintrimmen. Aber toll ist das nicht.
Grüße, Jens
Uwe schrieb:> Thomas W. schrieb:>> Interessant finde ich die "+182" (bei 0V am Pin misst der ADC 185)
Schau noch das Bild hier. Das passt zum Offset des ADCs
Thomas W. schrieb:> Rainer W. schrieb:>> Was für einen Darstellungsfehler meinst du konkret?>> Schau dir bitte die Abstände der Skale auf der X-Achse an. Speziell der> letzte Abstand ist nur 0,2V statt 0,25V.
Dann ist der Plot als ganzes ein Darstellungsfehler. Es macht wenig Sinn
und ist irreführend bei so einem Graphen, eine Achse erratisch zu
teilen, d.h. irgendwo irgendwelche Werte einzutragen, sorry.
Rainer W. schrieb:> Dann ist der Plot als ganzes ein Darstellungsfehler. Es macht wenig Sinn> und ist irreführend bei so einem Graphen, eine Achse erratisch zu> teilen, d.h. irgendwo irgendwelche Werte einzutragen, sorry.
Deshalb nimmt man für so etwas ja extra X-Y Plots.
Un' da isses nun gar kein Problem, wie man unschwer nur etwas weiter
oben sehen kann.
Thomas W. schrieb:> Das ist nur ein Darstellungsfehler.
Puh, damit hast Du hier jetzt aber jede Menge Pferde scheu gemacht und
für ordentlich Aufregung gesorgt.