Opdatering 15. oktober 2016:
BMS main print erstattet af : http://ev-power.com.au/webstore/ev-power-bms/mcu-micro-08a.html
Denne BMS har open source kode, et basic program. Hardware er dog ikke open source, men meget let at efterligne hvis man vil. Eller måske omskrive så koden kører på en arduino istedet.

Sådan virker BMS MCU-MICRO-08B fra ev-power-com.eu
BMS MCU har to lysdioder.
Den grønne lysdiode indikerer at der er strøm på, og at BMS holder øje med batteri sløjfen. BMS MCU tændes med en kortslutning af connectoren ‘switch’. Den tilsluttes i denne elbil til DC-DC konverter 12 volt ud, så BMS kører ved ladning og når tændingsnøgle drejes på on.
Den røde lysdiode indikerer en afbrydelse / pause i NC strømsløjfen (ev-powers onewire strøm sløjfe). Lyser den røde lysdiode, er der et problem med en battericelle.
BMS MCU udfører en række funktioner:
- BMS MCU aktiverer relæet, når ‘switch’ er tændt, og onewire strøm løkken mellem cellerne indikerer alt er OK. Dvs. dette relæ skal styre ‘cutback’ til curtis 1238 motor kontrolleren og ‘shutdown’ til zivan ng3 laderen.
- BMS MCU overvåger at der går strøm gennem onewire strøm løkken mellen battericelle modulerne, her cm100. Hvis en celle går under 2,5 V eller over 4.0V blinker den røde lysdiode, fortsætter det i mere end end 10 sekunder vil relæet åbne = ladning stoppes. Lyser den røde lysdiode konstant, er der en permanent fejl.
- Hvis relæet er åbent, og der er konstant lys i den røde lysdiode, kanBMS MCU nulstilles ved at slukke og tænde det igen. Dette vil få relæet til at lukke i en kort periode og tillade at prøve at genoplade hvis cellerne er på en lav spænding.
Open Source basic program til BMS MCU i picaxe basic fra ev-power
'*****************************************************************************************************************************
#PICAXE 08M2
'
' BMS-BCU-MICRO-08 - BATTERY CONTROL UNIT FOR EV POWER BMS CELL MODULES
'
' This simple unit monitors cell module input. If error for 10 seconds
' disconnection occurs.
'
' FOR USE WITH THREE WIRE LATCHING RELAYS
'
' 2.1 - added latching variable, same code for MICRO-A and B
' added code to switch off relay when powered ON with enable ON
' 2.2 - 20-11-12 - added code for 11V - 16V switch range 11V = 104, 16V = 151
' 2.3 - 11-1-13 - removed 11-16V switching range, needs more thought
'
'
'*****************************************************************************************************************************
'
symbol latchingvalue = 1 ' set latching = 1 for MICRO-A and latching = 0 for MICRO-B
'symbol hysterisis = 5 ' hysterisis value for offvoltage
' PICAXE pin assignments
symbol alarmpin = 0
symbol contactoroff = 1
symbol contactoron = 2
symbol cellmodules = pin3
symbol switchinput = 4
' Define constants
'symbol offvoltage = 104 '<20 = switchoff
symbol offvoltage = 20 '<20 = switchoff
symbol overvoltage = 255
' Define variables
symbol voltage = b0
symbol acount = b1
symbol latching = b2
symbol errorflag = b3
symbol lastsecond = w2
'symbol offplushysterisis = b6
'***************************************************************************************************************************
' MAIN PROGRAM
start0:
latching = latchingvalue ' set latching = 1 for MICRO-A and latching = 0 for MICRO-B
'offplushysterisis = offvoltage + hysterisis
suspend 1
gosub relayoff
errorflag = 0
'low contactoroff ' set output so not in indeterminate state
'low contactoron
initialise:
readadc switchinput, voltage ' stay switched off if unit is powered up with switch on
'debug voltage
pause 100
if voltage => offvoltage then : goto initialise endif
gosub sleepsomemore
main:
if cellmodules = 0 then
for acount = 1 to 15 ' 15 seconds from warning to shutdown
pause 500
gosub flasher
errorflag = 1
readadc switchinput, voltage
if voltage < offvoltage then : gosub sleepsomemore : endif
if cellmodules <> 0 then
errorflag = 0
goto modulesok
endif
next acount
gosub closedown
endif
modulesok:
readadc switchinput, voltage
pause 100
'debug voltage
if voltage < offvoltage then : gosub sleepsomemore : endif
goto main
end
'subroutines
'*******************************************************************************************************************************
' CLOSE DOWN if voltage or cell modules are out of range, only re-enable if switch is off/on again
closedown:
if voltage< offvoltage or voltage > overvoltage then
low alarmpin
else
high alarmpin
endif
gosub relayoff
errorflag = 2
stayclosed:
readadc switchinput, voltage
pause 100
if voltage => offvoltage then : goto stayclosed : endif
gosub sleepsomemore
goto main
return
'******************************************************************************************************************************
' SLEEP if switch is off
sleepsomemore:
gosub relayoff
low alarmpin
errorflag = 0
stayoff:
readadc switchinput, voltage
pause 100
if voltage < offvoltage then : goto stayoff : endif
gosub relayon
goto main
return
'******************************************************************************************************************************
' FLASH the alarmpin
flasher:
high alarmpin
pause 500
low alarmpin
return
'******************************************************************************************************************************
' RELAY ON pulse for latching relay
relayon:
if latching = 0 then
high contactoroff
high contactoron
else
low contactoroff
high contactoron
pause 100
low contactoron
endif
pause 1000
return
'******************************************************************************************************************************
' RELAY OFF pulse for latching relay
relayoff:
if latching = 0 then
low contactoroff
low contactoron
else
low contactoron
high contactoroff
pause 100
low contactoroff
endif
pause 1000
return
'*******************************************************************************************************************************
' PARALLEL PROGRAM TO OUTPUT TERMINAL INFORMATION
start1:
pause 200
main1:
waitasecond:
if time = lastsecond then
goto waitasecond
else
lastsecond = time
endif
if voltage < offvoltage then
sertxd ("STA=OFF")
else
sertxd ("STA=ON")
endif
sertxd (" ERR=",#errorflag,cr,lf)
if time = 60 then : time = 0 : endif
goto main1
end
interrupt:return
You must be logged in to post a comment.