ATmega 8 ADC nur 8 bit Auflösung

OP #1520616
ich habe folgendes Problem:

ich will einen Spannungswert von 0 - 5V am ADC einlesen. Rauskommen soll 
ein 16 - Bit wert (also 0 - 1023). nun bekomme ich allerdings nur eine 8 
- Bit auflösung. Kann mir jemand weiterhelfen?

die ADC - eingänge sind 0 - 3 vorerst wird aber nur 0 angezeigt. Die 
refe´renzspannung an AREF beträgt 5V.

Hier nun mein Code:
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include "lcd-routines.h"
4
#include <util/delay.h>
5

6

7
volatile uint8_t sollwert = 7, wert = 0,counter = 0;
8
uint16_t result;
9
uint16_t sens[4];
10

11
//--------------------------------ADC abfragen-----------------------------------------------------
12
uint16_t abfragen(uint8_t mux)
13
{
14
  uint8_t i;
15
  int i2 = 60;
16
  ADMUX = mux;                      // Kanal waehlen
17
  ADMUX |= (0<<REFS1) | (0<<REFS0); // interne Referenzspannung nutzen
18
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
19
                      // setzen auf 8 (1) und ADC aktivieren (1)
20
     
21
      /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
22
       also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
23
      ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
24
      while ( ADCSRA & (1<<ADSC) ) {
25
       ;     // auf Abschluss der Konvertierung warten 
26
      }
27
      result = ADCW;  // ADCW muss einmal gelesen werden,
28
              // sonst wird Ergebnis der nächsten Wandlung
29
              // nicht übernommen.
30
     
31
      /* Eigentliche Messung - Mittelwert aus 60 aufeinanderfolgenden Wandlungen */
32
      result = 0; 
33
      
34

35
      for( i=0; i<i2; i++ )
36
      {
37
      ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
38
      while ( ADCSRA & (1<<ADSC) ) {
39
        ;   // auf Abschluss der Konvertierung warten
40
      }
41
      result += ADCW;        // Wandlungsergebnisse aufaddieren
42
      
43
      }
44
      ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
45
     
46
      result /= i2;                          // Summe durch Anzahl der Messungen teilen -> arithm. Mittelwert
47
  return result;
48
}
49

50
//--------------------------------main-----------------------------------------------------
51

52
int main(void)
53
{  
54
  lcd_init();
55
  lcd_clear();
56
  while (1)
57
  {
58
    set_cursor(0,2);
59
    lcd_string("Wert:");
60
    for (counter = 0; counter < 4; counter ++)
61
    {
62
      abfragen(counter);
63
      sens[counter] = result;
64
    }
65
    lcd_clear();
66
    set_cursor(0,0);
67
    lcd_string("  Ueberwachung  ");
68
    /* Nur als test */
69
    wert = sens[0];
70
    /* Test Ende */
71
    if (wert > sollwert)    
72
    {
73
        PORTD |= 0x10;
74
    }
75
    char Buffer[20];
76
    itoa(wert, Buffer, 10);
77
    set_cursor(10,2);
78
    lcd_string( Buffer );
79
  }
80
}
Gast
> Rauskommen soll ein 16 - Bit wert (also 0 - 1023)

1023 ist ein 10 Bit Wert und kein 16 Bit Wert. Wie äußert sich die "8 
Bit Auflösung" ? Welches Ergebnis wird angezeigt ?
Gast
Lass die Mittelwertbildung testweise weg.

Ersetz zum Test das ADCW durch ADCL | ADCh <<8

Bei mir im source code habe ich noch gefunden
//ADMUX_temp |= (1 << ADLAR);   // Sets right adjustment for ADC Results 
(default)
Also überprüf, ob das Bit richtig gesetzt ist.
OP
öh nö, thx

oh mann und ich dachte ich hätte alle variablentypen nochmal überprüft 
bevor ich nen Thread aufmach.(kopf gegen Wand)

thx


thx @avion23. Das ausbessern des Variablentyps hat das Problem bereits 
vollkommen behoben, trotzdem thx.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.