www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik attiny batterie-Überwachung


Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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
/**
 * \return  supply voltage in [V/100]
 */
static uint16_t getBatteryState()
{
  uint16_t vBat;
  ADMUX =   (0<<REFS1) | (0<<REFS0)  // VCC 
          | (1<<ADLAR)  // leftadjust result
          | (30 << MUX0); // Chanel 30 -> 1.1V
  ADCSRB = 0;
  ADCSRA =   (1<<ADEN) | (1<<ADSC)
           | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 16 --> 125kHz
  while( ADCSRA & (1<<ADSC)){
    /* do nothing */;
  }
  ADCSRA = (1<<ADSC);
  while( ADCSRA & (1<<ADSC)){
    /* do nothing */;
  }  
  // measuring 1.1V with battery voltage as reference
  // -> ADCH = (1.1*256) / V_bat  // with left adjusted result
  // V_bat = 281.6V/ADCH
  // V_bat = 28160/ADCH  * 1V/100
  // 
  
  vBat = 28160/ADCH;
  ADCSRA = 0;
  return vBat;
}

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.

static bool getPinState()
{
  bool res;
  ADMUX =   (1<<REFS1) | (0<<REFS0)  //internal 2.56 without cap on aref
          | (1<<ADLAR)  // leftadjust result
          | (MONITORED_ADC_CHAN << MUX0);
  ADCSRB = (1<<REFS2) ;
  ADCSRA =   (1<<ADEN) | (1<<ADSC)
           | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // 2 --> 1000kHz -> no full resolution
  while( ADCSRA & (1<<ADSC)){
    /* do nothing */;
  }
  ADCSRA = (1<<ADSC);
  while( ADCSRA & (1<<ADSC)){
    /* do nothing */;
  }  
  res = ADCH > 70;
  ADCSRA = 0;
  return res;
}

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?
Autor: aaa (Gast)
Datum:

> 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.
Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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?
Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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.
Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

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.
Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Karl Heinz Buchegger schrieb:
> ast du kontrolliert, wie gut dir die 1.1V garantiert werden?

Diese Information habe ich nirgends finden können.
Autor: Bernd (Gast)
Datum:

Wer lesen kann, ist im Vorteil:

"Nirgends"
ist im Datenblatt ATTiny261/461/861 Kapitel 19.5 (S. 190)

1,0 ... 1,2 V.
Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

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




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net