www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AREF bei ATMega8


Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

Ich habe mir eine Taschenlampe mit einem RGB-LED und einem ATMega8 
gebaut (siehe Bild).

Das Problem ist, ich habe an AREF 5V gebracht vom Spannungsregler 7805. 
Die Batterie-Spannung wird im Verhätnis 1.8 geteilt daher mit 8.7V 
Batteriespannung (100% Landung) wird ca. 4.8V erzeugt. Fällt die 
Spannung nun auf 6.6V ab, dies ist die Spannung wo noch 5V erzeugt 
werden kann, enspricht die ADC-Spannung 3.6V.

So: Fällt nun die Spannung unter 6.6V kann 5V nicht mehr erzeugt werden, 
daher fällt die Referenzspannung ab. z.B. auf 4V. Die ADC-Spannung von 
der Batterie, entspricht aber z.B. 3V. Dies beteutet, dass die 
Spannungsanzeige wieder ansteigt, was ja nicht sein darf... grrrrr.

So könnte ich die interne Referenzspannung für das Vorhaben nutzen?

Dann hätte ich 2.56V ja?

Frage: Fällt diese Spannung auch, wenn der AVR nicht mehr 5V bekommt?
Frage2: AREF muss dann mit C an GND geschlossen werden?
Frage3: Initialisierung der internen Referenzspannung, wie geht das? 
Siehe Beispiel unten wie es jetzt gemacht wird. Was muss ich da ändern?
Frage4: Ist GND and Pin22 mit Pin8 verbunden? Oder dient dieser Pin für 
die ADC-Gruppe?

Danke für Eure Hilfe.

Gruss Fox
  ADMUX = 0;                          // auch ADMUX = 2; (Kanalnummer) oder ADMUX = 0b00000010;
  ADCSRA = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;    // Initialisierung des ADC über das ADCSRA-Register





 while(1){    


int value;

  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {

     ;     // auf Abschluss der Konvertierung warten 
  }

  value = ADCW;


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

Bewertung
0 lesenswert
nicht lesenswert
Fox wrote:

> So könnte ich die interne Referenzspannung für das Vorhaben nutzen?

Ja.

> Dann hätte ich 2.56V ja?

Ja.

> Frage: Fällt diese Spannung auch, wenn der AVR nicht mehr 5V bekommt?

Die fällt erst, wenn AVcc irgendwo unter 3V oder so fällt. Genaueres 
steht im Datenblatt.

> Frage2: AREF muss dann mit C an GND geschlossen werden?

Ja.

> Frage3: Initialisierung der internen Referenzspannung, wie geht das?

Siehe Abschnitt im Datenblatt, da ist das auführlich beschrieben.

> Siehe Beispiel unten wie es jetzt gemacht wird. Was muss ich da ändern?

ADMUX Wert anpassen.

> Frage4: Ist GND and Pin22 mit Pin8 verbunden?

ja

>Oder dient dieser Pin für die ADC-Gruppe?

Ja.

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So Danke für die Antworten.

Habe mal Simuliert!

Im Handbuch steht: REFS1 = 1 und  REFS0 = 1   für Internal 2.56V Voltage 
Reference with external capacitor at AREF pin.

Dies steht unterhalb von ADC Multiplexer Selection.

habe mal probiert mit ADMUX = 0b11000000;

Dies klappt bestens. Enspricht daher ADMUX=0 / 0b00000000; ???

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Brauche Eure Hilfe

Etwas geht nicht.

Also im unten stehenden Code funktioniert die ADC-Wandlung, wenn ich 
AREF auf 5V hänge. Wenn ich aber wie in der Simulation auf dem 
Breadboard den internen AREF ansprechen möchte, klappt es nicht.

Ich habe jetzt den Spannungsteiler so gemacht, dass ich 1.7V bei 8.4V 
habe. Daher gehen 1.7V auf den ADC0.

Was ist noch falsch? Momentan leuchten alle LEDs das heisst ich habe 
einen Bitwert von 1023.

int main (void) {   



   DDRB = 0b11111111;             // 
   PORTB = 0b00000000;             // 

   DDRC = 0b11111100;            //
   PORTC = 0b0000000;             //

   DDRD = 0b01111111;            // PD7 = Taster
   PORTD = 0b10000000;             //      
   

  ADMUX = 0b11000000;        // Für interne Referenzspannung   ADMUX = 0b11000000;
                          // auch ADMUX = 2; (Kanalnummer) oder ADMUX = 0b00000010;
  ADCSRA = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;    // Initialisierung des ADC über das ADCSRA-Register





 while(1){    


int value;

  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {

     ;     // auf Abschluss der Konvertierung warten 
  }

  value = ADCW;




if (value<814){

      PORTB = 0b00000001;
    PORTC = 0b00000011;     

  ADCSRA |= (1<<ADSC);                          // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {                // auf Abschluss der Konvertierung warten 
  }  

  value = ADCW;
}

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hat geklappt.

Hatte noch Probleme mit einem Analog-Kanal. Daher dort war 5V drauf.

Danke und Gruss Fox

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.