Forum: Mikrocontroller und Digitale Elektronik Atmega328 - 10-bit-ADC gibt 16-bit-Werte aus


von gerri (Gast)


Lesenswert?

Hallo,

der 10-bit-ADC vom Atmega328 gibt mir 16-bit-Werte aus, woran könnte es 
liegen?

Hier der Programmauszug:
1
uint16_t variabletmp = 0;
2
...
3
4
5
  //****  ADC initialisieren ****
6
  ADCSRA  |= 1<<ADEN;      // ADC aktivieren
7
  ADCSRA  |= (1<<ADPS1)|(1<<ADPS2);  // Vorteiler auf 64
8
  ADMUX  |= (1<<REFS0)|(1<<REFS1);  // Einstellung Uref = 5V extern: 01;  Ref 1,1V intern: 11
9
  ADMUX  |= (1<<MUX2) | (1<<MUX0);      // ADC5 (PIN PC5) als ADC-Kanal definieren
10
11
  ADMUX  |= (1<<ADLAR);  // Ausgabe = linksbündig
12
  DIDR0  |= 1<<ADC5D;  // Digital Input Kanal ADC5D disabled
13
14
15
16
17
// Dummy-Readout
18
19
20
  ADCSRA  |= (1<<ADSC);    // Start ADC-Wandlung
21
22
  while (ADCSRA & (1<<ADSC));     // auf Abschluss der Konventierung warten
23
24
    x=ADC;      // Ergebnis verwerfen
25
26
27
28
29
30
  while (1)// -------- Hauptschleife ---------
31
  {    
32
33
 
34
        ADCSRA |= (1<<ADSC);      // Start ADC-Wandlung
35
        while (ADCSRA & (1<<ADSC));    // auf Abschluss der Konvertierung warten
36
        variabletmp = ADC;
37
     
38
        [... weiteres Programm]
39
40
  }

variabletmp = ADC;

variabletmp wird bei ca. 0,6V Eingangsspannung am ADC dezimal ca. 30000 
groß (Uref = 1,1V).
Die Werte springen dann von Schritt zu Schritt um ca. den Wert 100.

Woran kann es liegen, mir fällt nichts mehr ein?

von Timmo H. (masterfx)


Lesenswert?

> ADMUX  |= (1<<ADLAR);  // Ausgabe = linksbündig
mach doch mal rechtsbündig

von gerri (Gast)


Lesenswert?

Timmo H. schrieb:
>> ADMUX  |= (1<<ADLAR);  // Ausgabe = linksbündig
> mach doch mal rechtsbündig

ADLAR ist jetzt 0, super, Danke!

Jetzt sind die Zahlen allerdings sehr klein.

Kann es sein, dass der ADC die Werte im "8-Bit-Modus" ausgibt?

Hätte gedacht, das der Compiler (AVR-Studio) bei
variabletmp = ADC;
automatisch den 10-Bit-Wert in variabletmp ablegt?!?

von gerri (Gast)


Lesenswert?

Die Variable variabletmp ist auf jeden Fall eine uint16_t, daran kann es 
nicht liegen.

Trotzdem spuckt der ADC bei halber Eingangsspannung den Wert 127 aus und 
nicht 511.

von gerri (Gast)


Lesenswert?

Fehler gefunden, die Messspannung war zu klein.

Alles klar, Danke, super Forum!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.