mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 90mA am ADC Eingang des ATMega644p?


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte u.a. mit meinem ATMega644p eine Spannung messen. Für die ADC 
verwende ich den Code aus dem Tutorial hier (leicht abgwandelt, die 
Mittelwertbildung habe ich weggelassen):
#include <stdlib.h>
#include <avr/io.h>


uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (1<<REFS0); // interne Referenzspannung nutzen
 
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
                               // setzen auf 8 (1) und ADC aktivieren (1)
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.
 
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  result = 0; 
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while ( ADCSRA & (1<<ADSC) ) {
     ;   // auf Abschluss der Konvertierung warten
  }
  result = ADCW;        // Wandlungsergebnisse aufaddieren
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
  return result;
}

Im Hauptprogramm wird dann nur noch mit
  DDRA = 0x0F;
 Port A zum Engang gemacht, ein Timer initialisiert und in dessen 
Interrupt routine
ReadChannel(1)
 aufgerufen:

//Timer1 interrupt
ISR(TIMER1_OVF_vect)
{

  uint16_t adcval;
  adcval = ReadChannel(1);
  float v = adcval;
  set_cursor(9,2);
  lcd_string("Bat:");
  dtostrf(v,2,1,text);
  lcd_string(text);
}

Alles funktioniert soweit wie gewünscht, nur messe ich einen Strom von 
ca. 90mA am Eingang des µC! Sowohl auf dem STK500 als auch auf meiner 
Platine.

Hat jemand eine Idee, was da faul sein könnte?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest du den Pin mal auf Eingang schalten?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast nicht zufällig Vref an GND oder VCC angeschlossen?
LCD Ausgaben, Berechnungen etc gehören NICHT in den Timerinterupt!
Prüf mal nach ob du auch wirklich den richtigen Pin auf Eingang 
geschaltet hast und nicht z.B. eine ander routine dir das wieder 
überschreibt.
Und wo kommt die Spannung her?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich Idiot hatte Eingang und Ausgang verwechselt Krrrr....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.