Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC - offset?


von Stefan G. (Gast)


Lesenswert?

Hallo,
ich habe mir hier gerade mal einen einfachen AD Wandler mit meinem
ATmega128 gebastelt. Das Programm habe ich mit CodevisionAVR erstellt
und lasse mir den gewandelten wert mittels der Routine

v_mess = (float) ((5.0/1023)*read_adc(0));
      ftoa(v_mess,4,wert);
      puts(wert);

direkt aufs Terminal ausgeben.
An sich funktioniert der ADC, das merkwürdige ist jedoch, daß ich auf
dem Terminal einen viel zu niedrigen Wert bekomme. Wenn ich
beispielsweise 1 Volt anliegen habe, bekomme ich sowas wie 0.2
ausgegeben. Habe ich da irgendwo einen Denkfehler mit eingebaut?
Beispielsweise beim Ausgeben der Werte im ASCII Format?
Gruß,
Stefan

von Dominic Thomé (Gast)


Lesenswert?

Und wie liesst Du den ASC aus ?

von Stefan G. (Gast)


Lesenswert?

Die Ausleseroutine hat mir der Codevision Wizard selbst hingebastelt.
Sieht dann so aus:

unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

Das hat auch eigentlich immer funktioniert. Ich glaube ja daß das
Problem eher in meiner Dezimalwertumrechnung liegt, bzw. den
verwendeten Datentypen.
STefan

von emil (Gast)


Lesenswert?

1. ist ADC_VREF_TYPE=0x40? (5v referenz?)
2. wie hast du die "wert" definiert?

von Stefan G. (Gast)


Lesenswert?

Bei mir ist es so definiert.

#define ADC_VREF_TYPE 0x00

Das verwirrt mich nun auch etwas. Wie kamst du denn auf ADC_VREF_TYPE
0x40? Ich verstehe nicht genau was da passiert.
'wert' ist einfach ein Array, daß ich so definiert habe:
char wert[4];

von emil (Gast)


Lesenswert?

nun du hast zumindest 2 fehler:

1.#define ADC_VREF_TYPE 0x40 bedeutet unter anderem, dass
du die 5v als referenzspannung benutzen willst (du berechnest ja
mit v_mess = (float) ((5.0/1023)*read_adc(0)); in bezug auf 5v
referenzspannung;

2. wert[4] ist zu wenig, das fasst nur 3 stellen zusammen; den "wert"
musst du mindestens mit wert[5] definieren, besser mit wert[6]

von Stefan G. (Gast)


Lesenswert?

Habe das Problem endlich gelöst, es lag an was ganz anderem: Der GND Pin
des uC´s lag nicht auf dem selben Niveau wie der Netzteil GNC (dessen
Spannung ich wandeln wollte). Deshalb hat mir mein ADC immer Murcks
rausgegeben.
Mensch, an so einfachen Fehlern hängt man sich doch immer wieder ganz
schön lange auf....
Trotzdem danke für eure Tipps,
Stefan

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.