mikrocontroller.net

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


Autor: Stefan G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dominic Thomé (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie liesst Du den ASC aus ?

Autor: Stefan G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: emil (Gast)
Datum:

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

Autor: Stefan G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Stefan G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.