Forum: Mikrocontroller und Digitale Elektronik ADC zeigt genau halbe Werte an.


von Sebastian K. (striker1985)


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

von Peter II (Gast)


Lesenswert?

keien ahnung warum das nur halb so gross ist wie erwartet, aber

#define NO_ADC_READS 5

ist sehr ungünstig gewählt. Mach lieber 4 oder 8 dann rechnet es sich 
für den µC besser.

von Sebastian K. (striker1985)


Lesenswert?

Hi Peter,

ist nur im moment 5 habe schon mit allen Werten bis 20 gespielt ohne 
Erfolg.
Aber vielen dank für den Tipp war mir so nicht bewusst.

MfG
Striker1985

von Anja (Gast)


Lesenswert?

Peter II schrieb:
> keien ahnung warum das nur halb so gross ist wie erwartet,
Vermutlich hat der AREF-Pin einen Kurzschluß nach +5V

Gruß Anja

von Roland H. (batchman)


Lesenswert?

Mit welcher Frequenz läuft die CPU?

Probier mal, den Vorteiler auf den größten Wert zu stellen: /128

Das mit ADCH/linksbündig mag vielleicht gehen, ich würde dennoch ADCW 
nehmen (mit rechtsbündig).

von Unlucky2012 (Gast)


Lesenswert?

Roland H. schrieb:
> Das mit ADCH/linksbündig mag vielleicht gehen, ich würde dennoch ADCW
> nehmen (mit rechtsbündig).
Und was macht das letztendlich für einen Unterschied?

von spess53 (Gast)


Lesenswert?

Hi

>Und was macht das letztendlich für einen Unterschied?

Ein vollkommen falsches Ergebnis. Schon mal überlegt, was 'ADLAR' macht?

MfG Spess

von 0x53 0x54 0x45 0x46 0x41 0x4E (Gast)


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).

von Sebastian K. (striker1985)


Angehängte Dateien:

Lesenswert?

Hallo Anja,

mein Aufbau ist im Anhang zu sehen. Der Tipp mit dem Kurzschluss ist 
gut. Leider kann ich ihn nicht finden. Allerding liegt bei Betrieb %v an 
AREF an.

MfG
Striker1985

von spess53 (Gast)


Lesenswert?

Hi

Überlest meinen letzten Beitrag.

Der TO will nur 8 Bit. Also ist ADLAR und das Lesen von ADCH der 
richtige Weg.

MfG Spess

von Unlucky2012 (Gast)


Lesenswert?

spess53 schrieb:
> Ein vollkommen falsches Ergebnis. Schon mal überlegt, was 'ADLAR' macht?

Das liegt dann aber an der falschen Interpretation des Ergebnisses.

von GeraldB (Gast)


Lesenswert?

Trenne mal die Versorgungsspannung und entferne dann den µC aus der 
Fassung. Messe jetzt mal nach, ob es zwischen AVCC(20) und AREF(21) 
versehentlich eine Verbindung gibt.

von Sebastian K. (striker1985)


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

von Peter II (Gast)


Lesenswert?

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

von Walter S. (avatar)


Lesenswert?

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

von Sebastian K. (striker1985)


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.

von Sebastian K. (striker1985)


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

von Peter II (Gast)


Lesenswert?

Sebastian Kerber schrieb:
> Ich nutze die selbe
> Platine das gleiche Programm und Baugleiche MC.

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.

von Sebastian K. (striker1985)


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

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.