Forum: Mikrocontroller und Digitale Elektronik Probleme ADC Atmega8


von Sebastian K. (striker1985)


Lesenswert?

Hallo zusammen,
habe hier im Forum und im tutorial schon viele hilfreiche sachen 
gefunden.
Anscheinend bin ich aber zu blöd den ADC meines Atmega8 richtig zu 
verwenden.
Als rückgabewert meiner Funktion bekomme ich immer 0 egal in welcher art 
ich es bis jetzt getestet habe.Den Wert lese ich über I²C aus. Das 
funktioniert auch wunderbar mit anderen werten die ich von meinem 
Foxboard G20 (I²C Maser) sende oder anfordere (z.B. PWM sollwert etc.).
Eventuell ist auch meine Verschaltung falsch?? Ich habe RN-VN2 DualMotor 
board und will die Chiptemperatur einlesen. Diese gibt einen 
Spannungswert zwischen 0 und 2,5V auf den ich auf Pin PC2 anlege. Als 
Referenzspannung möchte ich die internen 2,56v benutzen.Da mir 8bit 
genauigkeit dafür reichen und diese über den I²C auch leichter zu senden 
sind habe ich mich für linksbündige anordnung entschieden und lese nur 
das ADCH register aus.
Mein Atmega8 läft mit 8Mhz

Anbei noch meine beiden Funktionen:

void adc_init(void)
{
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // ADC einschalten 
prescaler 64
  ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX2) | (1<<ADLAR); //Interne 
Referenzspannung, messen von PC2, linksbündige anordnung

  /* Dummy-Readout des ersten Wertes */
  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC)) //auf Abschluss der Konvertierung warten

  {
    ;
  }
}

uint8_t read_channel(uint8_t no_samples)
{
  int result = 0;
  unsigned int i;
  for (i=0; i < no_samples; i++)
  {
    ADCSRA |= (1<<ADSC); //einfache Konvertierung
    while (ADCSRA & (1<<ADSC)) //auf Abschluss der Konvertierung warten

      {
        ;
      }
    result += ADCH;
  }
  result /= no_samples;
  return (uint8_t) result;
}

Ich bin für jede Hilfe dankbar.

MfG
Striker1985

von Hubert G. (hubertg)


Lesenswert?

Würde mal sagen des 1<<MUX1 sein sollte.

von Sebastian K. (striker1985)


Lesenswert?

Danke für dein Antwort Hubert,

