LiPo/LiFePo Monitor mit PIC16F1705

Hallo,

im Anhang ist ein LiPo/LiFePo Monitor und Unterspannungsalarm realisiert mit einem PIC16F1705. Die Schaltung verwende ich so im Prinzip auch für meinen selbstbau FrSky Telemetrie Hub.

Mit einer leichten Änderung kann man den Monitor auch ohne Telemetrie in einem Elektrosegler verwenden. Mit einem externen selbstbau LCD-Display kann ich die Zellspannungen anzeigen. Das LCD-Display ist ein 2x8 LCD vom Pollin für 1 Euro. Leider gibt es die Display's nicht mehr. Es geht aber jedes HD44780 kompatible STN Display.

Gruss Micha

LIXX_4S.jpg
 

Anhänge

  • LIXX-Monitor.pdf
    113 KB · Aufrufe: 223
Update LiPo/LiFePo Monitor

Update LiPo/LiFePo Monitor

In dem LIXX Programm hab ich noch einen Überlauf der cell_voltage_2, cell_voltage_3 und cell_voltage_4 abgefangen.
Falls ein der Zellen auf 0 Volt fällt, würde die Spannungsberechnung negativ, also ein Overflow. Das Ergebnis wäre eine Spannung
größer als 4.4 Volt. Das Problem wird jetzt im Program abgefangen. Die Spannung der Zelle wird auf 0 Volt gesetzt. Somit schlägt der Unterspannungsschutz auch zu.

'if cell2, cell3 or cell4 is zero (0 Volt), cell voltage calc. could overflow
if (cell_voltage_2 >= VOLT_4P4) then cell_voltage_2 = 0
if (cell_voltage_3 >= VOLT_4P4) then cell_voltage_3 = 0
if (cell_voltage_4 >= VOLT_4P4) then cell_voltage_4 = 0

Der PIC16F1705 besitz einen Hardware UART (EUSART). Die Kommunikation zum LCD Display kann auch über den EUSART
erfolgen. Zudem kann man über das Peripheral Pin Select (PPS) die TX Funktion vom EUSART auf einen beliebigen Digital Output legen.
Das uart(in dout as byte) Unterprogramm in der UART Library muss dazu durch HSerSend(in dout as byte) ersetzt werden.

sub LCD_Clear ' Clear Display
HSerSend(254)​
HSerSend(1)​
wait 2 ms​
end sub 'LCD_Clear

Im LIXX Programm müssen dazu die Serial settings wie folgt geändert werden:

'Serial settings
'Module: EUSART
RC3PPS = 0x0014 'TX > PORTC.3

#define SER_OUT PORTC.3
dir SER_OUT out

'USART settings
#define USART_BAUD_RATE 2400
#define USART_BLOCKING
#define USART_TX_BLOCKING

'Enable HSerSend
comport = 1 'send through USART1


Gruss Micha
 

Anhänge

  • LIXX-Monitor_V2.pdf
    113,3 KB · Aufrufe: 269
Kleiner LiPo Unterspannungs-Monitor

Kleiner LiPo Unterspannungs-Monitor

Hallo,

hier ist der kleine Bruder vom LIXX-Monitor. Er überwacht die Gesamtspannung eines 3S-LiPo.
Die Schaltung besteht aus dem Spannungsteiler für 3S (siehe LIXX-Monitor) und einem alten PIC12F675. Von einer alten Platine
hab ich einen 5-Volt SMD Spannungsregler 78M05 sowie SMD-Tantal Kondensatoren zur Filterung verwendet. Mit einem SMD PIC,
z.B. dem PIC 12F1571-I/SN für 0,79€ vom Reichelt würde er noch kleiner bauen.

Gruss Micha

LiPo_3S.jpg

Code:
'  LiPo Monitor 3 Zellen  V2
'  05.06.2017, IDE v97.01, programmed with G540
'                    -----------
'  V+              -| 1       8 |- GND
'  GP5 ALERT       -| 2       7 |- GP0 ACCU 3S
'                  -| 3       6 |-
'                  -| 4       5 |-
'                    -----------


'Chip model
#chip 12F675,4
#config OSC = INTRC_OSC_NOCLKOUT

#define ACCU AN0
#define VOLT_10P8  182  'FS 15 Volt = 256, -2 offset correction

#define ALERT GPIO.5
dir ALERT out

' ADC AN0 init
' Gain AN0 = 1/3, 10K/(10K+20K)
TRISIO.0 = 1         ;Set GP0 to input
ANSEL = b'01010010'  ;FOSC/16, AN0 as analog input
ADCON0 = b'00000001  ;Left justify, Vdd = Vref, ADC enabled
;AN0 selected
ADCON0.CHS0 = 0
ADCON0.CHS1 = 0


dim accu_voltage,accu_voltage_old as byte
dim ALERT_COND,alert_counter,counter as byte

ALERT_COND = 0
alert_counter = 0
counter = 0
accu_voltage = 0
accu_voltage_old = 0

'Power Up Test
set ALERT on
wait 1 s
set ALERT off
wait 1 s

'------------------------------- Main -----------------------------------------
Do
  accu_voltage = Average(GET_ADC,GET_ADC)

  accu_voltage = Average(accu_voltage,accu_voltage_old)

  accu_voltage_old = accu_voltage

  ALERT_COND = (accu_voltage <= VOLT_10P8)

  if ALERT_COND then
     alert_counter++
     if (alert_counter >= 5) then
        alert_counter = 5
        counter++
        if (counter <= 2) then set ALERT on
        if (counter > 2) then set ALERT off
        if (counter >= 4) then counter = 0
      end if
  else
     set ALERT off
     alert_counter = 0
     counter = 0
  end if

  wait 500 ms
Loop
'-------------------------------- end main ------------------------------------
'--------------------------------- funcs --------------------------------------
function GET_ADC as byte
    dim A_Delay as byte

    ;Acquisiton delay
    A_Delay = 4 '22 us delay
	  LABEL_INC:
	  A_Delay--
	  if (A_Delay <> 0) then goto LABEL_INC
    ;end Acquisiton delay
	  ADCON0.GO = 1 ;Start conversion
	  LABEL_ADCONV:
	  if (ADCON0.GO = 1) then goto LABEL_ADCONV  ;Is conversion done? No, test again
    GET_ADC = ADRESH ;Read 8 bit ADC value
end function
 
Ansicht hell / dunkel umschalten
Oben Unten