attiny batterie-Überwachung

OP #2538840
Hi,
Ich will gerade in einer Schaltung mit einem tiny461 den eigenen 
Batterie-Status überwachen.

dazu habe ich Vref auf VCC gestellt und mux auf 1.1V
1
/**
2
 * \return  supply voltage in [V/100]
3
 */
4
static uint16_t getBatteryState()
5
{
6
  uint16_t vBat;
7
  ADMUX =   (0<<REFS1) | (0<<REFS0)  // VCC 
8
          | (1<<ADLAR)  // leftadjust result
9
          | (30 << MUX0); // Chanel 30 -> 1.1V
10
  ADCSRB = 0;
11
  ADCSRA =   (1<<ADEN) | (1<<ADSC)
12
           | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 16 --> 125kHz
13
  while( ADCSRA & (1<<ADSC)){
14
    /* do nothing */;
15
  }
16
  ADCSRA = (1<<ADSC);
17
  while( ADCSRA & (1<<ADSC)){
18
    /* do nothing */;
19
  }  
20
  // measuring 1.1V with battery voltage as reference
21
  // -> ADCH = (1.1*256) / V_bat  // with left adjusted result
22
  // V_bat = 281.6V/ADCH
23
  // V_bat = 28160/ADCH  * 1V/100
24
  // 
25
  
26
  vBat = 28160/ADCH;
27
  ADCSRA = 0;
28
  return vBat;
29
}

Ich bekomme immmer Werte um die 3.5V, obwohl ich an 5V hänge
Außerdem habe ich festgestellt, dass der Wert abhängig davon zu sein 
scheint, was an einem anderen Pin, den ich in einer anderen Routine 
Messe, anliegt.
1
static bool getPinState()
2
{
3
  bool res;
4
  ADMUX =   (1<<REFS1) | (0<<REFS0)  //internal 2.56 without cap on aref
5
          | (1<<ADLAR)  // leftadjust result
6
          | (MONITORED_ADC_CHAN << MUX0);
7
  ADCSRB = (1<<REFS2) ;
8
  ADCSRA =   (1<<ADEN) | (1<<ADSC)
9
           | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 2 --> 1000kHz -> no full resolution
10
  while( ADCSRA & (1<<ADSC)){
11
    /* do nothing */;
12
  }
13
  ADCSRA = (1<<ADSC);
14
  while( ADCSRA & (1<<ADSC)){
15
    /* do nothing */;
16
  }  
17
  res = ADCH > 70;
18
  ADCSRA = 0;
19
  return res;
20
}

testweise rufe ich die hintereinander auf. Später werden die in recht 
großen abständen aufgerufen, deswegen auch die deaktivierung und 
neuintialisierungen des ADCs.
Ich hab schon testwesie eine Mssung eingeführt, die ich verwerfe, was 
aber unnötig sein sollte, wenn der ADC nicht läuft, wärend des 
Umstellens von ref und mux. Ändert aber auch nix.


was übersehe ich, hat jemand einen Tip?
Gast #2538940
> ADCSRA =   (1<<ADEN) | (1<<ADSC)
>           | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 16 --> 125kHz
>  while( ADCSRA & (1<<ADSC)){
>    /* do nothing */;
>  }

>  ADCSRA = (1<<ADSC);

Mach mal ADCSRA |= (1<<ADSC); daraus.
OP #2538988
aaa schrieb:
> Mach mal ADCSRA |= (1<<ADSC); daraus.

stimmt, das ist falsch.
ist ja aber erst reingekommen, nachdem ich den Fehler schon vorher 
gesehen habe.

Das Problem löst es trotzdem nicht, obwohl es in die richtige richtung 
geht.
be 5V bekomme ich 4.2V raus.
bei 2.5V stimmts.

für einen nichtlinearen Fehler des ADCs wäre das aber etwas viel, odeR?
OP #2540493
also ich habs jetzt aufgegeben und doch nen externen Spannungsteiler 
verwendet.

Wäre ja auch zu schön gewesen, wenn man ohne Zusatzbeschaltung und 
externe Pins die Stromversorgung überwachen könnte.

Wenn noch jemand Tips hat, bin ich trotzdem interessiert.
#2540499
Hast du kontrolliert, wie gut dir die 1.1V garantiert werden?

Bei diesem Tiny hab ich das nicht nachgesehen, aber ich weiss von den 
anderen Prozessoren, dass zb die internen 2.56V mitnichten 2.56V sind. 
Die können ganz schön um diesen Wert streuen. Die interne 
Referenzspannung ist hautsächlich eines: sie ist stabil. Aber ob sie 
genau den Wert hat, ist eine andere Geschichte.
OP #2540697
Bernd schrieb:
> Wer lesen kann, ist im Vorteil:
>
> "Nirgends"
> ist im Datenblatt ATTiny261/461/861 Kapitel 19.5 (S. 190)
>
> 1,0 ... 1,2 V.

das habe ich tatsächlich übersehen.


interessant ist vor allem t_BG, die ist nicht unerheblich
oder gilt die hier nicht.
unter ADC CHaracteristics steht davon nix mehr.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.