Forum: Mikrocontroller und Digitale Elektronik Batterieanzeige


von Hassa M. (Firma: Verge. GmbH) (sibb)


Lesenswert?

Hallo liebe Forumuser

Unzwar haben wir in der Uni die aufgabe bekommen eine Batterieanzeige zu 
programmieren in Assembler.

Sie soll wie folgt funktionieren.

Betriebsspannung : 5V

LED Grün soll von 100% bis 20% der Kapazität Leuchten
LED Grün soll ausgehen wenn die Kapazität unter 20% Fällt, dann soll die 
Rote LED leuchten bis der AKKU Komplett leer ist.


Verwendeter Mikrokontroller:
TI MSP430 Lauchpad


Als kleine Unterstützung haben wir folgenden Code bekommen:
1
RESET           mov.w   #0400h,SP     ; Initialize stackpointer
2
StopWDT         mov.w   #WDTPW|WDTHOLD,&WDTCTL  ; Stop watchdog timer
3
                bis.b  #00000001b,&P1DIR
4
nochmal         xor.b  #00000001b,&P1OUT
5
                mov.w  #50000,R15
6
;-------------------------------------------------------------------------------
7
L1              dec.w  R15               ; Main loop here
8
                jnz  L1
9
                jmp  nochmal
10
;-------------------------------------------------------------------------------
11
;           Stack Pointer definition
12
;-------------------------------------------------------------------------------
13
                .global __STACK_END
14
                .sect   .stack

Vielen Dank im vorraus.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Hassa Massa schrieb:
> Vielen Dank im vorraus.

für was? Wo ist denn eine Frage?

von MaWin (Gast)


Lesenswert?

Ja, und ? Solche Aufgaben bekommen Studenten und Lehrlinge
zu tausenden und lösen sie.
Wo ist das Problem ? Es ist die einfachste Aufgabe, die
Batteriespannung per A/D-Wandler zu erfassen und an einem
Grenzwert einen Ausgang umzuschalten.
So spotteinfach, daß man dafür nicht mal einen uC benötigt,
der die ungefähr 1 millionenfache Rechenleistung hätte,
sondern es schon ein TL431 tut.

Interessanter ist die Frage, ob man 20% Restkapazität
wirklich an einer Spannungsgrenze festmachen kann ohne
den Strom zu messen, und ob man nicht hineinfliessenden
und herausfliessenden Strom über die Zeit erfassen und
als fuel gauge mit einer angenommenen und regelmässig
rekalibrierten Akkukapatiät querrechnet.

Vermutlich gibt es genau für solche Gedanken Zusatzpunkte,
und wenn die Lösung mit minimalen Resourcen auskommen,
beispielsweise nur einem Eingang und einem Ausgang am uC,
ebenfalls.

Aber so wird dir keiner hier deine Hausaufgagbenpunkte besorgen.

von Dirk K. (dekoepi)


Lesenswert?

Da musste ich jetzt auch ein wenig schmunzeln - "löst mal unsere 
Aufgabe, wir wollen nichts lernen"?

Ich vermesse gerne Akkus, für bestimmte Akku-Typen kann man in der Tat 
aus der Spannung einen Füllstand ableiten. Hier ein paar Kennlinien, 
damit ihr eine Idee bekommt: 
http://de.scribd.com/doc/92062987/2012-04-Akkutest-01-2012 . Viele 
Akkuträger arbeiten (leider) so, wobei das eher individuell für jedes 
Akku-Fabrikat ist. Am einfachsten kann man es sich machen, wenn man als 
Akkutyp einen Panasonic (oder neuerdings Sony 18650NC1) als Referenz 
hernimmt - die haben einen fast schnurgraden Entladeverlauf.

Auf einem ATmega328p ist das Ganze eine Fingerübung. Hier mal in 
nicht-Assembler, könnt ihr ja von Hand umstricken ;)
1
long readVcc() {
2
  power_adc_enable();
3
  cli();
4
  uint32_t result=0;
5
  uint32_t temp=0;
6
  // Read 1.1V reference against AVcc
7
  ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADEN);  // enable ADC, Prescaler 128 -> 125kHz
8
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
9
  for (int i=0; i<32000; i++) {  // Interrupts are switched off, wait 2ms for Vref to settle
10
    asm volatile("nop");
11
  }
12
  for (int i=0; i<64; i++) {  // oversampling - 64 samples
13
    ADCSRA |= _BV(ADSC); // Convert
14
    while (bit_is_set(ADCSRA,ADSC));  // proper: while (ADCSRA & ADSC)
15
    result = ADCL | (ADCH<<8);
16
    temp += (result);
17
  }
18
  ADCSRA &= ~(1<<ADEN);  // disable ADC
19
  result= (1230000L<<2) / (temp>>4);  // Oversampling-reduction; calculate mV
20
  sei();
21
  return result;
22
}

Als Streber-Dreingabe ist da gleich das Konzept des Oversamplings drin. 
Leider zuwenig Rauschen im System beim ATmega328, bekomme keine wirklich 
bessere Auflösung dadurch.

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Dirk K. schrieb:
> Auf einem ATmega328p ist das Ganze eine Fingerübung. Hier mal in
> nicht-Assembler
Zu blöd für den TO, dass er es in ASM und für einen anderen µC machen 
muss.

von Dirk K. (dekoepi)


Lesenswert?

Ich will ja nicht seine Hausaufgabe machen, sondern nur einen 
Codeschnippsel liefern, der die Grundidee verdeutlicht g

von Max H. (hartl192)


Lesenswert?

Dirk K. schrieb:
> Ich will ja nicht seine Hausaufgabe machen
Das habe ich mir schon gedacht und deshalb das "für den TO" hinzugefügt.

von Ein Elektroniker (Gast)


Lesenswert?

Hassa Massa schrieb:

> Unzwar haben wir in der Uni die aufgabe bekommen eine Batterieanzeige zu
> programmieren in Assembler.

Habt Ihr auch gelernt, einen Programmablaufplan zu machen, das nennt 
sich auch Flowchart, oder ein Struktogramm? Das hilft oft ungemein. Man 
kann ihn erst grob erstellen, wie in der Aufgabenstellung formuliert, 
und auch noch detaillieren, wie es halt am besten paßt.

Ich kenne den µC und dessen Assemblersprache nicht, aber in der Regel 
ist das easy. Dafür gibt es im Assembler bedingte Sprungbefehle. Je nach 
Wert überspringt man den einen oder den anderen Verarbeitungsblock.

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.