ADC zeigt genau halbe Werte an.

OP #2605782
Lesenswert?

Hallo zusammen,

ich habe ein Problem mit den ADC des Atmega8. Er zeigt mir ziemlich 
genau immer den halben Wert des erwarteten an.
D.h. ich benutze die interne Referenzspannung von 2,56V und wenn ich mit 
einem Poti und Spannungsteiler 2,5V anlege bekomme ich als Wert 128 
anstatt erwartete 255. Ich habe die Wandlung absichtlich nur auf 8bit da 
mir das genügt und sich die werte per I²C so besser übertragen lassen.
Die werte überprüfe ich ohne veränderungen an der Ausgabe des Programms 
das die I²C daten empfängt.
Anbei mein Code:
1
 
2
#define NO_ADC_READS 5
3

4
uint8_t readADC(uint8_t channel)
5
{
6
  uint8_t i;
7
  uint16_t result = 0;
8
  
9
  // Den ADC aktivieren und Teilungsfaktor auf 64 stellen
10
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
11

12
  // Kanal des Multiplexers waehlen, linke Anordnung da nur 8bit genauigkeit benötigt werden
13
  // Interne Referenzspannung verwenden (also 2,56 V)
14
  ADMUX = channel | (1<<REFS1) | (1<<REFS0) | (1<<ADLAR);
15
  
16
  // Den ADC initialisieren und einen sog. Dummyreadout machen
17
  ADCSRA |= (1<<ADSC);
18
  while(ADCSRA & (1<<ADSC));
19
  
20
  // Jetzt NO_ADC_READS x die analoge Spannung am Kanal auslesen
21
  // und dann Durchschnittswert ausrechnen.
22
  for(i=0; i < NO_ADC_READS; i++)
23
  {
24
    // Eine Wandlung
25
    ADCSRA |= (1<<ADSC);
26
    // Auf Ergebnis warten...
27
    while(ADCSRA & (1<<ADSC));
28
    //Ergebnis aufaddieren
29
    result += ADCH;
30
  }
31
  
32
  // ADC wieder deaktivieren
33
  ADCSRA &= ~(1<<ADEN);
34
  // Durchschnittswert ermitteln
35
  result /= NO_ADC_READS;
36

37
  return result;
38

39
}
40
  
41
temp_motordriver = readADC(2);
Vielen Dank im Voraus
Striker1985
Gast #2605872
Lesenswert?

Sebastian Kerber schrieb:
> Er zeigt mir ziemlich
> genau immer den halben Wert des erwarteten an.

Dieses Problem hatte ich auch mal. Schnapp dir ein Oszi und schau dir 
die Spannung am AREF Pin an (Ladekurve des externen Kondensators). Dazu 
ist es hilfreich, einen externen Pin des ATmega zum triggern zu benutzen 
(Start der Messung).
OP #2605972
Lesenswert?

Hi GeraldB,

habe ich schon gemacht. Ich habe einen Wiederstand von ca. 180 Ohm gegen 
VCC gemessen. Habe auch mal einen anderen MC getestet und zumindest mal 
beim Messen sieht es da besser aus. Ich messe dann 2,5V von AREF nach 
GND.
Leider funktioniert mit diesem MC der I²C bus nicht.
Ich werde morgen mal die Fusebits checken denn was anderes kann ich mir 
nicht vorstellen da der Code und der MC ja der gleiche ist. Für Ideen zu 
diesem Problem bin ich auch offen.

MfG
Striker1985
OP #2606012
Lesenswert?

Peter II schrieb:
> kannst du mal 5V an den ADC anlegen und schauen ob er Wert > 128 wird?

Habe mal zum Test 3V angelegt und der Wert stieg auf 150 das spricht für 
die Theorie das mit der referenzspannung was nicht stimmt.

Walter S. schrieb:
> Sebastian Kerber schrieb:
>> Ich habe einen Wiederstand von ca. 180 Ohm gegen
>> VCC gemessen.
>
> wenn der mc abgezogen ist, darf da weder ein Wiederstand, noch ein
> Widerstand zwischen Pin 20 und 21 sein


Das war mit eingestecktem MC gemessen.
OP #2607333
Lesenswert?

Hallo zusammen,

habe nun schon2 andere Atmega8 getestet und mit beiden geht trotz 
gleicher Fusebits und des gleichen Programms der I²C bus nicht. Bekomme 
keine Verbindung mit meinem Master aufgebaut. Mit dem Atmega8 der das 
ADC Problem hat funktioniert der I²C bus einwandfrei. Hat irgendeiner 
eine Idee wo noch ein unterschied sein könnte?Ich nutze die selbe 
Platine das gleiche Programm und Baugleiche MC.

MfG
Striker 1985
OP #2607352
Lesenswert?

Peter II schrieb:
> na irgendwo muss der unterschied sein. Vergleiche alles noch einmal. Zur
> not erstmal ein Testprogramm wo alles Pins "blinken" damit du sehen
> kannst ob die IO-Port richtig arbeiten - auch mit der richtigen
> frequenz.

Hi Peter,

das ist mir auch klar, die Frage ist nur wo. alle Pins mit Led's wird 
schwierig da die Platine auf die Schaltung abgestimmt ist.
Ich habe eine status LED die beim Booten im Takt von 5Hz blinkt und 
danach beim eintreten der endlosschleife im 1Hz Takt blinkt und diese 
funktioniert 1a. Auch die PWM die meine Motoren ansteuert arbeitet mit 
allen MC's.
Werde mal eine Led anbauen um zu sehen ob die Interruptroutine des I²C 
aufgerufen wird.

MfG
Striker1985

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