ATmega 8 ADC nur 8 bit Auflösung

OP #1520616
Lesenswert?

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

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.

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