Forum: Mikrocontroller und Digitale Elektronik ADC Atmega8L - Unterschiede Atmega8?


von L. R. (badinode)


Lesenswert?

Hallo,

ich betreibe einen M8L@3.3V mit dem Quellcode eines M8 der bei 5V läuft. 
Dabei fällt mir auf, dass der ADC bei 0-1650mV Werte von 0-777 liefert, 
und bei 1650-3300mV Werte von 1000-1777.
Ist das normal? Ich hätte schon erwartet, dass der Bereich 777-1000 auch 
ausgefüllt wird.
Oder mach ich irgendwo einen Fehler?

Eine weitere Sache die mir nicht ganz einleuchtet. Bei 10 Bit hab ich 
einen Bereich von 0-1023. Der ADC geht aber bis 1777. Warum?

Danke.

von Falk B. (falk)


Lesenswert?

@ L. R. (badinode)

>ich betreibe einen M8L@3.3V mit dem Quellcode eines M8 der bei 5V läuft.
>Dabei fällt mir auf, dass der ADC bei 0-1650mV Werte von 0-777 liefert,
>und bei 1650-3300mV Werte von 1000-1777.
>Ist das normal?

Der ADC liefert sicher keine 1777. Denn der macht bestenfalls 10 Bit, 
sprich 1023 ist das Maximum.

>Oder mach ich irgendwo einen Fehler?

Wahscheinlich liefert deine Funktion schon ein in mV umgerechnetes 
Ergbnis. Und wenn der Code für 5V Betriebs-und Referenzspannung 
ausgelegt ist, dann klappt das mit 3.3V eben nicht.

>einen Bereich von 0-1023. Der ADC geht aber bis 1777. Warum?

Siehe oben.

Festkommaarithmetik

MfG
Falk

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das schreit nach einem Programmfehler und normal ist das keinesfalls.

von L. R. (badinode)


Lesenswert?

1
void adc_init(void) {
2
      ADMUX = 0b01000000;
3
      ADCSRA |= 0x80;
4
}
5
6
uint16_t readadchan(char n) {
7
8
      ADMUX = n;
9
      ADMUX |= 0x40;
10
      ADCSRA |= 0x44;
11
12
      while((ADCSRA & 0x40) !=0){};
13
14
      ADCSRA &= ~(0x44);
15
      return ADCW;
16
}

Das ist der Code. readadchan() wird öfters aufgerufen um zu mitteln.
Es findet keine Umrechnung in Spannungen oder sonstws statt. Ich gebe 
direkt den ADC-Wert aus.

von yalu (Gast)


Lesenswert?

Wo ist das Problem?

   0- 777 (oktal) ->   0- 511 (dezimal)
1000-1777 (oktal) -> 512-1023 (dezimal)

von L. R. (badinode)


Lesenswert?

Oh Mann...

Danke yalu :)

von L. R. (badinode)


Lesenswert?

Okay, nun nochmal für diejenigen, denen das vielleicht auch mal 
passieren sollte.

Der Fehler lag im
1
itoa(a, buf, 8);
. Hatte irrtümlicherweise angenommen, die 8 stünde für die Bufferlänge. 
Dabei steht sie für Octal. Also muss da eine 10 draus werden und gut is.

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.