Probleme mit AD-Wandler im ATmega

Gast #1270314
Lesenswert?

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
  }
#1270322
Lesenswert?

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 #1270710
Lesenswert?

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 #1270770
Lesenswert?

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 #1271912
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren