AREF bei ATMega8

Gast #877050
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
1
  ADMUX = 0;                          // auch ADMUX = 2; (Kanalnummer) oder ADMUX = 0b00000010;
2
  ADCSRA = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;    // Initialisierung des ADC über das ADCSRA-Register
3

4

5

6

7

8
 while(1){    
9

10

11
int value;
12

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

16
     ;     // auf Abschluss der Konvertierung warten 
17
  }
18

19
  value = ADCW;
Angehängte Dateien:
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.
Gast
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; ???
Gast
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.
1
int main (void) {   
2

3

4

5
   DDRB = 0b11111111;             // 
6
   PORTB = 0b00000000;             // 
7

8
   DDRC = 0b11111100;            //
9
   PORTC = 0b0000000;             //
10

11
   DDRD = 0b01111111;            // PD7 = Taster
12
   PORTD = 0b10000000;             //      
13
   
14

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

19

20

21

22

23
 while(1){    
24

25

26
int value;
27

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

31
     ;     // auf Abschluss der Konvertierung warten 
32
  }
33

34
  value = ADCW;
35

36

37

38

39
if (value<814){
40

41
      PORTB = 0b00000001;
42
    PORTC = 0b00000011;     
43

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

48
  value = ADCW;
49
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.