Forum: Mikrocontroller und Digitale Elektronik AREF bei ATMega8


von Fox (Gast)


Angehängte Dateien:

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
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;

von Benedikt K. (benedikt)


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.

von Fox (Gast)


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; ???

von Fox (Gast)


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.
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
}

von Fox (Gast)


Lesenswert?

So hat geklappt.

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

Danke und Gruss Fox

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.