Forum: Mikrocontroller und Digitale Elektronik ATXMEGA384C3-AU ADC mist ungenau


von Thomas W. (thomas_w808)



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
  }

von Rainer W. (rawi)


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
von Thomas W. (thomas_w808)


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.

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> aber Messwerte über 2,6V kann ich damit auch nicht erfassen

Liegt es vielleicht an dem "Max. AVcc-0.6"?
  Nur eine Laienmeinung.

von Norbert (der_norbert)


Lesenswert?

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.

von Thomas W. (thomas_w808)


Lesenswert?

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.

Beitrag #8039317 wurde von einem Moderator gelöscht.
von Rainer W. (rawi)


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.
von Thomas W. (thomas_w808)


Lesenswert?

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.

Beitrag #8039334 wurde von einem Moderator gelöscht.
von Harald K. (kirnbichler)


Lesenswert?

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.

Beitrag #8039391 wurde von einem Moderator gelöscht.
Beitrag #8039437 wurde von einem Moderator gelöscht.
von Veit D. (devil-elec)


Lesenswert?

Hallo,

lass dich nicht provozieren, gehe konzentriert dem besagten Aref nach.

von Norbert (der_norbert)


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.

von Norbert (der_norbert)


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.

von Rainer W. (rawi)


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.

von Norbert (der_norbert)


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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
- 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
    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.
von Thomas W. (thomas_w808)


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.

von Thomas W. (thomas_w808)


Angehängte Dateien:

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

von Norbert (der_norbert)


Lesenswert?

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.

: Bearbeitet durch User
von Rainer W. (rawi)


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.

von Dietrich L. (dietrichl)


Lesenswert?

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.

von Rainer W. (rawi)


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
von Thomas W. (thomas_w808)


Angehängte Dateien:

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

von Thomas W. (thomas_w808)


Angehängte Dateien:

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.

von StefanK (stefanka)


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
von Frank K. (fchk)


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

von Rainer W. (rawi)


Lesenswert?

Thomas W. schrieb:
> Interessant finde ich die "+182" (bei 0V am Pin misst der ADC 185)

Was findest du daran interessant?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
von StefanK (stefanka)


Lesenswert?

Damit liegen die Impedanzen im erlaubten Rahmen. Daran kann es somit 
nicht liegen.

Beitrag #8040094 wurde von einem Moderator gelöscht.
Beitrag #8040166 wurde von einem Moderator gelöscht.
Beitrag #8040176 wurde von einem Moderator gelöscht.
von Rainer W. (rawi)


Angehängte Dateien:

Lesenswert?

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.

Beitrag #8040205 wurde von einem Moderator gelöscht.
von Thomas W. (thomas_w808)


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.
von Thomas W. (thomas_w808)


Angehängte Dateien:

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

von Hans W. (hanswieland)


Lesenswert?

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.
1
VCC --[6k]--[10k]-- GND
2
              \_____ ADC

: Bearbeitet durch User
Beitrag #8040370 wurde von einem Moderator gelöscht.
von Rainer W. (rawi)


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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
von StefanK (stefanka)


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
>
>               \_____ 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
von Rainer W. (rawi)


Lesenswert?

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.

von StefanK (stefanka)


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

von Thomas W. (thomas_w808)


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.

von Rainer W. (rawi)


Lesenswert?

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.

von Rainer W. (rawi)


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
von Thomas W. (thomas_w808)


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.

von Uwe (uhi)


Lesenswert?

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.

von Thomas Re (db8nr)


Lesenswert?

Wenn dein ADC ungenau mist, dann ist das Mist.

von Jens W. (jensw)


Angehängte Dateien:

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

von Norbert (der_norbert)


Angehängte Dateien:

Lesenswert?

Und so sieht das mit X-Y Plots aus.
Finde ich nicht allzu schlecht.

von Jens W. (jensw)


Angehängte Dateien:

Lesenswert?

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

von Rainer W. (rawi)


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.

von Norbert (der_norbert)


Lesenswert?

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.

von StefanK (stefanka)


Lesenswert?

Oder man nimmt einen älteren AVR, wie ATmega328, ATinyx5, ...x4. ...13 
etc, die sind da viel gutmütiger. 😉

von Rainer W. (rawi)


Lesenswert?

Norbert schrieb:
> Deshalb nimmt man für so etwas ja extra X-Y Plots.

Eben, sonst ist es z.B. sinnlos, die Punkte überhaupt zu verbinden.

von StefanK (stefanka)


Lesenswert?

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.

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.