Forum: Mikrocontroller und Digitale Elektronik ATMega328P Eigene Spannungsversorgung messen


von Z.B. Max (darter)


Lesenswert?

Hi,
mit dem Code erwarte ich die Ausgabe der Spannung am Vcc auf dem 
Seriellen Port.
Bis etwas 3,8V Stimmt die Ausgabe ziemlich exakt. Danach Springt die 
Ausgabe auf 3000 und seigt bei Erhöhung der Spannung an.
Was mach ich falsch?
Auch wen ich mir die Rohdaten vom ADC ausgebe sehe ich bei ca. 3,8V 
diesen Sprung.
1
int getVoltagefromVCCPin()
2
{       
3
    ADMUX = _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
4
5
    delay(5); // wait for Vref to settle
6
7
    ADCSRA |= _BV(ADSC); // reading ADC
8
    while (bit_is_set(ADCSRA, ADSC)); //ADSC will be set to 0 wen conversion is finished
9
10
    uint8_t low = ADCL;
11
    unsigned int adcVal = (ADCH << 8) | low;
12
13
    // discard previous result
14
    ADCSRA |= _BV(ADSC); // Convert
15
    while (bit_is_set(ADCSRA, ADSC));
16
    low = ADCL;
17
    adcVal = (ADCH << 8) | low;
18
    //return adcVal;
19
20
    return ((long)1024 * 1100) / adcVal;
21
}
22
23
void setup() 
24
{
25
}
26
27
void loop() 
28
{
29
  Serial.println( getVoltagefromVCCPin() );
30
  delay(100);
31
}

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Mir scheint, dass nicht die Spannung an AVcc, sondern die an AREF 
gemessen wird.

von Z.B. Max (darter)


Lesenswert?

S. L. schrieb:
> Mir scheint, dass nicht die Spannung an AVcc, sondern die an AREF
> gemessen wird.

Danke. Ich hatte mir die Funktion für nen ATTiny85 geschrieben, da ist 
Vcc als default und habe nur den MUX angepasst und REF vergessen.

Damit ist es gefixt danke.
1
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);

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.