Forum: Mikrocontroller und Digitale Elektronik AppNote AVR120


von Jupp (Gast)


Lesenswert?

In der AVR AppNote120 wird die Offset, Gain Korrektur des ADC 
beschrieben und der folgende Pseudocode mitgeliefert. Ich habe arge 
Verständnisproblem was die App. Note angeht und mich würde interessieren 
ob das schonmal jemand umgesetzt hat.
1
signed int adc_compensate( signed int adcvalue, signed int factor, signed long correction )
2
3
{
4
return (((((signed long)adcvalue*factor)+correction)<<2)>>16);
5
}

Beispiel: Wenn ich hier mal mit Zahlen rechne dann kann ich für Faktor 
z.B. #define factor (16384*1) setzen. Ein Gain Fehler liegt aber um die 
1, will sagen, er kann auch 1,5 sein und schon meckert der Compiler das 
ein double nicht in einen int paßt.

Welcher Zahlenraum für correction ermittelt werden muß ist mir völlig 
unklar.

Am besten wäre es wenn man in den defines lediglich eintragen würde... 
GainError z.B. 1,5 und factor ermittelt wird. Ebenso bei der 
Correction... ein define Offset Error und dann wird die Correction vom 
Präprozessor berechnet.

Ich hoffe es kommt herüber was ich meine und ihr habt ne Idee wie ich 
daran gehen kann.

Anbei noch der link zur AppNote.

http://www.atmel.com/dyn/resources/prod_documents/DOC2559.PDF

von Michael P. (mikepa)


Lesenswert?

Hallo Jupp,

wie die Application Note ausführt, wird davon ausgegangen, dass die 
Verstärkung immer < 2 sein wird. Daher wir alles mit 2^14 multipliziert.
In der Gleichung ist auch der offset (Nullpunktabweichung) mit 2^14 zu 
mutiplizieren. Im Funktionsaufruf wird ein signed long als Vertsärkung 
erwartet, kein Double. Daher vielleicht folgendes:

#define factor (signed int)(1.5*16384)

oder

signed int factor = (signed int)1.5*16384);

Michael

von Jupp (Gast)


Lesenswert?

Hallo Michael,

danke, das mit dem Gain Factor klappt schon mal.

#define GainFactor (signed int) (1.0*16384)
#define Correction (signed int) (1.0*16384)

Wenn ich nun den Gain "um 1... 1,2 oder 0,8" setze dann rechnet er 
richtig. Wie der Correction Wert entsteht is mir völlig unklar. Bei der 
Definition... wie oben im define angelegt... wir aus dem Eingangswert 
1024 = 1025... würde aber gerne eine Abweichung in mVolt definieren. Ich 
komm nicht mal auf den Lösungsansatz für Correction. Bei einem signed 
int wird eine Korrektur um sagen wir mal 20 mVolt nie was oder verstehe 
ich da immer noch etwas nicht ?

von Jupp (Gast)


Lesenswert?

So, habs jetzt etwas anders gelöst... Gain und Offset läßt sich 
wunderbar einstellen.

Leider hat der Wandler noch nichtlineare Fehler. Ich hab die 
Korrekturwerte so eingestellt das in der Mitte bei 1,280 Volt kein 
Fehler mehr existiert. Bis zum minimalen / maximalen Wert ergibt sich 
leider noch ein Offset von 25 mVolt. Ganz brauchbar aber der Fehler im 
Bereich von 0-500 mVolt ist schon heftig.

Wie gut sind die Wandler der ATMEGA's ?

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.