du hast recht ich habe mich da anscheinend im Datenblatt vertan. Leider 
ändert das nichts das selbe Problem besteht weiterhin :-(  .
Zur Information ich möchte später an PC0-PC2 den DAC verwenden und es 
liegen auch schon an den pins die Spannungen an nur möchte ich es erst 
mal  an einem Pin funktionierend haben.

MfG
Striker1985

von rudi (Gast)


Lesenswert?

Probier mal, zuerst das low-byte (ADCL) und dann das high-byte (ADCH) 
auszulesen. Das low-byte kannst du ja danach verwerfen.

von Lutz (Gast)


Lesenswert?

Sebastian Kerber schrieb:
> int result = 0;

Probier mal uint statt int.
Wieviele samples machst du?
Mit MUX2 mißt du an PC4 und nicht PC2

Sebastian Kerber schrieb:
> Mein Atmega8 läft mit 8Mhz

Sicher?

von Michael (Gast)


Lesenswert?

rudi schrieb:
> Probier mal, zuerst das low-byte (ADCL) und dann das high-byte (ADCH)
> auszulesen. Das low-byte kannst du ja danach verwerfen.

Was soll das bringen?

Im DS steht:
When ADCL is read, the ADC Data Register is not updated until ADCH is 
read. Consequently, if the result is left adjusted and no more than 
8-bit precision is required, it is sufficient to read ADCH.

von Hubert G. (hubertg)


Lesenswert?

Es könnte auch noch andere Gründe haben warum es nicht funktioniert.
Wie sieht die Hardware aus, AVCC mit VCC verbunden, Kondensator an AREF 
?

von Sebastian K. (striker1985)


Lesenswert?

Danke für die vielen Antworten.

Lutz schrieb:
> Sebastian Kerber schrieb:
>> int result = 0;
>
> Probier mal uint statt int.
leider selbes Ergebnis
> Wieviele samples machst du?
Momentan mache ich 5 samples
> Mit MUX2 mißt du an PC4 und nicht PC2
Das mit dem Mux hab ich behoben. Hatte mich wie gesagt vertan.
>
> Sebastian Kerber schrieb:
>> Mein Atmega8 läft mit 8Mhz
>
> Sicher?
Naja was heist sicher... Ich habe einen externen 8Mhz Quarz 
angeschlossen und die PWM läuft ja auch wie sie soll.

Michael schrieb:
> rudi schrieb:
>> Probier mal, zuerst das low-byte (ADCL) und dann das high-byte (ADCH)
>> auszulesen. Das low-byte kannst du ja danach verwerfen.
>
> Was soll das bringen?
>
> Im DS steht:
> When ADCL is read, the ADC Data Register is not updated until ADCH is
> read. Consequently, if the result is left adjusted and no more than
> 8-bit precision is required, it is sufficient to read ADCH.

Ja genau deswegen lese ich ja so aus.

Hubert G. schrieb:
> Es könnte auch noch andere Gründe haben warum es nicht funktioniert.
> Wie sieht die Hardware aus, AVCC mit VCC verbunden, Kondensator an AREF
> ?

AVCC und VCC sind auf meinem Pollin Evaluationsboard direkt verbunden. 
Zwischen AREF und GND habe ich einen 100nF Keramikkondensator 
angeschlossen
ansonsten liegen nur die Spannungen an PC0-PC2. Diese habe ich auch mit 
dem Multimeter schon nachgemessen.

MfG
Striker1985

von Tim (Gast)


Lesenswert?

Spannung an AREF nachgemessen?

von Sebastian K. (striker1985)


Lesenswert?

Tim schrieb:
> Spannung an AREF nachgemessen?
Ja habe ich gerade gemacht, da messe ich nur 440mV. Wenn ich den 
Kondensator entferne schwankt die Spannung sehr stark zwischen 200mV und 
800mV.

komischerweise funktioniert der ADC mit diesem Programm das ich beim 
googeln gefunden habe. Messwerte sind die selben an AREF.
1
uint16_t readADC(uint8_t channel) {
2
  uint8_t i;
3
  uint16_t result = 0;
4
  
5
  // Den ADC aktivieren und Teilungsfaktor auf 64 stellen
6
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
7
8
  // Kanal des Multiplexers waehlen
9
  // Interne Referenzspannung verwenden (also 2,56 V)
10
  ADMUX = channel | (1<<REFS1) | (1<<REFS0);
11
  
12
  // Den ADC initialisieren und einen sog. Dummyreadout machen
13
  ADCSRA |= (1<<ADSC);
14
  while(ADCSRA & (1<<ADSC));
15
  
16
  // Jetzt 3x die analoge Spannung and Kanal channel auslesen
17
  // und dann Durchschnittswert ausrechnen.
18
  for(i=0; i<3; i++) {
19
    // Eine Wandlung
20
    ADCSRA |= (1<<ADSC);
21
    // Auf Ergebnis warten...
22
    while(ADCSRA & (1<<ADSC));
23
    
24
    result += ADCW;
25
  }
26
  
27
  // ADC wieder deaktivieren
28
  ADCSRA &= ~(1<<ADEN);
29
  
30
  result /= 3;
31
  
32
  return result;
33
}
finde nur keine Unterschiede im setzen der Register

MfG
Striker1985

von Sebastian K. (striker1985)


Lesenswert?

Ok Kommando zurück. Er funktioniert auch mit diesem programm nicht 
richtig, aber zumindest bekomme ich nicht immer 0 zurück. Als ich zum 
testen mal die Leitung zu PC2 gekappt hab hat er mir als Rückgabewert 
zahlen zwischen 100 und 180 gebracht. Wenn ich die Leitung angeschlossen 
habe sind die werte ziemlich genau die selben wie die ich durch das 
messen mit dem Multimeter erwartet habe. Ist das normal?
MfG
Striker1985

von Tim (Gast)


Lesenswert?

>Als ich zum
>testen mal die Leitung zu PC2 gekappt hab hat er mir als Rückgabewert
>zahlen zwischen 100 und 180 gebracht.

Ist doch OK. Wenn Das Pin in der Luft hängt, bekommst du durch
Störeinflüsse alle möglichen werte.

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.