Forum: Mikrocontroller und Digitale Elektronik ATMega1281 und ADC (Spannungseinbruch)


von Sebastian (Gast)


Lesenswert?

Hallo

ich hab ein Problem mit dem ADC des ATMega1281:

ich will mit den freien ADC-Eingängen die Versorgungsspannungen auf dem 
Board überwachen. Das sind 12V, 3.3V und -5V. Referenzspannung ist 
4.096V.
Bei 3.3V (3. Kanal) und -5V (4.Kanal) funktioniert die Messung ohne 
Probleme.
Nur bei 12V (2. Kanal) misst er immer 0;
Die 12V werden über einen 30K und 10K Spannungsteiler auf 3V gebracht 
und dann zum ADC. Da bricht die Spannung auf ca. -0.5V ein. Wenn ich den 
Pin des ATMega anhebe stimmen die 3V wieder.
Der ATMega wurde schon getauscht, hat aber keine Besserung gebracht.

Hoffe ihr wisst abhilfe.
Sebastian

Der Code:
1
// Messwert erfassen
2
uint16_t adc_mess(uint8_t channel)
3
{
4
  uint8_t i;
5
  uint16_t u16Messwert;
6
  
7
  // ADC einschalten und Prescaler auf 111 (125 kHz)
8
  PRR0 &= ~(1 << PRADC);
9
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
10
11
  // Externe Referenzspannung und Ergebnis rechtsbündig / low byte first
12
  switch (channel)
13
  {
14
  case 0:   // 1.Kanal
15
    ADMUX = 0x00;
16
    break;
17
  case 1:   // 2.Kanal
18
    ADMUX = 0x01;
19
    break;
20
  case 2:   // 3.Kanal
21
    ADMUX = 0x02;
22
    break;
23
  case 3:   // 4.Kanal
24
    ADMUX = 0x03;
25
    break;
26
  default:
27
    ADCSRA &= ~(1<<ADEN);
28
    PRR0 |= (1 << PRADC);
29
    return 0;
30
  }
31
32
 
33
  // Dummy-Messung
34
  ADCSRA |= (1<<ADSC);
35
  while ( ADCSRA & (1<<ADSC) ) 
36
  {;}
37
  u16Messwert = ADCW;        // Register auslesen
38
  u16Messwert = 0;        // Messwert verwerfen 
39
  
40
  // Messung starten
41
  for(i = 0; i < ANZAHL_MESSUNGEN; ++i)
42
  {
43
      ADCSRA |= (1<<ADSC);
44
      while ( ADCSRA & (1<<ADSC) ) 
45
    {;}
46
    u16Messwert += ADC;      // Ergebnisse addieren  
47
  }
48
  // ADC ausschalten
49
  ADCSRA &= ~(1<<ADEN);
50
  PRR0 |= (1 << PRADC);
51
 
52
   // Mittelwert aus den Messungen
53
  u16Messwert /= i;
54
 
55
  return u16Messwert;
56
}

von Marius W. (mw1987)


Lesenswert?

Wie zum Teufel misst du denn bitte -5 V richtig? Gib mal Schaltplan!

Dir ist schon klar, dass der AVR-ADC keine negativen Spannungen messen 
kann.

MfG
Marius

von Spezi (Gast)


Lesenswert?

Hallo,

normal kann an einem Controller, der nur eine (positive) 
Versorgungsspannung hat, keine negative Pin-Spannung auftreten. Das 
führt zu der schon gestellten Frage, wie du die -5V denn misst (die 
einzige negative Spannung, die erwähnt wird).
Vielleicht klemmst du zum Test die -5V ab und prüfst die 12V-Messung ...

Und noch etwas zur ADC-Routine: es ist unsinnig, bei jedem 
Wandlungsvorgang den ADC ein- und nach der Wandlung wieder 
auszuschalten. Dadurch verschenkt man unnötig Rechenzeit durch die 
"Dummy-Messung". Das Einschalten des ADC (und nur das Einschalten!) 
sowie das Anstossen der Dummy-Messung braucht nur einmal in einer 
ADC-Init-Routine passieren. Dann muss man in der Mess-Routine nur noch 
den Kanal wählen, den Wandler starten und auf das Ergebnis warten.
Ein Abschalten des ADC ist in der Regel nicht erforderlich.

MfG

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Die -5V messe ich mittels Spannungsteiler. Bei -5V kommen 2V raus, das 
passt auch.

Ich Schalte den ADC wieder aus, da die Schaltung mittels Akku läuft und 
es auf Rechenzeit nicht ankommt. Eine Messung alle 100ms.

von Michael U. (amiga)


Lesenswert?

Hallo,

der zugehörige ADC-Pin ist auch wirklich Eingang?
Deine Beschreibung klingt so, als ob er als Ausgang programmiert ist.

Gruß aus Berlin
Michael

von Sebastian (Gast)


Lesenswert?

Ich hab jetzt nochmal extra DDRF mit 0 belegt und der Eingang schwankt 
jetzt zwischen -0.5 und etwa 2V.

von Sebastian (Gast)


Lesenswert?

weiß keiner woran das liegen kann?

von holger (Gast)


Lesenswert?

>Ich hab jetzt nochmal extra DDRF mit 0 belegt und der Eingang schwankt
>jetzt zwischen -0.5 und etwa 2V.

>weiß keiner woran das liegen kann?

Ich würde sagen der Pin floatet. Nicht angeschlossen.
Mit dem Spannungsteiler der da dran hängen soll kann
die Spannung gar nicht negativ werden.

von Sebastian (Gast)


Lesenswert?

es muss irgendwas mit dem ATmega sein. Kann ich den falsch 
konfigurieren?
Wenn ich den Pin vom Pad trenne, passt die Spannung am Spannungsteiler.

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.