ATXMEGA384C3-AU ADC mist ungenau

OP #8039286
Lesenswert?

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
void ADCA_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) ]
6
      ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;              //Positiven Wertebereich
7
      ADCA.CH0.INTCTRL |= ADC_CH_INTMODE_COMPLETE_gc | ADC_CH_INTLVL_LO_gc;
8

9
      //Kalibriedaten laden
10
        NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;      
11
        ADCA.CALL = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0));    
12
        ADCA.CALH = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1));
13
        NVM_CMD = NVM_CMD_NO_OPERATION_gc;    
14
      //ende Kalibriedaten laden
15

16
      // erst nach allen Einstellungen
17
      ADCA.CTRLA = ADC_ENABLE_bm;
18
    
19
    }

Die Daten vom ADC werden in der ISR abgerufen:

1
  ISR(ADCA_CH0_vect)
2
  {
3
    ADCA.CH0.INTFLAGS = ADC_CH_CHIF_bm;                    //flag löschen
4
  
5
      if (ADC_Mittelwert_CNT < ADC_MitWt_Anz)                        //Nur 15x pro Pin messen, danach Mittelwert in Hauptschleife auswerten
6
      {
7
        if (ADCA.CH0.RES > ADCA_CH0_Offset)                          //nur wenn größer Offsetwert um echten O Wert bekommen zu können
8
        {  ADC_Mittelwert[ADC_CH0_PIN-1] += ADCA.CH0.RES;                  //Messwert aufsummieren [speichern in Array beginnend mit 0]            
9
        }
10
      
11
          ADC_CH0_PIN++;                                      //nächster Pin
12
    
13
            if (ADC_CH0_PIN >= (ADCA_CH_PIN_Anzahl + 1))                      //wenn letzter Pin gemessen dann wieder den ersten Pin messen (PIN0 ist AREF)
14
            {  ADC_CH0_PIN = 1;                                  //Pin 1 wird für MUX ausgewählt, da PIN0 AREF ist.
15
            
16
              ADC_Mittelwert_CNT ++;                                //Nach Messung aller Pins (1-6) Zähler für Mittelwert hochzählen
17
            }
18

19
              ADCA.CH0.MUXCTRL = (ADC_CH0_PIN & 0x0F) << 3;                      //im Mux den nächsten PIN einstellen (im MUXCTRL sind Bit 3-6 für den Pin zuständig)
20
      }
21
        
22
  }
#8039292
Lesenswert?

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?

: Bearbeitet durch User
OP #8039298
Lesenswert?

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.

Beitrag #8039317 wurde von einem Moderator gelöscht.
#8039320
Lesenswert?

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.

Beitrag #8039322 wurde von einem Moderator gelöscht.
Beitrag #8039326 wurde von einem Moderator gelöscht.
OP #8039327
Lesenswert?

Rainer W. schrieb:

Thomas W. schrieb im Beitrag #8039298: 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.

Beitrag #8039334 wurde von einem Moderator gelöscht.
Beitrag #8039391 wurde von einem Moderator gelöscht.
Beitrag #8039437 wurde von einem Moderator gelöscht.
#8039453
Lesenswert?

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.

#8039468
Lesenswert?

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.

#8039469
Lesenswert?

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.

#8039475
Lesenswert?

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)

: Bearbeitet durch User
Moderator (Firma: Titel) Persönliche Seite #8039604
Lesenswert?

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:

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
    else                                     ADC_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
: Bearbeitet durch Moderator
Beitrag #8039616 wurde von einem Moderator gelöscht.
Beitrag #8039621 wurde von einem Moderator gelöscht.
Beitrag #8039640 wurde von einem Moderator gelöscht.
OP #8039710
Lesenswert?

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.

OP #8039739
Lesenswert?

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

Angehängte Dateien:
#8039760
Lesenswert?

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.

#8039775
Lesenswert?

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).

: Bearbeitet durch User
OP #8039788
Lesenswert?

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,94V100/1,95V)/1004095)=4068. Vref habe ich anhand der Formel aus dem Datenblatt errechnet (1,95V=((4095/(4095+1))*2,056125V)-0,1028125V).

Angehängte Dateien:
OP #8039802
Lesenswert?

Rainer W. schrieb:

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).

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.

Angehängte Dateien:
#8039817
Lesenswert?

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.

: Bearbeitet durch User
#8039841
Lesenswert?

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

Moderator (Firma: Titel) Persönliche Seite #8039957
Lesenswert?

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.

: Bearbeitet durch Moderator
Beitrag #8040094 wurde von einem Moderator gelöscht.
Beitrag #8040166 wurde von einem Moderator gelöscht.
Beitrag #8040176 wurde von einem Moderator gelöscht.
#8040198
Lesenswert?

J. T. schrieb:

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,94V100/1,95V)/1004095)=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.

Angehängte Dateien:
Beitrag #8040205 wurde von einem Moderator gelöscht.
OP #8040338
Lesenswert?

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.

Beitrag #8040340 wurde von einem Moderator gelöscht.
OP #8040351
Lesenswert?

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. ;-)

Angehängte Dateien:
Beitrag #8040370 wurde von einem Moderator gelöscht.
#8040373
Lesenswert?

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?

: Bearbeitet durch User
Moderator (Firma: Titel) Persönliche Seite #8040459
Lesenswert?

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"

: Bearbeitet durch Moderator
#8040463
Lesenswert?

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

1
          \_____ 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.

: Bearbeitet durch User
#8040538
Lesenswert?

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;-)

OP #8040644
Lesenswert?

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.

#8040657
Lesenswert?

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?

: Bearbeitet durch User
OP #8040665
Lesenswert?

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.

#8040705
Lesenswert?

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

Angehängte Dateien:
#8040727
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren