Probleme mit AD-Wandler im ATmega

Gast #1270314
Ich habe ein Problem mit dem AD-Wandler in ATmega8 und 32 (gleicher 
Fehler). Was mich schon wundert: Egal ob AVCC und GND von AD-Wandler 
angeschlossen sind oder nicht kommt das gleiche raus. Für was gibt es 
dann überhaupt diese Anschlüsse?

Zu dem eigentlichen Problem:
Ich bekomme total falsche Werte! Lege ich den Eingang auf AREF (5V) habe 
ich Werte um 600. Lege ich den Eingang auf Masse kommen Werte von ca. 
300.

Hier der C-Code:
1
    ADMUX |= (1<<MUX0);
2
    ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
3
    ADCSRA |= (1<<ADSC);
4
    
5
    while ( ADCSRA & (1<<ADSC) ) {
6
     ;
7
     }
8
  
9
  lcd_init();
10
  
11
  float spannung = 0;
12
  
13
  while(1)
14
  {
15
        
16
        ADCSRA |= (1<<ADSC);
17
        while ( ADCSRA & (1<<ADSC) ) {
18
        ;
19
        }
20
        
21
    spannung = ADCL;
22
    spannung += (ADCH<<8);    
23
    
24
    
25
    spannung = (int) (spannung);
26
    
27

28
    lcd_clear();
29
    lcd_zahl(spannung);
30

31
//1 Sekunde warten
32
    _delay_ms(100);
33
    _delay_ms(100);
34
    _delay_ms(100);
35
    _delay_ms(100);
36
    _delay_ms(100);
37
    _delay_ms(100);
38
    _delay_ms(100);
39
    _delay_ms(100);
40
    _delay_ms(100);
41
    _delay_ms(100);
42
    
43
  }
Dein Code sieht auch nicht unbedingt toll aus.
1
float spannung = 0;
 ist schonmal ziemlich unklug. Nimm als Datentyp einen int. Ich vermute 
sogar, dass deine Routine "lcd_zahl" gar keine float-Datentypen 
verarbeiten kann.
1
spannung = (int) (spannung);
  hilft vielleicht in MATLAB, aber aufm µC kann das doch nur schief 
gehen, wenn spannung als float deklariert ist.

MfG
Marius
Gast
Ich habe einen float benutzt, weil ich damit noch mehr vor hatte. Das 
ganze mit der Ausgabe funktioniert. Hab ich auch schon bei anderen 
Programmen so gemacht.

Als Eingang verwende ich ADC0 (MUX0).
Die Versorgungsspannung hab ich wie im Datenblatt angeschlossen:

Mega8:
AVCC: Pin 20
AREF: Pin 21
GND: Pin 22
ADC0: Pin 23

Mega32:
AVCC: Pin 30
GND: Pin 31
AREF: Pin 32
ADC0: Pin 40
Gast
Hallo !

Versuch mal mit ADMUX=0; deine Register in einen klar definierten 
Zustand zu bringen.


z.B:

    ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
    ADMUX = 0;
    ... hier  ADMUX einstellen

    ADCSRA |= (1<<ADSC);


lg,
Gregor
Moderator Persönliche Seite
Frank schrieb:
> Egal ob AVCC und GND von AD-Wandler
> angeschlossen sind oder nicht kommt das gleiche raus.

Mit bisschen Pech hast du den AVR damit bereits kaputt geschossen,
wenn du ihn jemals ohne AVcc betrieben hast.

> Ich dachte das geht nach dem Prinzip MUX0=ADC0, MUX1=ADC1 usw.

Datenblatt lesen ist hier besser als denken.  Insbesondere beim
ATmega32 wirst du dann nämlich sehr schnell feststellen, dass der
deutlich mehr kann, als nur jeden ADC-Eingang selbst 1:1 abzutasten.
Schon dadurch kann deine Logik gar nicht aufgehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.