ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická Katedra počítačů
Emulátor plné chytré baterie Bakalářská práce
ROK: 2012
STUDENT:
Lukáš Vydržel
VEDOUCÍ PRÁCE:
Ing. Tomáš Vondra
Abstrakt Tématem této bakalářské práce je komunikační protokol Smart Battery System. Obsáhlý protokol je primárně určený pro bateriové aplikace k normalizaci komunikace mezi jednotlivými prvky. Těchto prvků může být na sběrnici celá škála. Má práce je pouze zaměřena na komunikaci laptopů s chytrou baterií. Navazuje na Softwarově výzkumný projekt, jehož úkolem bylo tuto komunikaci odhalit na reálném zařízení. Dále ji odchytit a analyzováním srovnat, zda odpovídá normě Smart Battery System. Dalším cílem mé práce je navrhnout a sestavit zařízení neboli emulátor takové chytré baterie, který dokáže chytrou baterii po komunikační stránce plně nahradit. Pro uživatele vznikne možnost využití i nestandardních baterií-akumulátorů pro napájení laptopů. I když se pro připojený laptop bude emulátor jevit jako plně nabitá baterie, tak díky implementovanému rozhraní neztratíme možnost kontrolovat základní hodnoty využívaného akumulátoru. Řešení podobného problému jiným autorem se mi dosud nepodařilo objevit, proto by má práce mohla být velkým přínosem.
Abstract The main topic of my work is a communication protocol Smart Battery System. Extensive protocol is primarily designed for applications with baterries. This protocol normalize communication between many elements connected on the bus. My work is oriented on communication between laptops and smart batteries. Work builds on Software research project whose task was to capture and analyze communications between laptop and smart battery. And compare it that conforms to the standard Smart Battery Systems. Next issue of my work is design and build a device such smart battery. Device must can fully replace communication of smart battery. The users can use non-standard batteries in power laptops. Users also can control base values of batteries, because device have embedded controlling interface. I don´t find solutions to similar problem by another author, so my work can be of great benefit.
II
Prohlášení Tímto prohlašuji, že jsem bakalářskou práci s názvem Emulátor plné chytré baterie napsal samostatně s přispěním vedoucího práce a s použitím pramenů uvedených v přiloženém seznamu. Dále prohlašuji, že nemám důvod proti zveřejňování, půjčování a k dalšímu využití práce dle §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Praze dne..........................................
podpis..........................................
III
Poděkování Tímto bych chtěl poděkovat vedoucímu práce Ing. Tomášovi Vondrovi, za poskytnutí velkého množství informací a nástrojů k dané problematice Smart Battery System protokolu, poskytnutí vlastního laptopu k testování a zajištění pracovního prostoru a zařízení ve školních prostorech laboratoří.
IV
Obsah ABSTRAKT.......................................................................................................................................... II PROHLÁŠENÍ..................................................................................................................................... III PODĚKOVÁNÍ ................................................................................................................................... IV OBSAH................................................................................................................................................... V KAPITOLA 1: ÚVOD ................................................................................................................... - 1 1.1 KLASICKÉ BATERIE ...............................................................................................................................- 1 1.2 CHYTRÁ BATERIE ..................................................................................................................................- 2 1.3 KOMPROMIS - MŮJ CÍL ..........................................................................................................................- 2 KAPITOLA 2: SMART BATTERY SYSTEM ........................................................................... - 3 2.1.1 Přehled ...................................................................................................................................... - 3 2.1.2 Použití v laptopech ............................................................................................................... - 4 2.1.3 Formát datových rámců ...................................................................................................... - 5 2.1.4 Detailní popis funkcí ............................................................................................................ - 8 2.2 KOMUNIKAČNÍ PROTOKOL I2C ......................................................................................................... - 13 KAPITOLA 3: ANALÝZA ......................................................................................................... - 15 3.1 HW PROSTŘEDKY ANALÝZY ............................................................................................................. - 15 3.1.1 Laptop ......................................................................................................................................- 15 3.1.2 Digitální osciloskop ............................................................................................................- 15 3.1.3 Laboratorní logický analyzátor ......................................................................................- 16 3.2 SW PROSTŘEDKY ANALÝZY .............................................................................................................. - 16 3.2.1 Vývojové prostředí NetBeans 7.0 ..................................................................................- 16 3.2.2 Logický analyzátor přes paralelní port .......................................................................- 17 3.3 PŘÍPRAVA K ANALÝZE ....................................................................................................................... - 17 3.3.1 Analyzovaná baterie ...........................................................................................................- 17 3.3.2 Program pro dekódování I2C komunikace speciálně pro SBS............................- 17 3.4 SKENOVÁNÍ PRŮBĚHU KOMUNIKACE ............................................................................................... - 18 3.4.1 Použití digitálního osciloskopu ......................................................................................- 18 V
Obsah
3.4.2 Použití logického analyzátoru přes paralelní port .................................................- 19 3.4.3 Použití stolního logického analyzátoru ......................................................................- 19 3.5 VÝSLEDKY ANALÝZY KOMUNIKACE .................................................................................................. - 20 3.5.1 Dekódování získané komunikace na I2C.....................................................................- 20 3.5.2 Analýza dekódované komunikace ................................................................................- 21 KAPITOLA 4: NÁVRH ............................................................................................................. - 22 4.1 VÝBĚR SOUČÁSTEK ............................................................................................................................ - 22 4.1.1 Mikroprocesor ......................................................................................................................- 22 4.1.2 Periferní součástky mikroprocesoru ...........................................................................- 23 4.1.3 Měření napětí ........................................................................................................................- 23 4.1.4 Měření proudu ......................................................................................................................- 24 4.1.5 Napájecí zdroj .......................................................................................................................- 24 4.1.6 Rozhraní RS232 ...................................................................................................................- 25 4.1.7 Ostatní součástky ................................................................................................................- 26 4.2 ELEKTRONICKÉ SCHÉMA A DPS ....................................................................................................... - 26 4.2.1 Výsledné schéma zapojení ...............................................................................................- 26 4.2.2 Návrh DPS ..............................................................................................................................- 27 KAPITOLA 5: REALIZACE ..................................................................................................... - 28 5.1 SESTAVENÍ ELEKTRONICKÉHO OBVODU NA NKP ........................................................................... - 28 5.2 PROGRAMOVÁNÍ ................................................................................................................................ - 28 5.2.1 Vývojové prostředí a programátor ...............................................................................- 28 5.2.2 Tvorba programu ................................................................................................................- 29 5.3 SESTAVENÍ ELEKTRONICKÉ OBVODU NA DPS................................................................................. - 31 5.3.1 Tvorba DPS ............................................................................................................................- 31 5.3.2 Osazení DPS ...........................................................................................................................- 31 KAPITOLA 6: TESTOVÁNÍ .................................................................................................... - 32 6.1 TESTOVÁNÍ PROGRAMU ..................................................................................................................... - 32 6.1.1 Pokrytí funkcí........................................................................................................................- 32 6.1.2 Zpracování funkcí na obou stranách ............................................................................- 32 6.2 TESTOVÁNÍ HW ................................................................................................................................ - 33 6.2.1 Napájení ..................................................................................................................................- 33 VI
Obsah
6.2.2 Funkce měření napětí ........................................................................................................- 33 6.2.3 Funkce měření proudu ......................................................................................................- 33 6.2.4 Funkce nabíjení z laptopu ................................................................................................- 34 6.2.5 Signalizace ..............................................................................................................................- 35 6.3 TESTOVÁNÍ NA JINÉM LAPTOPU........................................................................................................ - 35 6.3.1 Parametry laptopu a baterie ...........................................................................................- 35 6.3.2 Průběh a zhodnocení testování......................................................................................- 36 KAPITOLA 7: ZÁVĚR .............................................................................................................. - 37 SEZNAM SYMBOLŮ A ZKRATEK ........................................................................................... - 38 POUŽITÁ LITERATURA A SOFTWARE................................................................................ - 39 SEZNAM OBRÁZKŮ ................................................................................................................... - 42 SEZNAM TABULEK .................................................................................................................... - 44 PŘÍLOHY ............................................................................................................................................... I
VII
KAPITOLA 1: Úvod 1.1 Klasické baterie Rozebráním klasického bateriového packu zjistím, že se skládá z jednoho nebo více článků a jehož výstupem jsou pouze vývody z článků nebo jejich sériové či paralelní spojení. Podle chemického složení článků nám vznikají různé nároky na jejich používání a s nimi i různé výhody a nevýhody. Nejméně náročné na použití jsou olovněné akumulátory. K jejich nabíjení postačuje podle [7] pouze stabilizovaný zdroj s konstantní hodnotou napětí 13,65 V (pro 6článkový akumulátor), která by neměla být překročena, aby nedocházelo k přebíjení akumulátorů. Dále lze říci, že těmto akumulátorům škodí, pokud se delší dobu nachází ve vybitém stavu. Velkou nevýhodou je jejich poměr velikosti ku kapacitě, díky tomu je nemůžeme využívat v miniaturních aplikacích. Velmi podobně jsou na tom akumulátory z nikl-kadmiových článků (NiCd). Jejich výhodou jsou podle [8] mnohem menší rozměry při stejné kapacitě. Dříve se hojně využívaly pro mobilní telefony, ale díky prokázané toxicitě se od nich upustilo. Jejich další nevýhodou je paměťový efekt při nabíjení v neúplně vybitém stavu. Další odnoží tzv. niklových článků je nikl-metal-hybridní článek (NiMH). Podle [8] u těchto článků dosahujeme až o 40 % vyšší kapacity oproti NiCd článkům a nižším počtem výskytů paměťového efektu, díky chemickému složení nejsou ani toxické. Z těchto důvodů z velké části nahradily NiCd články. Další výhodou obou těchto niklových článků je možnost rychlého nabíjení, naopak nevýhodou tzv. samovybíjení. Musí být tedy využívány v aplikacích, kde jsou stále v nabíjecím nebo vybíjecím cyklu. Co se týče laptopů a mobilů, v současné době jsou z velké části obsazeny bateriemi z lithium-iontových článků. Podle [8] poměr kapacity ku rozměrům je zhruba stejný jako u niklových baterií, ale provozní napětí článku je až 3,8 V na rozdíl od niklových článků, které mají 1,2 V, dosahujeme i menšího samovybíjení. Velká výhoda je úplné potlačení paměťového efektu.
-1-
KAPITOLA 1:Úvod
Využíváme-li baterii složenou z některých výše uvedených druhů článků v aplikacích, kde se vyžaduje její opětovné používání díky možnosti přímého nabíjení v aplikaci, je nutné hlídání například nabíjecího proudu, aktuálního napětí a teploty, přímo aplikací. Tím se celá aplikace stává složitější a vyžaduje více prvků než by pouze pro její funkci bylo nutné, a proto se často přechází k tzv. chytrým bateriím.
1.2 Chytrá baterie Aby bylo využívání baterií v různých aplikacích jednodušší, využívají se chytré baterie, které kromě vlastních bateriových článků obsahují i elektronický obvod. Obvod obstarává celý dohled nad jednotlivými články a veškeré informace na žádost dodávají po dvoudrátové sběrnici I2C aplikacím, které baterii využívají. Baterie si tak sama může určovat, kdy se bude nabíjet, do jakého napětí a jakým proudem, pokud to aplikace umožňuje. Sama si i hlídá hranici nejnižší použitelné kapacity a předává výstrahu aplikaci. Díky této funkci můžeme předejít zničení baterie. Podobných funkcí je celá škála. Aby jejich využívání bylo univerzální nezávisle na výrobci, jsou funkce normalizované na základě Smart Battery System protokolu.
1.3 Kompromis - můj cíl Nyní se zaměřím na nejčastější využití chytrých baterií. Tou je integrace chytrých baterií v laptopech. Díky řídící elektronice uvnitř těchto baterií, odpadá spousta požadavků na hardware laptopu, bohužel ze strany uživatele vidím spíše nevýhody. Kapacity jsou typově dané výrobcem a většinou i chemické složení článků. Ne vždy je baterie ideální pro dané využívání laptopu. Můžeme například požadovat velkou výdrž baterie a přitom nám nezáleží na velikosti, čehož bychom dosáhli například změnou typu článků nebo jejich navýšení. Bohužel výrobci chytrých baterií nejsou flexibilní k našim požadavkům. Můj cíl je sjednotit pro nás zajímavé výhody jednotlivých akumulátorů a přitom využít výhod chytrých baterií. K docílení by mělo stačit navrhnutí a sestavení univerzálního elektrického obvodu nahrazujícího řídící elektroniku v chytrých bateriích a použití článků dle vlastní potřeby.
-2-
KAPITOLA 2: Smart Battery System 2.1.1 Přehled Jedná se o specifikaci komunikačního rozhraní, které probíhá po dvouvodičové sběrnici založeného na I2C jejíž detailnější popis naleznete v podkapitole 2.2 Komunikační protokol I2C. Rozhraní umožňuje například získání a odesílání dat mezi dvěma zařízeními s podporou SBS připojených na sběrnici. Formát výměny dat mezi těmito zařízeními je přesně stanoven SBS specifikací, detailnější popis naleznete v podkapitole 2.1.3 Formát datových rámců. V praxi je nejčastěji SBS využíván pro laptopy. Právě pro komunikaci baterie s operačním systémem a systémem BIOS ke zjištění aktuálního stavu kapacity baterie, například pro optimalizace úspory energie či nabíjení. Existují i „chytré“ nabíječky, které s bateriemi komunikují pře SBS a tím řídí a optimalizují nabíjecí proces. V současnosti se na trhu vyskytují dvě verze SBS a to verze 1.0 a 1.1. Já se budu zajímat pouze o verzi 1.0. Pro informaci mohu uvést hlavní rozdíl mezi oběma verzemi. Tou je, že novější specifikace používá kontrolní součet „PEC“ každého rámce.
-3-
KAPITOLA 2:Smart Battery System
2.1.2 Použití v laptopech
Obrázek 2-1: Blokové schéma SBS
Běžné zapojení používající se v laptopech můžeme vidět na Obrázek 2-1: Blokové schéma SBS převzatého z [1]. Popis jednotlivých bloků: Smart Battery Charger – představuje nabíječku, která je připojena na Smart sběrnici a její funkce může být ovlivňována na základě SBS. System power control – představuje přepínač, který na základě připojení síťového adaptéru přepojuje do napájecí části laptopu napájení buď z adaptéru nebo baterie. System host – je část, která napájení využívá a přitom komunikuje po Smart sběrnici s ostatními částmi. Safety signal – jedná se o záchranný signál, pokud by komunikace po Smart sběrnici selhala a mohlo by dojít k poškození baterie, většinou se využívá k připojení termistoru pro hlídání kritické teploty akumulátoru
-4-
KAPITOLA 2:Smart Battery System
2.1.3 Formát datových rámců
Obrázek 2-2: Formát odeslání bytu
Obrázek 2-2: Formát odeslání bytu převzatý z [1] ukazuje sekvenci příkazů a dat při odeslání bytu po SMBus. Odeslání se provádí pouze na adresované slave zařízení, bez rozlišení druhu příkazu.
Obrázek 2-3: Formát odeslání slova
Obrázek 2-3: Formát odeslání slova převzatý z [1] ukazuje sekvenci příkazů a dat při odeslání 32bitového slova po SMBus. Odeslání se provádí na adresované slave zařízení, začínáme odesláním kódu příkazu a poté daty, nejdříve se posílá byte s nižší váhou a poté s vyšší.
Obrázek 2-4: Formát odeslání bloku dat
-5-
KAPITOLA 2:Smart Battery System
Obrázek 2-4: Formát odeslání bloku dat převzatý z [1] ukazuje sekvenci příkazů a dat při odeslání bloku bytů po SMBus. Odeslání se provádí na adresované slave zařízení, začínáme odesláním kódu příkazu a poté daty, nejdříve se odesílá počet bytů k odeslání, poté následuje jejich postupné odeslání.
Obrázek 2-5: Formát čtení bytu
Obrázek 2-5: Formát čtení bytu převzatý z [1] ukazuje sekvenci příkazů a dat při čtení bytu po SMBus. Čtení se provádí pouze z adresovaného slave zařízení, bez rozlišení druhu příkazu.
Obrázek 2-6: Formát čtení slova
Obrázek 2-6: Formát čtení slova převzatý z [1] ukazuje sekvenci příkazů a dat při čtení 32bitového slova po SMBus. Čtení se provádí z adresovaného slave zařízení, začínáme odesláním kódu příkazu, poté opět adresy slave zařízení s požadavkem na čtení a následuje čtení dat, nejdříve se čte byte s nižší váhou a poté s vyšší.
-6-
KAPITOLA 2:Smart Battery System
Obrázek 2-7: Formát čtení bloku dat
Obrázek 2-7: Formát čtení bloku dat převzatý z [1] ukazuje sekvenci příkazů a dat při čtení bloku bytů po SMBus. Čtení se provádí z adresovaného slave zařízení, začínáme odesláním kódu příkazu, poté opět adresy slave zařízení s požadavkem na čtení a následuje čtení dat, nejdříve se čte počet bytů ke čtení, poté následuje jejich postupné čtení.
Obrázek 2-8: Formát volání funkce
Obrázek 2-8: Formát volání funkce převzatý z [1] ukazuje sekvenci příkazů a dat při volání funkce po SMBus. Volání funkce se provádí na adresované slave zařízení, začínáme odesláním kódu příkazu, poté 32bitové slovo (nejdříve byte s nižší váhou a poté s vyšší), následuje opětovné odeslání adresy slave zařízení s požadavkem na čtení, dále už jen čteme 32bitové slovo (nejdříve byte s nižší váhou a poté s vyšší).
-7-
KAPITOLA 2:Smart Battery System
2.1.4 Detailní popis funkcí Kompletní seznam funkcí vyskytující se ve SBS podle [1] naleznete v Příloze A, Tabulka A-1: Kompletní seznam SBS funkcí. V této podkapitole se budu věnovat pouze funkcím, jejichž využití bylo zjištěno během analýzy, návrhu nebo testování. Veškeré informace o funkcích jsou převzaty z [1].
Název: (0x00) ManufacturerAccess() Popis: Není přesně určen, záleží na výrobci, jak funkci využije Typ: rámce: Čtení i zápis Vstup/Výstup: 16bit. slovo, jehož význam určí výrobce
Název: (0x03) BatteryMode() Popis: Slouží k manipulaci nastavení baterie Typ: rámce: Čtení i zápis Vstup/Výstup: 16bit. slovo, jehož význam po bitech určuje Tabulka 2-1: Popis bitů BatteryMode
Bit
Název
R/W Nastavení
0
Internal_charge_controller
R
0-podporován / 1-nepodporován
1
Primary_battery_support
R
0-podporována / 1-nepodporována
-
-
-
7
Condition_flag
R
0-baterie OK / 1-problém
8
Charge_controller_enabled
R/W
0-zakázán / 1-povolen
9
Primary_battery
R/W
0-sekundární role / 1-primární role
2-6
10-12 -
-
-
13
Alarm_mode
R/W
0-povolení alarmů / 1-zákaz
14
Charger_mode
R/W
0-odesílání napětí a proudu do SBCH / 1-zákaz
15
Capacity_mode
R/W
0-mA, mAh / 1-mW, mWh
Tabulka 2-1: Popis bitů BatteryMode
-8-
KAPITOLA 2:Smart Battery System
Název: (0x08) Temperature() Popis: Slouží k zjištění aktuální teploty baterie Typ: Čtení rámce: 16bit. slovo jako neznaménkový integer odpovídající 0 °K až 6 553.5 °K Výstup:
Název: (0x0a) Current() Popis: Slouží k zjištění aktuálního proudu na výstupech baterie Typ: Čtení rámce: 16bit. slovo jako znaménkový integer odpovídající -32.768 mA až 32.767 mA Výstup:
Název: (0x0b) AverageCurrent() Popis: Funkce vrátí průměrný proud za poslední minutu provozu Typ: Čtení rámce: 16bit. slovo jako znaménkový integer odpovídající -32.768 mA až 32.767 mA Výstup:
Název: (0x0c) MaxError() Popis: Funkce vrátí očekávanou maximální kladnou chybu pro zbývající hodnotu kapacity baterie získanou funkcí RelativeStateOfCharge() Typ: Čtení rámce: 16bit. slovo jako neznaménkový integer odpovídající 0 % až 100 % Výstup:
Název: (0x0d) RelativeStateOfCharge() Popis: Funkce vrátí předpokládanou procentuální hodnotu zbývající kapacity z hodnoty předané funkcí FullChargeCapacity() Typ: Čtení rámce: 16bit. slovo jako neznaménkový integer odpovídající 0 % až 100 % Výstup:
-9-
KAPITOLA 2:Smart Battery System
Název: (0x0f) RemainingCapacity() Popis: Funkce vrátí předpokládanou zbývající hodnotu kapacity baterie Typ: Čtení rámce: 16bit. slovo jako neznaménkový integer odpovídající 0 mAh (mWh) až 65535 mAh Výstup: (mWh) pro CAPACITY_MODE bit = 0 (1)
Název: (0x13) AverageTimeToFull() Popis: Funkce vrátí předpokládaný čas do úplného nabití baterie Typ: Čtení rámce: 16bit. slovo jako neznaménkový integer odpovídající 0 minut až 65535 minut Výstup:
Název: (0x14) ChargingCurrent() Popis: Funkce slouží k zapsání požadované hodnoty nabíjecího proudu pro baterii do Smart Battery Charger („chytrá nabíječka“) Typ: Zápis rámce: Vstup: 16bit. slovo jako neznaménkový integer odpovídající 0 mA až 65535 mA
Název: (0x16) BatteryStatus() Popis: Funkce slouží k zjištění aktuálního stavu baterie Typ: Čtení rámce: 16bit. slovo, jehož význam po bitech určuje Tabulka 2-2: Popis bitů Battery Status Výstup:
- 10 -
KAPITOLA 2:Smart Battery System
Bit
Název
Význam
0-3
Error Codes
Význam nalezneme v [1] – Appendix C. Error Codes
4
Fully Discharged
1 – baterie je vybitá, zastavte vybíjení
5
Fully Charged
1 - baterie je nabita, není nutné nabíjení
6
Discharging
1 – baterie je vybíjena
7
Initialized
1 – baterie je posledně konfigurovaná výrobcem
8
Remaining Time Alarm
1 – AverageTimeToEmpty() < RemainingTimeAlarm()
9
Remaining Capacity Alarm
1 – RemainingCapacity() < RemainingCapacityAlarm()
10
-
-
11
Terminate Discharge Alarm 1 – baterie je plně vybita, zastaveno vybíjení
12
Over Temp Alarm
1 – teplota baterie překročila limit
13
-
-
14
Terminate Charge Alarm
1 – nabíjení může být ukončeno
15
Over Charged Alarm
1 – baterie je plně nabita, zastaveno nabíjení
Tabulka 2-2: Popis bitů Battery Status
Název: (0x1b) ManufactureDate() Popis: Funkce vrátí datum výroby baterie Typ: Čtení rámce: 16bit. slovo, jehož význam po částech určuje Tabulka 2-3: Formát slova Manufacture Výstup: Date
Bity
Název hodnoty Přípustné hodnoty
0..4
Den
1 až 31 v závislosti na měsíci
5..8
Měsíc
1 až 12
9..15 Rok
0 až 127 (Rok-1980)
Tabulka 2-3: Formát slova Manufacture Date
- 11 -
KAPITOLA 2:Smart Battery System
Název: (0x21) DeviceName() Popis: Funkce vrátí název baterie Typ: Čtení rámce: Blok 8bit. hodnot reprezentující znaky podle ascii tabulky Výstup:
Název: (0x22) DeviceChemistry() Popis: Funkce vrátí chemické složení článků baterie Typ: Čtení rámce: Blok 8bit. hodnot reprezentující znaky podle ascii tabulky, jenž dohromady tvoří Výstup: zkrácené označení chemického složení dle Tabulka 2-4: Zkratky chemického složení
Zkratka Celý název PbAc
Lead Acid
LION
Lithium Ion
NiCd
Nickel Cadmium
NiMH
Nickel Metal Hydride
NiZn
Nickel Zinc
RAM
Rechargeable Alkaline-Manganese
ZnAr
Zinc Air
Lip
Lithium Polymer
Tabulka 2-4: Zkratky chemického složení
- 12 -
KAPITOLA 2:Smart Battery System
2.2 Komunikační protokol I2C V této části uvedu základní informace ohledně I²C komunikace. Veškeré technické informace obsažené v této podkapitole byly převzaty z [3] a [10]. I²C (Inter-Integrated Circuit) je dvouvodičová sériová sběrnice. Protokol I²C vyvinula firma Philips, ostatní výrobci elektronických součástek a obvodů ji však mohou využívat i bez licenčních poplatků od roku 2006. Nutná je pouze registrace adres pro slave zařízení, která je zároveň i zpoplatněná. Na sběrnici se připojená zařízení dělí na řídící – master, které generují hodinový signál SCL, zahajují a ukončují komunikaci. Další jsou řízené – slave, které jsou adresovány masterem. Protokol umožňuje propojení až 128 různých zařízení pouze pomocí dvou obousměrných vodičů. Jeden tvoří hodinový signál SCL (Synchronous Clock) a druhý datový kanál SDA (Synchronous Data). Z elektrického hlediska jsou oba komunikační kanály zapojeny jako otevřený kolektor. Maximální délka vodičů je dána jejich nejvyšší přípustnou kapacitou 400 pF. Každý vodič musí být připojen jedním pull-up rezistorem ke kladnému napětí, což zajistí vysokou úroveň v klidovém stavu. Při probíhajícím přenosu jsou na SDA vysílány jednotlivé datové bity, přičemž platí pravidlo, že logická úroveň na SDA se smí měnit pouze, je-li SCL v úrovni L. Toto pravidlo je porušeno ve dvou speciálních případech. A to při vysílání podmínek START a STOP, které se používají k zahájení komunikace a k ukončení přenosu. Sběrnice I2C se vyskytuje ve dvou verzích s různou maximální frekvencí. A to 100 kHz nebo 400 kHz, k nimž jsou přesně stanovené minimální doby setrvání SCL v úrovni L a H. Konstrukce sběrnice neumožňuje duplexní přenos, tedy v jednom okamžiku vysílá jen jedno zařízení připojené na sběrnici. Všechna zařízení musí mít přiřazenou individuální adresu o délce 7 nebo 10 bitů pro jejich adresaci. Během provozu sledují veškerou komunikaci na sběrnici a v případě, že narazí na shodu se svoji adresou, zareagují.
- 13 -
KAPITOLA 2:Smart Battery System
Obrázek 2-9: Přenos dat přes I2C
Dle Obrázek 2-9: Přenos dat přes I2C ze [3] je patrné, že každému přenosu předchází vyslání podmínky START. Potom je vysílána 7 bitová adresa příjemce a jeden bit R/W, který rozlišuje, jde-li o čtení nebo zápis do zařízení. Další bit se nazývá ACK a je vysílán s úrovní H, bit je určen k potvrzení přijímací stanice o připravenosti příjmu. Následně jsou přenášena data dle R/W, buď z master zařízení nebo slave zařízení. Každý byte je následován jedním bitem ACK. Na konci přenosu je vyslána podmínka STOP.
- 14 -
KAPITOLA 3: Analýza 3.1 HW prostředky analýzy 3.1.1 Laptop Aby bylo vůbec možné analyzovat skutečnou probíhající komunikaci po SMBus přímo využitou v laptopech, bylo nutné vzít fyzický laptop s chytrou baterií a provést analýzu přímo na něm. Jelikož jsem vlastníkem staršího a méně mnou využívaného laptopu, rozhodl jsem se právě pro něj. Za pomocí úkonů viz. podkapitola 3.3.1 Analyzovaná baterie byl i s baterií připraven k analýze. Parametry laptopu jsou uvedené v Tabulka 3-1: Technické parametry laptopu.
Výrobce
ACER
Model
Aspire 5100
HW
CPU:AMD Turion 64 X2 1.6GHz, RAM: 2GB
OS
Microsoft Vista – Home Premium SP2
Baterie
Li-ion, 11.1V, 4000mAh, model: GRAPE32
Tabulka 3-1: Technické parametry laptopu
3.1.2 Digitální osciloskop Před započetím samotné analýzy bylo jasné, že k jejímu startu bude užitečný osciloskop, nejlépe digitální. Radou vedoucího práce mi bylo doporučeno využít vybavení v HW-Labu na Karlově náměstí, budova E. Použil jsem digitální osciloskop [12] s parametry uvedenými v Tabulka 3-2: Technické parametry osciloskopu, jehož využití je popsáno v podkapitole 3.4.1Použití digitálního osciloskopu
Výrobce
AGILENT
Model
DSO6104A
Frekvenční rozsah
0 – 1 GHz
Počet kanálů
4
Konektivita
USB, I2C, CAN, LIN, SPI, HDTV
Tabulka 3-2: Technické parametry osciloskopu
- 15 -
KAPITOLA 3:Analýza
3.1.3 Laboratorní logický analyzátor Stejně jako digitální osciloskop, mi pro analýzu bylo doporučeno využít nějaký vhodný logický analyzátor umístěný také v HW-Labu na Karlově náměstí. Mým prvotním výběrem byl nalezený USB-Logický analyzátor, u kterého bohužel hned na začátku selhala instalace potřebného softwaru. Druhou volbou byl stolní logický analyzátor [11] s parametry uvedenými v Tabulka 3-3: Technické parametry logického analyzátoru. Na první pohled možná zbytečně složitý pro mé použití, ovšem díky obslužnému softwaru umožňující ukládání delších sekvencí skenovaného průběhu, je plně vyhovující. Použití je popsáno v podkapitole 3.4.3 Použití stolního logického analyzátoru.
Výrobce
AGILENT
Model
1681A
Frekvenční rozsah
0 – 800 MHz
Počet kanálů
136
Paměť
1 MB
Tabulka 3-3: Technické parametry logického analyzátoru
3.2 SW prostředky analýzy 3.2.1 Vývojové prostředí NetBeans 7.0 Vývojové prostředí kompatibilní s různými platformami operačních systému pro programování v jazyce JAVA, které je volně šířené pro nekomerční použití z webových stránek výrobce uvedeného v seznamu použitého softwaru. Program jsem využil při vývoji programu pro dekódování naskenované I2C komunikace speciálně ve formátu SBS. Více v podkapitole 3.3.2 Program pro dekódování I2C komunikace speciálně pro SBS.
- 16 -
KAPITOLA 3:Analýza
3.2.2 Logický analyzátor přes paralelní port TFLA-01, zřejmě nejjednodušší varianta k analýze komunikace mezi baterií a laptopem. Součástí je pouze jednoduchý pomocný elektronický obvod uvedený v [13] a obslužný program, který je volně ke stažení na stránkách autora Walle Bernhard [13]. Pro použití stačí pouze připojit sestavený pomocný obvod s připojenou analyzovanou linkou na paralelní port k určeným pinům. Maximální vzorkovací rychlost tohoto analyzátoru je odvozena od HW prostředků použitého počítače. Práci s tímto analyzátorem popisuje podkapitola 3.4.2 Použití logického analyzátoru přes paralelní port.
3.3 Příprava k analýze 3.3.1 Analyzovaná baterie Aby bylo možné provést analýzu na testovacím laptopu, bylo nutné vyvést z baterie tři vodiče připojené k zemi a ke komunikačnímu kanálu I2C, aniž by to ovlivnilo správnou funkci baterie. Příprava baterie pro analýzu byla z části inspirovaná článkem [9]. Baterie je v plastovém obalu rozděleném na dvě poloviny, jenž jsou spojeny pouhým zacvaknutí západek (viz. Příloha B, Obrázek B-1: Fotografie obalu baterie), proto její rozebrání není příliš složité. Po otevření obalu, se nám nabízí pohled na 6 článků baterie a desku s řídící elektronikou (viz. Příloha B, Obrázek B-2: Fotografie plné baterie). Podle popisků v místě konektoru ke spojení s laptopem (viz. Příloha B, Obrázek B-3: Fotografie konektoru baterie) je celkem jednoduché nalézt zemní vývod, datový i hodinový vodič pro I2C sběrnici. Jako vodiče jsem použil dvou-žílový stíněný kabel. Aby bylo možné baterii vrátit zpět do laptopu, bylo nutné vyvrtat otvor pro vyvedený kabel ve spodní části baterie (viz. Příloha B, Obrázek B-4: Fotografie připravené baterie). 3.3.2 Program pro dekódování I2C komunikace speciálně pro SBS Jelikož žádný použitý logický analyzátor a ani digitální osciloskop neumožňoval přehledně dekódovat delší sekvence I2C komunikace založené na formátu SBS, rozhodl jsem se napsat vlastní program v jazyku JAVA, jenž by měl jako vstupem textový výstup - 17 -
KAPITOLA 3:Analýza
z logického analyzátoru jednotlivých vzorků a jejich logických stavů(viz. Příloha B, Obrázek B-5: Ukázka naskenované komunikace z logického analyzátoru) a výstupem souvislý výpis na obrazovku jednotlivých bytů komunikace oddělených dekódovanými podmínkami jako jsou START, STOP, ACK, NACK (viz. Příloha B, Obrázek B-6: Ukázka dekódované komunikace)
3.4 Skenování průběhu komunikace 3.4.1 Použití digitálního osciloskopu Nutným počátečním krokem skenování průběhu komunikace, bylo ověření správného zvolení vývodů baterie ke komunikaci a tím i potvrzení probíhající komunikace po sběrnici. Zároveň díky osciloskopu mohu určit rychlost probíhající komunikace a informace využít při práci s logickým analyzátorem.
Obrázek 3-1: Průběh části komunikace
Na základě Obrázek 3-1: Průběh části komunikace jsem ověřil správné zvolení vývodů, jejich funkci. Doba trvání hodinového impulzu byla na sběrnice přibližně 5 µs. Nyní bylo nutné pokračovat s analýzou na logickém analyzátoru. Ovšem pokud by měl osciloskop zakoupenou licenci na dekódování I2C sběrnice mohl bych s analýzou pokračovat dál na něm.
- 18 -
KAPITOLA 3:Analýza
3.4.2 Použití logického analyzátoru přes paralelní port Po ověření, že na sběrnici opravdu komunikace I2C probíhá, zbývalo naskenovat delší úseky komunikace a dekódovat ji. Z těchto úseků bylo možné ověřit využití SBS protokolu. Dále hlubší analýzou zjištění využívaným funkcí SBS protokolu a hodnot, které baterie k daným funkcím vrací. Nejjednodušší variantou bylo použití softwarového analyzátoru, navíc měl výhodu, že díky funkci dekódování I2C, by bylo možné přehledně zobrazit jednotlivé byty bez dalších pomocných softwarů. Během skenování jsem narazil na chybně určené START a STOP podmínky nebo vůbec neurčené a tím byty neměly správnou délku a dekódovací proces selhal. Vzhledem k analýze na osciloskopu, kde byly podmínky START a STOP jednoznačně viditelné, bylo jasné, že vzorkovací frekvence na tomto logickém analyzátoru není dostatečná. Ideální vzorkovací frekvence dle [2] musí být alespoň dvakrát větší než vzorkovaná. Záhadou však zůstávalo, proč některé úseky nejsou správně vzorkované a jejich dekódování nebylo smysluplné. Po probrání situace s vedoucím práce jsme došli k závěru, že chybně vzorkované úseky vznikají nejspíš v době, kdy jádro operačního systému vyhovuje žádostem o přerušení od součástí s vyšší prioritou. Na základě těchto informací, nebylo použití tohoto logického analyzátoru vhodné. 3.4.3 Použití stolního logického analyzátoru Po všech zkušenost s předešlými přístroji jsem stále neměl v rukou delší sekvence správně naskenované a dekódované komunikace SBS. Nezbývalo nic jiného než použít na první podhled složitý a pro tento úkol nepříliš vyhovující mnoha vstupný stolní logický analyzátor. Jelikož se jednalo o moji první zkušenost s tímto typem logického analyzátoru a jeho obslužného softwaru, věnoval jsem delší přípravu studiu manuálu [11]. Softwarové prostředí analyzátoru obsahuje spoustu funkcí a široké spektrum možnosti nastavení samotné analýzy a volby vstupů. Tudíž nebylo úplně jednoduché proplést se nastavením. Úkolem bylo zvolit správné vstupy, na něž bude připojena SMBus a vzorkovací frekvenci, kterou jsem určil na základě podkapitoly 3.4.1 Použití digitálního osciloskopu za použití informací z [2]. Navíc - 19 -
KAPITOLA 3:Analýza
vzorkovací frekvence se musela zvolit opravdu minimální. Důvodem byla délka úseku, která se od této frekvence odvíjela. Úsek představoval nepřerušovanou sekvenci, kterou logický analyzátor vzorkoval. Po několika pokusech v nastavení jsem dosáhl potřebného. Po navolení všeho potřebného nebyla výsledná délka úseku příliš dlouhá, pouhé 2 vteřiny, nicméně k analýze postačovala. Rozhodl jsem se provést analýzu v několika různých situacích s více opakováním, abych pokryl co nejvíce funkcí, které si může baterie a laptop mezi sebou po SMBus posílat. Seznam těchto analyzovaných situací:
Odpojený zdroj o Sekvence během zapnutí o Sekvence během zapnutí se zpožděním o Sekvence při běhu o Sekvence ve chvíli připojení zdroje při běhu
Připojený zdroj o Sekvence během zapnutí o Sekvence během zapnutí se zpožděním o Sekvence při běhu o Sekvence ve chvíli odpojení zdroje při běhu
Přestože analyzátor disponoval velkou řadou funkcí, dekódování komunikace na I2C neumožňoval. Výsledkem skenování byly časového průběhy, jak v grafické podobě, tak i v textové (ukázka viz. Příloha B, Obrázek B-5: Ukázka naskenované komunikace z logického analyzátoru), které jsem pro dekódování použil, viz. podkapitola 3.5.1 Dekódování získané komunikace na I2C.
3.5 Výsledky analýzy komunikace 3.5.1 Dekódování získané komunikace na I2C Poté co jsem měl několik uložených průběhů komunikace v textové formě, bylo potřeba najít nástroj, který by z těchto souborů komunikace dekódoval na I2C, neboť ruční čtení těchto souborů by bylo časově velice náročné a neefektivní.
- 20 -
KAPITOLA 3:Analýza
Hledání nástroje k dekódování na webu by bylo zřejmě zbytečné. Rozhodně jsem chtěl využít svých teoretických a praktických zkušeností v programování v jazyku JAVA, získané během studia v předmětech zaměřených na programování v tomto jazyku. Textové soubory s průběhy komunikace obsahují číselné hodnoty úrovní 1 a 0 odřádkované dle vzorkovací frekvence. Cílem bylo napsání programu, který by tyto soubory po řádcích četl a ve spleti nul a jedniček hledal podmínky pro START, STOP, ACK a NACK dané I2C specifikací [3] [10] spolu s datovými byty a vše přehledně vypsal na výstup. Naprogramování nebylo složité a výsledný program spolehlivě všechny naskenované průběhy dekódoval na I2C komunikaci (ukázka viz. Příloha B, Obrázek B-6: Ukázka dekódované komunikace), kterou jsem dál analyzoval a porovnával dle SBS specifikace [1]. Program je bez grafického rozhraní a je možné ho spouštět přímo ve vývojovém prostředí NetBeans. Obsahuje hlavní spouštěcí zdrojový soubor Main.java (viz. Příloha B, Zdrojový kód programu pro dekódování I2C komunikace), který obsahuje veškerou logiku programu a dále pomocný zdrojový soubor DataByte.java (viz. Příloha B, Zdrojový kód programu pro dekódování I2C komunikace). 3.5.2 Analýza dekódované komunikace Shrnutím celé analýzy lze říct, že na sběrnici probíhá komunikace dle protokolu I2C pro dvě SLAVE zařízení. Jedno s adresou 1010000B, což neodpovídá žádné z registrovaných adres ve SBS specifikaci [1]. Ani při vyhledávání na internetu jsem další informace k této adrese nenalezl. Jelikož komunikace s tímto zařízením byla vždy stejná a probíhala pouze při startu, dál jsem se jím nezabýval. Druhá adresa SLAVE zařízení byla 0001011B, což dle SBS specifikace [1] odpovídá adrese pro chytrou baterii, čili veškerou takto adresovanou komunikace jsem podrobně analyzoval. Ze získaných výsledků s přihlédnutím na SBS specifikaci [1] je jasné, že díky krátkým skenovaným úsekům se mi nepodařilo objevit veškeré využívané funkce, avšak pro další návrh a realizaci výsledného zařízení to není velký problém. Komunikace je ověřena a později už při komunikaci naprogramovaného mikroprocesoru bude možné přehledně kontrolovat veškeré funkce, které na SMBus na přímo použitém laptopu proběhnou. - 21 -
KAPITOLA 4: Návrh 4.1 Výběr součástek 4.1.1 Mikroprocesor Díky rozsáhlým a dobrým zkušenost s programováním jednočipových mikroprocesorů firmy ATMEL, jsem se i v této práci pro tuto značku rozhodl. Zvolil jsem jejich podnož AVR, jelikož nabízí široké spektrum implementovaných periferií, které ušetří použití dalších součástek a zjednoduší programování. Zároveň jejich pořizovací cena není příliš vysoká. Důležitým požadavkem na použitý mikroprocesor byly nutné periferie jako je sběrnice I2C(společnost Atmel používá označení TWI) pro zjednodušení komunikace a ADC převodník pro sledování elektrických veličin baterie. Z nabízených produktů jsem vybral mikroprocesor s označením ATMEGA8-PU, jelikož obsahuje výše uvedené potřebné periferie a navíc umožňuje ISP programování, díky kterému lze ušetřit na pořizovací ceně programátoru. Počet 20 pinů je pro moji aplikaci dostačující. Zvolil jsem ho v pouzdře DIL, k zjednodušení výsledné konstrukce HW části. Přehledný soupis základních vlastností zvoleného mikroprocesoru dle [4] se nachází v Tabulka 4-1: Vlastnosti ATMEGA8.
Počet pinů
20
Paměť
8 kB flash, 512 B EEPROM
Provozní napětí
4,5 V až 5,5 V
Maximální frekvence 16 MHz Periferie
2x 8 bit. a 16 bit. čítač/časovač 8x 10 bit. ADC převodník interní RC oscilátor ISP programovací režim
Tabulka 4-1: Vlastnosti ATMEGA8
- 22 -
KAPITOLA 4:Návrh
4.1.2 Periferní součástky mikroprocesoru Podle [4] je nutné na resetovací vstup pin č. 1 připojit rezistor 10 kΩ na kladný pól a na vstup referenčního napětí pin č. 27 keramický kondenzátor 10 nF. K určeným 5 pinům dle [4] připojíme 10pinový DIL konektor určený k připojení programátoru. 4.1.3 Měření napětí Maximální rozptyl měřených hodnot vnitřním ADC převodníkem je 0 až 5 V. Jelikož já potřebuji měřit napětí až 14,4 V s rezervou 15 V, musel jsem použít odporový dělič zapojený podle Obrázek 4-1: Část pro měření napětí.
Obrázek 4-1: Část pro měření napětí
Hodnoty děliče jsem vypočítal podle vzorce převzatého z [17]:
Zvolené a dané hodnoty: UOUT = 5 V při UIN = 15 V, R1 = 82 kΩ, nyní po dosazení:
Jelikož rezistor R2 bylo nutné zaokrouhlit a napájecí napětí, které je zvolené jako referenční není přesně 5 V, bylo nutné využití R3, jehož hodnotu jsem zvolil 3,3 kΩ.
- 23 -
KAPITOLA 4:Návrh
4.1.4 Měření proudu Při měření odebíraného proudu z baterie přes multimetr jsem naměřil hodnoty dosahující až k 5 A. Bylo nutné navrhnout měřící obvod, aby měl minimální ztráty a přitom se neztratila možnost odečítat hodnoty pro celý rozsah proudu převedeného na napětí. Na základě doručení vedoucího práce jsem prostudoval katalogový list obvodu DS2746 [16] k pochopení měření proudu. Vedoucí objevil obvod jako implementovaný v mobilním telefonu. Mně se jej bohužel nepodařilo koupit, proto jsem zvolil jinou cestu.
Obrázek 4-2: Část pro měření proudu
Jako referenční napětí pro ADC převodník jsem zvolil interní zdroj s hodnotou 2,56 V. Prvek, který bude převádět proud na napětí, jsem zvolil rezistor zapojený do série s akumulátorem. Podle Ohmova zákona dle [17] jsem pro zvolený rozsah proudu zvolil hodnotu rezistoru 0,47 Ω. Abych eliminoval dlouhodobý napěťový úbytek a tepelnou energii na tomto rezistoru provedl jsem zapojení podle Obrázek 4-2: Část pro měření proudu, jehož funkce je taková, že tranzistor MOS-FET [5] v klidovém stavu přemostí měřící rezistor a proud protéká přes paralelní kombinaci měřící rezistoru a vnitřního odporu MOS-FETu, který je velmi malý, a tudíž dochází k minimálnímu úbytku napětí. V krátkém okamžiku, kdy probíhá převod na ADC převodníku se tranzistor MOS-FET otevře a veškerý proud protéká přes měřící rezistor. Takto navržený obvod funguje pouze pro měření proudu tekoucího z akumulátoru, který mě zajímá nejvíce. Měření nabíjecího proudu jsem v řešení vynechal, neboť funkce nabíjení z laptopu je pouze doplňková součást emulátoru a při použití olověného akumulátoru nám stačí hlídat pouze nabíjecí napětí. 4.1.5 Napájecí zdroj Ke správnému chodu mikroprocesoru a získání 5 V napěťové reference pro ADC převodník, bylo nutné do zapojení dodat stabilizovaný zdroj 5 V. Já jsem tedy zvolil často používaný stabilizátor s pevným napětím 5 V s označením 78L05 v zapojení dle [6], viz. - 24 -
KAPITOLA 4:Návrh
Obrázek 4-3: Napájecí zdroj. Vstup stabilizátoru je chráněn proti přepólování křemíkovou diodou a na vstupu a výstupu jsou filtrační keramické a elektrolytické kondenzátory.
Obrázek 4-3: Napájecí zdroj
4.1.6 Rozhraní RS232 Abych docílil přehledného zobrazení probíhající komunikace na SBS sběrnici, zařadil jsem do schématu zapojení během vývoje na nepájivém kontaktním poli sběrnici RS232 realizovanou integrovaným obvodem MAX232 [14] zapojeném podle Obrázek 4-4: Rozhraní RS232, jenž bylo převzato ze [14]. K tomuto účelu jsem opět využil svým znalostí v oblasti programování jazyku JAVA a napsal program, který mi z virtuálního sériového portu počítače s pomocí USB převodníku na RS232, přehledně zobrazoval informace, které jsem během návrhu, realizace a testování posílal z mikroprocesoru. Zdrojový kód programu je v Příloha C, Zdrojový kód programu pro čtení dat ze sériového portu.
Obrázek 4-4: Rozhraní RS232
- 25 -
KAPITOLA 4:Návrh
4.1.7 Ostatní součástky Jelikož standardní baterie obsahuje termistor jako sekundární kontrolu baterie, bylo nutné do schématu zapojení dodat rezistor s hodnotou 10 kΩ uzemňující daný pin konektoru pro připojení baterie na laptopu. K signalizaci stavu napětí baterie byly přidány 3 LED diody (červená < 9,6 V; oranžová 9,6-10,8 V; zelená > 10,8 V). Dále červená LED dioda pro signalizaci chybné komunikace na SBS sběrnici a oranžové pro signalizaci probíhajícího nabíjení akumulátoru. Hodnoty předřadných rezistorů jsem vypočítal dle Ohmova zákona [17] ze vzorce:
UD je pracovní napětí LED diody, které se dle typu a barvy mění v rozsahu 1,8 až 2,2 V, zvolil jsem tedy střední hodnotu 2 V. Z praktických zkušeností je mi známo, že taková změna nemá žádné negativní účinky pro zvolené LED diody. Proud ID procházející diodou je dle katalogových hodnot 20 mA pro všechny zvolené typy. Pro možnost zrušení nabíjení akumulátoru z laptopu byl do zapojení zařazen jumper. V rozpojeném stavu nabíjení zruší.
4.2 Elektronické schéma a DPS 4.2.1 Výsledné schéma zapojení
Obrázek 4-5: Schéma zapojení – výsledné
- 26 -
KAPITOLA 4:Návrh
Schéma zapojení na
Obrázek 4-5: Schéma zapojení – výsledné obsahuje řídící
mikroprocesor s pomocným kondenzátorem C8 a rezistorem R1, které vygenerují resetovací pulz při zapnutí napájení. Oscilátor je zde vynechaný, neboť je použit interní RC oscilátor nakonfigurovaný na 2 MHz. Kondenzátor C3 slouží k vytvoření napěťové reference pro ADC převodník. Vstupní dělič pro měření napětí akumulátoru je tvořen rezistory R2, R5 a proměnným R6. Měřící část pro proud je tvořena paralelní kombinací výkonového rezistoru R7 a unipolárního tranzistoru Q1, jehož velmi malý vnitřní odpor můžeme zanedbat, měřené ztrátové napětí na rezistoru R7 prochází rezistorem R3, který slouží jako proudová ochrana vstupu ADC převodníku. Oba vstupy ADC převodníku jsou ošetřeny proti zákmitům kondenzátory C1 a C2. K signalizaci stavů slouží 5 LED diod LED1 až LED5 s předřadnými odpory R8, R9 a R10. Jumper JP1 slouží k ovládání funkce nabíjení akumulátoru laptopem. Napájecí část tvoří stabilizovaný zdroj napětí IC2 s jmenovitým napětím 5 V. Na vstupu a výstupu jsou filtrační kondenzátory C4, C5, C6 a C7. V sérii na vstup je zařazena křemíková dioda D1, která brání zničení IC2 při přepólování napětí. Z důvodu programování ISP, zapojení obsahuje 10pinový počítačový konektor k připojení programátoru.
OZNAČENÍ HODNOTA OZNAČENÍ
HODNOTA
OZNAČENÍ
HODNOTA
R1
10 kΩ
C1
100 nF
LED2
3 mm, žlutá
R2
82 kΩ
C2
100 nF
LED3
3 mm, zelená
R3
27 kΩ
C3
10 nF
LED4
3 mm, žlutá
R4
10 kΩ
C4
100 nF
LED5
3 mm, červená
R5
39 kΩ
C5
100 nF
Q1
IRFZ44N
R6
3,3 kΩ
C6
100 µF
IC1
ATMEGA8
R7
0,47 Ω
C7
47 µF
IC2
7805
R8
150 Ω
C8
10 µF
JP1
Jumper
R9
150 Ω
D1
1N4148
CON1
DIL 10 pinů
R10
150 Ω
LED1
3 mm, červená
Tabulka 4-2: Seznam součástek
4.2.2 Návrh DPS Kompletní návrh desky plošných spojů jsem provedl v programu Eagle a výsledný nákres spolu s osazením je vložen v Příloha C, Obrázek C-1: DPS nákres 2:1 a Obrázek C-2: DPS osazení. - 27 -
KAPITOLA 5: Realizace 5.1 Sestavení elektronického obvodu na NKP Nejjednodušší a nejrychlejší cestou k sestavení elektrického obvodu je právě použití NKP – nepájivého kontaktního pole. K mému účelu bylo jeho použití z několika hledisek velice výhodné. Prvním z nich byla nutnost sestavit pomocný obvod, sloužící jako převodník sériové linky TTL na RS232 podle Obrázek 4-4: Rozhraní RS232, který už ovšem v konečném řešení nefiguroval a nebylo ho nutné implementovat do DPS. Dalším z nich byla možnost vyladění odporového děliče pro měření napětí viz. Obrázek 4-1: Část pro měření napětí a pomocný obvod pro měření proudu viz. Obrázek 4-2: Část pro měření proudu. Všechny tyto součásti včetně mikroprocesoru a periferních součástek jsem sestavil na jednom nepájivém kontaktním poli spolu s připojeným USB programátorem (viz. Příloha D, Obrázek D-1: Fotografie sestavení zapojení na NKP) a připojeným konektorem pro baterii u laptopu (viz. Příloha D, Obrázek D-2: Fotografie připojení k laptopu).
5.2 Programování 5.2.1 Vývojové prostředí a programátor Kompletní program jsem psal ve vývojovém prostřední od firmy ATMEL s názvem AVR Studio. Výhodou prostředí je přímá podpora řady programátorů mikroprocesorů. Ušetřím tím čas a značně se mi zjednoduší vývoj programu, jelikož naprogramování mikroprocesoru mohu provést již během kompilace zdrojového kódu bez nutnosti využití dalších programů. Programátor mikroprocesorů jsem zvolil USB AVR Prog v2 od firmy AND-TECH pro ISP programování kompatibilní s programátorem ST500, který je právě podporován zvoleným vývojovým prostředím. Díky podpoře ISP programování jak programátoru, tak i zvoleného mikroprocesoru, mám možnost programovat mikroprocesor pomocí 4 vodičů přímo v zapojení.
- 28 -
KAPITOLA 5:Realizace
5.2.2 Tvorba programu Program jsem vytvářel za pomoci informací převzatých z [4] a znalostí programování mikrokontrolérů v jazyce C získaného z [18]. Klíčovou součástí programu ke správné funkci celého emulátoru je komunikace po I2C sběrnici. Pro zjednodušení jsem využil integrované sběrnice TWI, která je plně kompatibilní s I2C. Prvním úkolem bylo komunikaci zprovoznit, což se nejdříve nedařilo. Později jsem zjistil, že důvodem byl zdroj hodinového signálu pro mikroprocesor. Používám interní RC oscilátor, který byl nakonfigurovaný na 1 MHz a to byl kámen úrazu. Tato rychlost nebyla dostačující a po nakonfigurování oscilátoru na 2 MHz sběrnice bezproblémově funguje. K obsluze TWI sběrnice slouží několik registrů. TWCR a TWSR k obsluze a konfiguraci sběrnice, TWAR k nastavení adresy, pokud je použito jako slave zařízení a TWDR jako dvoucestný registr pro odesílání a příjem dat po sběrnici. Abych docílil téměř okamžitého vyřízení požadavku přicházejícího po sběrnici, využil jsem možnost vyvolání přerušení při změně stavu na sběrnici. Během přerušení se na základě hodnoty v registru TWSR určuje v jakém stavu je nynější komunikace. Lze tím snadno zjistit, zda je komunikace platná a data jsou přijaté v registru TWDR. Díky tomu je zpracování celé komunikace velice jednoduché. Dalším úkolem bylo zprovoznit druhou sběrnici sloužící jako pomocnou při vývoji a testování, a to sériovou sběrnici RS232. USART sběrnice je opět integrovaná v použitém mikroprocesoru. Ke konfiguraci a obsluze slouží registry UBRRL, UBRRH, UCSRC, UCSRB a UCSRA. Obousměrný registr UDR slouží k odesílání a příjmu dat po sběrnici. Sběrnici jsem nakonfiguroval na rychlost 19200 Bd, 8bitové data bez parity a 1 stop bit. Používám ji v programu pouze jednosměrně a to za pomocí implementované metody sloužící k odeslání jednoho bytu. Nyní bylo nutné implementovat zpracování přijatých funkcí od připojeného laptopu. V případě odesílání konstant jsem neviděl žádný problém, ale pokud vezmu v úvahu, že na převod ADC převodníku je potřebný určitý čas, tak právě tento čas by mohl narušit komunikaci po SMBus sběrnici. Proto jsem po delší úvaze implementoval části programu k získávání reálných dat mimo části, kdy probíhá komunikace s laptopem. Odesílaná data se načítají z pomocných proměnných, do kterých data ukládají funkce získávající reálné hodnoty. - 29 -
KAPITOLA 5:Realizace
V metodě, kde se data načítají k odeslání jako odpovědi přijatým funkcím, se k rozlišení používá kód přijaté funkce. V průběhu této metody se do pomocného pole vloží data k odeslání a do dalšího registru se zapíše počet bytů dat. Pak během přerušení vyvolaného TWI sběrnicí se ve správných stavech data odesílají. Nyní jsem se rozhodl implementovat za využití interního ADC převodníku reálné informace o stavu akumulátoru, jedná se o aktuální napětí a aktuální vybíjecí proud. Mikroprocesor obsahuje 8krát 10bitových ADC převodník, převod se vždy provádí v jednom okamžiku na jednom kanálu, výběr tohoto kanálu, vzorkovací frekvence a referenční napětí se provádí konfiguračními registry ADCSRA, ADCSRB a ADMUX. Výsledná hodnota z převodníku je pak uložena v registru ADC. Nyní rozvedu téma zvlášť pro měření napětí a měření proudu. Pro měření napětí jsem zvolil za referenční napětí napájecí napětí dle podkapitoly 4.1.3 Měření napětí. Na základě [4] jsem zvolil ideální vzorkovací frekvenci na 16tinu frekvence oscilátoru, abych dosáhl rychlého převodu za cenu minimální chyby převodu. Celý převod se provádí v jedné metodě volané v pravidelných časových odstupech v hlavní metodě. Během této metody se získaná hodnota z ADC přepočítá dle vzorce ze [4] na hodnotu napětí a výsledek se uloží do pomocné proměnné, z níž se odesílají data do laptopu. Zároveň se dle výsledné hodnoty rozsvěcuje správná signalizační LED dioda. Na základě tohoto změřeného napětí se upravuje procentuální zůstatek kapacity akumulátoru a mění se hodnota v proměnné určené k definování stavu akumulátoru a tím například možnost vyvolat nabíjení přes laptop. Pro měření proudu jsem zvolil za referenční napětí interní kalibrovaný zdroj napětí dle podkapitoly 4.1.4 Měření proudu. Stejně jako u měření napětí byla dle [4] zvolena vzorkovací frekvence na 16tinu frekvence oscilátoru. Opět vše probíhá v jedné pravidelně volané metodě ukládající převedenou hodnotu proudu podle vzorce ze [4] do pomocné proměnné k odeslání. Během obou měřících metod se zároveň kontroluje stav jumperu JP1. V případě rozpojeného stavu se reálné hodnoty využívají jen k signalizaci a do laptopu se odesílají pevně stanovené hodnoty plně nabitého akumulátoru. Celý program v jazyku C je k nahlédnutí v Příloha D, Zdrojový program pro mikrokontrolér.
- 30 -
KAPITOLA 5:Realizace
5.3 Sestavení elektronické obvodu na DPS 5.3.1 Tvorba DPS K vytvoření desky plošných spojů jsem vzhledem k jednoduchosti navržené desky zvolil spíše amatérskou cestu. A tou je použití čisté a na míru uřezané kuprexitové destičky, speciálního fixu, tenkého důlčíku a chloridu železitého. Na základě navržené desky v programu Eagle (viz. Příloha C,
Obrázek C-7: DPS
nákres 2:1), jsem pomocí důlčíku naznačil na kuprexitové destičce otvory pro jednotlivé kontakty součástek. Dále jsem vzal speciální fix, který odolá chloridu železitému, a pomocí něj jsem podle předlohy nekreslil všechny plošné spoje k vyznačeným důlkům. Po zaschnutí vrstvy od fixu jsem provedl odleptání vrstvy mědi mimo nakreslené spoje za pomocí roztoku chloridu železitého. Po odleptáním jsem pomocí acetonu očistil vrstvu fixu a celou desku plošných spojů jsem nalakoval ochranou vrstvou kalafuny, pro zamezení oxidace. 5.3.2 Osazení DPS Zaschlou nalakovanou destičku bylo nutné na vyznačených důlcích provrtat, což jsem provedl za pomocí malé ruční vrtačky. Nyní mohlo započíst postupné osazování desky jednotlivými součástkami podle návrhu z programu Eagle (viz. Příloha C, Obrázek C-2: DPS osazení). Při osazování je nutné dodržet pořadí osazovaných součástek, abychom eliminoval jejich případné zničení. Jako první desku osadím rezistory, diodami, kondenzátory. Poté přidám větší součástky jako pouzdra pro mikroprocesor a konektor pro připojení programátoru. Nyní můžem osadit desku svítivými LED diodami. Na závěr osadím stabilizátorem napětí a MOS-FET tranzistorem, který je obzvlášť citlivý na elektrostatické pole. Než vložím mikroprocesor do jeho pouzdra, je dobré zkontrolovat funkci stabilizátoru napětí, aby nedošlo k jeho zničení. Pro testování uvedené v podkapitole 6.1.2 Zpracování funkcí na obou stranách, jsem připravil přednastavené konstanty pro každou implementovanou funkci, některé tyto konstanty jsou pak později odesílány i během standardní funkce emulátoru. - 31 -
KAPITOLA 6: Testování 6.1 Testování programu 6.1.1 Pokrytí funkcí Cílem testování bylo odhalení dosud neimplementovaných funkcí v programu. Jedná se o funkce, které nebyly objeveny během analýzy. Pro tento případ je program vytvořen tak, aby v případě přijetí neimplementované funkce odeslal nulové 16bitové slovo, aby nedošlo k zamrznutí komunikace. Test jsem prováděl ještě při sestavení zapojení elektrického obvodu na nepájivém kontaktním poli spolu s rozhraním RS232, které bylo k testu využito. Před testem jsem pouze upravil program pro případ, kdy příjme neimplementovanou funkci. Následně se po přijetí neimplementované funkce odeslal její kód na sériový port. Na počítači, ke kterému byl obvod zapojen, jsem spustil pomocný program pro čtení dat ze sériového portu (viz. Příloha B, Zdrojový kód programu pro čtení dat ze sériového portu). Průběh testu byl následující. Spustil jsem testovaný laptop se zapojeným emulátorem se zdrojem i bez zdroje a sledoval příchozí kódy funkcí na sériové lince. Po přijetí funkce jsem provedl její rozbor na základě [1] a její doimplementování do programu. Tímto testováním jsem objevil veškeré funkce využívané testovaným laptopem při komunikaci s chytrou baterií uvedené v podkapitole 2.1.4 Detailní popis funkcí. Celkem jsem odhalil 4 funkce, které se neprojevili během analýzy. 6.1.2 Zpracování funkcí na obou stranách Po ověření, že zpracování všech možných funkcí mám kompletně implementované, bylo nutné ověřit správnost implementace a přijetí správných informací na straně testovaného laptopu. Příprava testu probíhala tak, že jsem v programu veškerá odesílaná data jako návratové hodnoty zvolil jako konstanty. A za pomocí programu Battery Information jsem ověřoval správnost přenesených dat do testovaného laptopu. - 32 -
KAPITOLA 6:Testování
6.2 Testování HW Testování HW součástí emulátoru probíhalo dvakrát. Jednou při sestavení na nepájivém kontaktním poli po provedení SW testování, abych ověřil funkční návrh jednotlivých částí zapojení a celkovou funkčnost emulátoru. Po druhé jsem provedl stejné testování po sestavení emulátoru na desce plošných spojů, abych si ověřil funkční návrh DPS a její následné sestavení. Jedinou výjimkou byl test napájení, který probíhal pouze po sestavení DPS. 6.2.1 Napájení Jednalo se o jednoduché otestování běhu na použitý akumulátor, jak na straně emulátoru, tak i na straně laptopu. Dosud během vývoje programu bylo k napájení celého emulátoru použito napájecí napětí programátoru a laptop byl napájen ze síťového zdroje. Testem jsem ověřil funkčnost stabilizátoru napětí dle Obrázek 4-3: Napájecí zdroj a schopnost běhu laptopu na vybraný olověný akumulátor. 6.2.2 Funkce měření napětí Cílem tohoto testování bylo ověření správné funkčnosti ADC převodníku v mikroprocesoru a správné navržení obvodu dle Obrázek 4-1: Část pro měření napětí a zvolení hodnot součástek. K testování jsem použil multimetr pro měření skutečného napětí akumulátoru a pomocný program Battery Information v testovaném laptopu pro čtení hodnot napětí odeslaných emulátorem. Už při prvním testování jsem zjistil, že obě hodnoty jsou téměř totožné a jejich odchylku jsem později téměř vynuloval změnou nastavení proměnného rezistoru R3. 6.2.3 Funkce měření proudu Testování mělo téměř stejný význam a postup jako pro funkci měření napětí, s tím rozdílem, že jsem ověřoval funkčnost obvodu dle Obrázek 4-2: Část pro měření proudu a nastavení jiného kanálu ADC převodníku.
- 33 -
KAPITOLA 6:Testování
Multimetr byl tentokrát použit k měření proud odcházejícího z baterie a spolu s programem Baterry Information jsem opět porovnával skutečné a odeslané hodnoty proudu. Jejich odchylku jsem tentokrát dorovnával softwarově, příčinou této odchylky byl nepatrný vnitřní odpor MOS-FET tranzistoru, ale jelikož proud velmi kolísá v řádu ampér, není nutná přílišná přesnost. Test pro nabíjecí proud jsem neprováděl, jelikož toto měření není do řešení implementováno. 6.2.4 Funkce nabíjení z laptopu Tímto testem jsem chtěl ověřit funkci ovládacího jumperu JP1 pro zapnutí nebo vypnutí funkce nabíjení z laptopu a zároveň ověření přítomnosti nabíjecí proudu na daném vývodu laptopu. K testu byl opět použit multimetr k měření napětí na daném vývodu laptopu a signalizační LED dioda LED4 implementovaná v řešení emulátoru pro signalizaci probíhajícího nabíjení. Program v mikroprocesoru byl upraven tak, aby v časových odstupech odesílal ve funkci zjišťující úroveň nabití akumulátoru procentuální hodnoty 100 % a 80 % a návratovou hodnotu při funkci zjištující stav akumulátoru pro plně nabitý akumulátor a vybitý akumulátor. Výsledky testu ukazuje Tabulka 6-1: Výsledky testu funkce nabíjení.
Jumper
Úroveň
Stav
LED
Napětí na vývodu
Zapojen
100 %
Nabitý
Nesvítí
2,64 V
Zapojen
100 %
Vybitý
Svítí
2,64 V
Zapojen
80 %
Nabitý
Svítí
2,64 V
Zapojen
100 %
*Vybitý
Svítí
14,75 V
Zapojen
**80 %
Nabitý
Svítí
14,75 V
Zapojen
80 %
Vybitý
Svítí
14,75 V
Rozpojen
100 %
Nabitý
Nesvítí
2,64 V
Tabulka 6-1: Výsledky testu funkce nabíjení
*stav zůstal neměnný při změně úrovně z 80 na 100 % **úroveň zůstala neměnná při změně stavu z vybitý na nabitý
Na základě výsledků testu bylo nutné upravit stavy svícení kontrolní LED diody LED4, jelikož na vývodu laptopu se nabíjecí napětí objeví až ve chvíli, kdy odpovědi na obě funkce vykazují nutnost nabíjení akumulátoru. - 34 -
KAPITOLA 6:Testování
6.2.5 Signalizace Jednoduchý test pro ověření funkční signalizace napětí akumulátoru a poruchy komunikace pomocí implementovaných LED diod. Signalizace nabíjení je vynechaná, neboť byla již otestovaná při testování funkce nabíjení z laptopu. K testu byl regulovaný zdroj napětí přivedený na místo akumulátoru a multimetr pro rychlé a přesné zjišťování velikosti přiváděného napětí. Chybu komunikace jsem simuloval přerušením datového vodiče na I2C lince. Kompletní funkce signalizace byla porovnána podle Tabulka 6-2: Funkce LED diod. Výsledek testu byl úspěšný pro všechny požadavky.
LED
Barva
Funkce
LED1 Červená
Napětí < 9,6 V
LED2
Žlutá
9,6 V =< Napětí =< 11,6 V
LED3
Zelená
Napětí > 11,6 V
LED4
Žlutá
Nabíjení
LED5 Červená
Chyba komunikace
Tabulka 6-2: Funkce LED diod
6.3 Testování na jiném laptopu 6.3.1 Parametry laptopu a baterie K tomuto testování jsem využil laptopu nabízejícího vedoucí mé bakalářské práce. Jedná se o laptop s parametry uvedenými v Tabulka 6-3: Parametry testovacího laptopu
Výrobce Dell Typ
Latitude CPi-A
Baterie
Dell 1691P; 14,4 V; 4400 mAh
Tabulka 6-3: Parametry testovacího laptopu
Už při připojování emulátoru k laptopu jsem objevil rozdíl oproti primárnímu testovanému laptopu. Jednak v rozložení vývodů konektoru pro připojení baterie, tak i jejich obsahu. Baterie do laptopu již neobsahovala ochranný termistor a pro kontrolu či detekci připojené baterie jsou využívané dva vývody, z nichž jeden slouží k propojení záporného pólu baterie a druhý se k němu přes baterii připojuje. - 35 -
KAPITOLA 6:Testování
6.3.2 Průběh a zhodnocení testování Celý test měl podobný průběh jako souhrn testů uvedených v podkapitole 6.1 Testování programu. Cílem bylo opět odhalení neimplementovaných a případně špatně zpracovaných funkcí. Výsledkem testování bylo odhalení další využívané funkce, které slouží k zjištění chemického složení článku připojené baterie uvedené v podkapitole 2.1.4 Detailní popis funkcí. Během testování správného zpracování funkcí jsem nezjistil jakýkoli nedostatek, ovšem pomineme-li nestandardní využití funkcí. Jedná se o funkci zjišťující procentuální zůstatek kapacity baterie, kterou testovaný laptop použil, avšak její hodnotu nevyužil při zobrazení informací o baterii. Později jsem zjistil, že procentuální zůstatek kapacity baterie si software laptopu sám určí za pomocí hodnot získaných z funkcí zjišťující aktuální kapacitu baterie a kapacitu při plně nabité baterii. V případě testování na primárním laptopu jsem zjistil, že každý laptop má pravděpodobně svoji kontrolu některých získaných údajů o baterii. Zjištěno v případě odeslání nesprávného typu baterie, kdy se spouštění laptopu zacyklilo na funkci získávající tento údaj. Dle otestování na druhém laptopu se ukázalo, že u něj na odeslaném typu baterie nezáleží, tudíž se bude spíše jednat o nepravidelnou vlastnost.
- 36 -
KAPITOLA 7: Závěr Na základě mé bakalářské práce mohu říct, že alespoň u obou testovaných laptopů se opravdu využívá Smart Battery System protokolu při komunikaci s baterií a dá se předpokládat využití i u jiných výrobců a typů, vzhledem k odlišnému výrobci obou využívaných laptopů a jejich baterií. Na základě této informace se mi podařilo sestavit a naprogramovat zařízení obsahující mikrokontrolér, které s použitím akumulátoru umí simulovat či emulovat standardní chytrou baterii určenou pro laptopy a umožní chod laptopu i na tento nestandardní akumulátor, který může mít různou kapacitu a chemické složení, avšak vhodné napětí. Zařízení neboli emulátor má implementovanou funkci hlídání napětí a proudu připojeného akumulátoru. Navíc je možno tyto údaje odesílat do laptopu a za pomocí něj i akumulátor nabíjet. Zařízení je tedy možné využívat ve všech laptopech s chytrou baterií a zařízeních používající chytrou baterie. Nutná je pouze úprava hodnot odesílaných emulátorem vztažených k baterii, neboť některé zařízení, jako primárně testovaný laptop má ještě svoji kontrolu získaných údajů o baterii.
- 37 -
Seznam symbolů a zkratek SBS
Smart Battery System
SMBus
Smart Battery Bus
SBCH
Smat Battery Charger
PEC
Packet Error Checking
NiCd
Nickel Cadmium
NiMH
Nickel Metal Hydride
SBCH
Smart Battery Charger
I2C
Inter Integrated Circiut
USART
Universal Asynchronous Receiver/Transmitter
TTL
Transistor-Transistor Logic
L
Low
H
High
SCL
Synchronous clock
SDA
Synchronous data
ACK
Acknowledge
NACK
No Acknowledge
TWI
Two Wire Interface
ISP
In-System Programing
DIL
Dual In Line
RC
Resistor-Capacitor
ADC
Analog Digital Converter
NKP
Nepájivé kontaktní pole
DPS
Deska plošných spojů
HW
Hardware
SW
Software
R, r
Read
W, w
Write
R/W, r/w
Read/Write
- 38 -
Použitá literatura a software [1]
Smart Battery Data Specification. In: SBS-IF [online]. 1998 [cit. 2012-10-29]. Dostupné z: http://www.sbs-forum.org/specs/sbdat110.pdf
[2]
Shannonův teorém. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001 [cit. 2012-11-05]. Dostupné z: http://cs.wikipedia.org/wiki/Shannon%C5%AFv_teor%C3%A9m
[3]
UM10204: I2C-bus specification and user manual. In: NXP B.V. [online]. 2012 [cit. 2012-11-07]. Dostupné z: http://www.nxp.com/documents/user_manual/UM10204.pdf
[4]
ATMEGA8 Datasheet. In: Atmel Corporation [online]. 2011 [cit. 2012-11-11]. Dostupné z: http://www.atmel.com/Images/doc2486.pdf
[5]
IRFZ44N. In: GM electronic [online]. 2001 [cit. 2012-11-12]. Dostupné z: http://www.gme.cz/dokumentace/915/915-021/dsh.915-021.1.pdf
[6]
L78L00 SERIES. In: GM electronic [online]. 2005 [cit. 2012-11-12]. Dostupné z: http://www.gme.cz/dokumentace/330/330-095/dsh.330-095.1.pdf
[7]
Elektronické napájecí zdroje a akumulátory. In: HAMMERBAUER, Jiří. Renerga [online]. 2008 [cit. 2012-11-14]. Dostupné z: http://www.renerga.cz/content/file/AKUMUL%C3%81TORY%20TEORIE%202.PDF
[8]
Battery University [online]. 2012 [cit. 2012-11-14]. Dostupné z: http://batteryuniversity.com
[9]
How to rebuild a Li-Ion battery pack. In: Electronics-lab [online]. 2012 [cit. 2012-1114]. Dostupné z: http://www.electronics-lab.com/articles/Li_Ion_reconstruct/index.html
[10] I²C. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001- [cit. 2012-11-15]. Dostupné z: http://cs.wikipedia.org/wiki/I%C2%B2C - 39 -
[11] 1680-Series Logic Analyzers: Quick Start/Installation. In: HardWeb FEL-ČVUT [online]. 2004 [cit. 2012-11-22]. Dostupné z: https://service.felk.cvut.cz/lab/pristroje/Agilent1681A/QuickStart-Installation.pdf [12] Agilent 6000 Series - Oscilloscope: Users guide. In: HardWeb FEL-ČVUT [online]. 2005 [cit. 2012-11-22]. Dostupné z: https://service.felk.cvut.cz/lab/pristroje/Agilent6104A/UsersGuide.pdf [13] TFLA-01. The Fabulous Logic Analyzer [online]. 2010 [cit. 2012-11-29]. Dostupné z: http://tfla-01.berlios.de/ [14] MAX232 Datasheet. In: GM electronic [online]. 2009 [cit. 2012-12-10]. Dostupné z: http://www.gme.cz/dokumentace/329/329-036/dsh.329-036.1.pdf [15] AVR Prog USB v2. In: AND-TECH [online]. 2012 [cit. 2012-12-11]. Dostupné z: http://and-tech.pl/wpcontent/download/avrprog%20usb%20v2/instrukcja%20avrprog%20usb%20v2.pdf [16] DS2746. In: Maxim Integrated Inc. [online]. 2009 [cit. 2012-12-11]. Dostupné z: http://datasheets.maximintegrated.com/en/ds/DS2746.pdf [17] DIETMEIER, Ulrich. Vzorce pro elektroniku. 1. české vyd. Praha: BEN - technická literatura, 1999, 255 s. ISBN 80-860-5653-8. [18] VÁŇA, Vladimír. Mikrokontroléry ATMEL AVR: programování v jazyce C : popis a práce ve vývojovém prostředí CodeVisionAVR C. 1. vyd. Praha: BEN - technická literatura, 2003, 215 s. ISBN 80-730-0102-0.
- 40 -
Software ORACLE Corp.. NetBeans [dostupné z: http://netbeans.org]. Ver. 7.0, 2011. WALLE Bernhard. TFLA-01 [dostupné z: http://tfla-01.berlios.de]. Ver. 0.5.0, 2010. CadSoft Inc.. EAGLE [dostupné z: http://www.cadsoftusa.com]. Ver. 6.3.0, 2012. ATMEL Inc.. AVR studio [dostupné z: http://www.atmel.com/tools/atmelstudio.aspx]. Ver. 4.0, 2009. Best-Byte. Battery Information [dostupné z: http://www.slunecnice.cz/sw/batteryinformation]. Ver. 1.2b
- 41 -
Seznam obrázků Obrázek 2-1: Blokové schéma SBS ...................................................................................... - 4 Obrázek 2-2: Formát odeslání bytu ....................................................................................... - 5 Obrázek 2-3: Formát odeslání slova ...................................................................................... - 5 Obrázek 2-4: Formát odeslání bloku dat ............................................................................... - 5 Obrázek 2-5: Formát čtení bytu ............................................................................................. - 6 Obrázek 2-6: Formát čtení slova ........................................................................................... - 6 Obrázek 2-7: Formát čtení bloku dat ..................................................................................... - 7 Obrázek 2-8: Formát volání funkce ....................................................................................... - 7 Obrázek 2-9: Přenos dat přes I2C ........................................................................................ - 14 Obrázek 3-1: Průběh části komunikace ............................................................................... - 18 Obrázek 4-1: Část pro měření napětí ................................................................................... - 23 Obrázek 4-2: Část pro měření proudu ................................................................................. - 24 Obrázek 4-3: Napájecí zdroj ................................................................................................ - 25 Obrázek 4-4: Rozhraní RS232............................................................................................. - 25 Obrázek 4-5: Schéma zapojení – výsledné .......................................................................... - 26 Obrázek B-1: Fotografie obalu baterie ......................................................................................iii Obrázek B-2: Fotografie plné baterie ........................................................................................iii Obrázek B-3: Fotografie konektoru baterie ............................................................................... iv Obrázek B-4: Fotografie připravené baterie .............................................................................. iv Obrázek B-5: Ukázka naskenované komunikace z logického analyzátoru ................................ v Obrázek B-6: Ukázka dekódované komunikace .....................................................................viii Obrázek C-1: DPS nákres ........................................................................................................ xvi Obrázek C-2: DPS osazení ....................................................................................................xviii Obrázek D-1: Fotografie sestavení zapojení na NKP ............................................................xviii - 42 -
Obrázek D-2: Fotografie připojení k laptopu ........................................................................xviii
- 43 -
Seznam tabulek Tabulka 2-1: Popis bitů BatteryMode ................................................................................... - 8 Tabulka 2-2: Popis bitů Battery Status ................................................................................ - 11 Tabulka 2-3: Formát slova Manufacture Date ..................................................................... - 11 Tabulka 2-4: Zkratky chemického složení .......................................................................... - 12 Tabulka 3-1: Technické parametry laptopu ......................................................................... - 15 Tabulka 3-2: Technické parametry osciloskopu .................................................................. - 15 Tabulka 3-3: Technické parametry logického analyzátoru ................................................. - 16 Tabulka 4-1: Vlastnosti ATMEGA8 ................................................................................... - 22 Tabulka 4-2: Seznam součástek .......................................................................................... - 27 Tabulka 6-1: Výsledky testu funkce nabíjení ...................................................................... - 34 Tabulka 6-2: Funkce LED diod ........................................................................................... - 35 Tabulka 6-3: Parametry testovacího laptopu ....................................................................... - 35 Tabulka A-1: Kompletní seznam SBS funkcí ............................................................................ii
- 44 -
Přílohy PŘÍLOHA A: SMART BATTERY SYSTEM .................................................................................... II PŘÍLOHA B: ANALÝZA ................................................................................................................... III PŘÍLOHA C: NÁVRH ....................................................................................................................... XII PŘÍLOHA D: REALIZACE.......................................................................................................... XVIII
i
Příloha A: Smart Battery System
Tabulka A-1: Kompletní seznam SBS funkcí
ii
Příloha B: Analýza
Obrázek B-1: Fotografie obalu baterie
Obrázek B-2: Fotografie plné baterie
iii
Příloha B:Analýza
Obrázek B-3: Fotografie konektoru baterie
Obrázek B-4: Fotografie připravené baterie
iv
Příloha B:Analýza
Obrázek B-5: Ukázka naskenované komunikace z logického analyzátoru
Zdrojový kód programu pro dekódování I2C komunikace Main.java /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package decoder_i2c; import import import import import import import
java.io.BufferedReader; java.io.BufferedWriter; java.io.FileInputStream; java.io.FileNotFoundException; java.io.IOException; java.io.InputStreamReader; java.io.UnsupportedEncodingException;
/** * * @author lucas */ public class Main { private static BufferedWriter out = null; private static BufferedReader in = null; private static DataByte db = new DataByte(); public static void main(String[] args) { try { in = new BufferedReader(new InputStreamReader(new FileInputStream("zpozdenystart.txt"), "windows-1250")); in.readLine(); in.readLine(); in.readLine(); in.readLine();
v
Příloha B:Analýza
in.readLine(); in.readLine(); for (int i = 0; i < 20; i++) { findStart(); readByte(); } in.close(); } catch (FileNotFoundException ex) { System.err.println("ERORR: NO FILE"); } catch (UnsupportedEncodingException ex) { System.err.println("ERORR: ENCODING"); } catch (IOException ex) { System.err.println("ERORR: IN/OUT"); } } private static void findStart() throws IOException { boolean repeat = true; String line = in.readLine(); while (repeat) { while ((!line.startsWith("1")) || (!line.substring(21, 22).contains("1"))) { line = in.readLine(); } line = in.readLine(); if ((line.startsWith("1")) && (line.substring(21, 22).contains("0"))) { repeat = false; } } System.out.println("START"); System.out.println(line); line = in.readLine(); while (!line.startsWith("0")) { line = in.readLine(); } } private static void readByte() throws IOException { String line = in.readLine(); for (int i = 0; i < 8; i++) { while (!line.startsWith("1")) { line = in.readLine(); } if (line.substring(21, 22).contains("0")) { while (line.startsWith("1")) { if (line.substring(21, 22).contains("1")) { System.out.println("STOP"); return; } line = in.readLine(); } db.data[i] = "0"; } else {
vi
Příloha B:Analýza
while (line.startsWith("1")) { if (line.substring(21, 22).contains("0")) { System.out.println("START"); System.out.println(line); while (!line.startsWith("0")) { line = in.readLine(); } readByte(); return; } line = in.readLine(); } db.data[i] = "1"; } while (!line.startsWith("0")) { line = in.readLine(); } } db.printData(); while (!line.startsWith("1")) { line = in.readLine(); } if (line.substring(21, 22).startsWith("0")) { System.out.println("ACK"); while (line.startsWith("1")) { line = in.readLine(); } readByte(); return; } while (line.startsWith("1")) { line = in.readLine(); } System.out.println("NACK"); while (line.startsWith("1")) { line = in.readLine(); } readByte(); } }
DataByte.java /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package decoder_i2c; /** * * @author lucas */ public class DataByte { public String[] data = new String[8];
vii
Příloha B:Analýza
public void printData() { for (int i = 0; i < this.data.length; i++) { System.out.print(this.data[i]); } } }
Obrázek B-6: Ukázka dekódované komunikace
viii
Příloha B:Analýza
Analýza komunikace LEGENDA S = START E = END A = ACK N = NACK xxxxxxx = ADRESA SLAVE ZAŘÍZENÍ x = READ/WRITE BIT xxxxxxxx = PŘÍKAZ xxxxxxxx = DATA x=ZNAMÉNKOVÝ BIT Po zapnutí proběhne komunikace se zařízením s adresou 01010000B (ve specifikaci není adresa přiřazena žádnému zařízení). |S|10100000|A|11110000|A|S|10100001|A|01001011|N|E| |S|10100000|A|11111111|A|S|10100001|A|01011010|N|E| |S|10100000|A|11111011|A|S|10100001|A|00000000|N|E|
≈45ms
|S|10100000|A|11110111|A|S|10100001|A|00001111|N|E| |S|10100000|A|11101111|A|S|10100001|A|00000011|N|E|
Další získané data jsou součástí komunikace s baterií, která má dle specifikace SBS adresu 00001011B. Kód: 0x21 Název funkce: DeviceName() Typ: READ BLOCK Popis funkce: Tato funkce vrací název baterie. Ukázka: Znázorňuje název GRAPE32.
ix
Příloha B:Analýza
0X21
0X2F(„G“) 0X34(„R“) 0X29(„A“)
0X7
|S|00010110|A|00100001|A|S|00010111|A|00000111|A|01000111|A|01010010|A|01000001| 0X32(“P”) 0X2D(“E”) 0X21(“3”) 0X20(“2”) |A|01010000|A|01000101|A|00110011|A|00110010|N|E| Kód: 0x0D Název funkce: RelativeStateOfCharge() Typ: READ WORD Popis funkce: Příkaz pro zjištění relativního zůstatku kapacity baterie. Ukázka: Znázorňuje 0000000000000101B = 5D = 5% 0X0D
LSB
MSB
|S|00010110|A|00001101|A|S|00010111|A|00000101|A|00000000|N|E| Kód: 0x08 Název funkce: Temperature() Typ: READ WORD Popis funkce: Příkaz pro zjištění aktuální teploty baterie. Ukázka: Znázorňuje 0000101110111010B = 3002D = 300.2°K = 27°C 0X08
LSB
MSB
|S|00010110|A|00001000|A|S|00010111|A|10111010|A|00001011|N|E|
Kód: 0x0a Název funkce: Current() Typ: READ WORD Popis funkce: Příkaz pro zjištění aktuálního proudu v rozmezí -32768mA až +32767mA. Ukázka: Znázorňuje 1110111010010001B = -4462D = -4462mA 0X0a
LSB
MSB
|S|00010110|A|00001010|A|S|00010111|A|10010001|A|11101110|N|E|
x
Příloha B:Analýza
Kód: 0x0b Název funkce: AverageCurrent() Typ: READ WORD Popis funkce: Příkaz pro zjištění průměrného proudu v rozmezí -32768mA až +32767mA. Ukázka: Znázorňuje 111101011101010B = -2597D = -2597mA 0X0b
LSB
MSB
|S|00010110|A|00001011|A|S|00010111|A|11011010|A|11110101|N|E|
xi
Příloha C: Návrh Zdrojový kód programu pro čtení dat ze sériového portu Main.java /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package control; import javax.comm.*; /** * * @author lucas */ public class Main { public static void main(String[] args) { String driverName = "com.sun.comm.Win32Driver"; try { CommDriver commdriver = (CommDriver) Class.forName(driverName).newInstance(); commdriver.initialize(); } catch (Exception e2) { System.err.println(e2); } GUI gui = new GUI(); } }
SimpleRead.java /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package control; /** * * @author lucas */ import java.io.*; import javax.comm.*; import javax.swing.JTextArea; public class SimpleRead extends Thread {
xii
Příloha C:Návrh
private private private private
JTextArea output; InputStream inputStream; SerialPort serialPort; boolean run = true;
public SimpleRead(CommPortIdentifier portId, JTextArea output) { super(); this.output = output; try { serialPort = (SerialPort) portId.open("SimpleReadApp", 2000); serialPort.notifyOnDataAvailable(true); serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); inputStream = serialPort.getInputStream(); } catch (UnsupportedCommOperationException e) { System.out.println(e); } catch (PortInUseException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } } @Override public void run() { output.append("START \n"); try { while (run) { while (inputStream.available() > 0) { int numBytes = inputStream.read(); String toUpperCase = Integer.toHexString( 0x10000 | numBytes).substring(1).toUpperCase(); output.append("FUNCTION: " + toUpperCase + "\n"); } } } catch (IOException e) { System.out.println(e); } } public void stopRun() { serialPort.close(); run = false; } }
GUI.java /* * To change this template, choose Tools | Templates
xiii
Příloha C:Návrh
* and open the template in the editor. */ package control; import import import import import import import import import import import import import import import
java.awt.Color; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.util.Enumeration; javax.comm.CommPortIdentifier; javax.swing.BorderFactory; javax.swing.JButton; javax.swing.JComboBox; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JOptionPane; javax.swing.JPanel; javax.swing.JScrollPane; javax.swing.JTextArea; javax.swing.ScrollPaneConstants;
/** * * @author lucas */ public class GUI extends JFrame { CommPortIdentifier portId; Enumeration portList; SimpleRead reader; JPanel jPanel1; JPanel jPanel2; JLabel port = new JLabel("PORT: "); JButton start; JButton stop; JComboBox box; JTextArea output; JScrollPane scroller; public GUI() { super("PORT READER by Lukas Vydrzel"); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); this.setLayout(new java.awt.BorderLayout()); initComponents(); setVisible(true); } private void initComponents() { jPanel1 = new JPanel(); jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER)); jPanel2 = new JPanel(); jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER)); jPanel1.setBackground(Color.RED);
xiv
Příloha C:Návrh
jPanel2.setBackground(Color.GREEN); start = new JButton("START"); stop = new JButton("STOP"); stop.setEnabled(false); start.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { output.setText(""); reader = getReader(); if (reader != null) { reader.start(); start.setEnabled(false); stop.setEnabled(true); } } }); stop.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { reader.stopRun(); stop.setEnabled(false); start.setEnabled(true); } }); box = new JComboBox(); reloadPort(); jPanel1.add(port); jPanel1.add(box); jPanel1.add(start); jPanel1.add(stop); output = new JTextArea(12, 40); output.setLineWrap(true); output.setWrapStyleWord(true); output.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); scroller = new JScrollPane(output); scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCR OLLBAR_ALWAYS); jPanel2.add(scroller); this.add(jPanel1, java.awt.BorderLayout.NORTH); this.add(jPanel2, java.awt.BorderLayout.SOUTH); pack(); } private void reloadPort() { portList = CommPortIdentifier.getPortIdentifiers();
xv
Příloha C:Návrh
while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { box.addItem(portId.getName()); } } } private SimpleRead getReader() { portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(box.getSelectedItem())) { return new SimpleRead(portId, output); } } } JOptionPane.showMessageDialog(this, "PORT ERROR!"); return null; } }
Obrázek C-7: DPS nákres 2:1
xvi
Příloha C:Návrh
Obrázek C-2: DPS osazení
xvii
Příloha D: Realizace
Obrázek D-1: Fotografie sestavení zapojení na NKP
Obrázek D-2: Fotografie připojení k laptopu
xviii
Příloha D:Realizace
Zdrojový kód programu pro mikrokontrolér #define F_CPU 2000000UL #include
#include #include #include #include void void void void void void
sendchar(char i); com_init(uint16_t ubrr_value); twi_init(void); getdata(char code); get_voltage(void); get_current(void);
uint16_t adcvalue; uint16_t adctemp; unsigned char counter; unsigned char length; unsigned char buffer[10]; unsigned char twistatus; unsigned char chemname[5]={0x04,'L','I','O','N'}; //unsigned char devname[6]={0x05,'1','6','9','1','P'}; unsigned char devname[8]={0x07,'G','R','A','P','E','3','2'}; unsigned char manufacturer[9]={0x08,'V','Y','D','R','Z','L','U','K'}; unsigned char manaccess[2]={0x00,0x00};//X unsigned char mandate[2]={0x21,0x3c};//1.1.2010 unsigned char statebattery[2]={0x64,0x00};//100%(64,00) unsigned char s_statebattery[2]={0x64,0x00};//100%(64,00) unsigned char temperature[2]={0xba,0x0b};//27C unsigned char actcapacity[2]={0x94,0x11};//4400mAh unsigned char fullcapacity[2]={0x94,0x11};//4500mAh unsigned char designcapacity[2]={0x94,0x11};//4500mAh unsigned char batstatus[2]={0xc0,0x00};//discharging(c0,00),fully charged(a0,00) unsigned char s_batstatus[2]={0xa0,0x00};//discharging(c0,00),fully charged(a0,00) unsigned char batmode[2]={0x00,0x60};//disable alarm,mAh(00,60) unsigned char designvoltage[2]={0xe0,0x2e};//12V unsigned char voltage[2]={0xe0,0x2e};//11.500V unsigned char current[2]={0x46,0x05};//1350mA unsigned char s_current[2]={0x46,0x05};//1350mA unsigned char avgcurrent[2]={0x6a,0xf6};//-2453mA unsigned char charcurrent[2]={0x6a,0xf6};//-2453mA unsigned char serialnumber[2]={0xf0,0xaa};//X unsigned char cycle[2]={0x0f,0x00};//15 unsigned char timetofull[2]={0x20,0x00};//time in minutes unsigned char s_timetofull[2]={0xff,0xff};//not charged start ff,ff unsigned char atrateok[2]={0x01,0x01};//>0 true unsigned char maxerror[2]={0x01,0x00};//1% void sendchar(char i) { while(!(UCSRA & (1 << UDRE)));
xix
Příloha D:Realizace
UDR = i; } void com_init(uint16_t ubrr_value) { UBRRL = ubrr_value; //set speed 1/2 UBRRH = (ubrr_value >> 8); //set speed 2/2 UCSRC = (1 << URSEL) | (3 << UCSZ0); UCSRB = (1 << RXEN) | (1 << TXEN); } void twi_init(void) { TWCR = 0x00; //disable twi TWSR = 0x00; //set prescale TWAR = 0x16; //set slave address 0x16 TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN) | (1 << TWIE); //enable twi sei(); //enable global interrupt } ISR(TWI_vect) { cli(); //disable global interrupt unsigned char temp; unsigned char enableACK; enableACK = 0x01; twistatus = TWSR & 0xf8; //get twi status + mask the prescaler bits (TWPS1,TWPS0) switch(twistatus) { case TW_SR_SLA_ACK: counter = 0; length = 0; break;
// 0x60: SLA+W received, ACK returned
case TW_SR_DATA_ACK: // 0x80: data received, ACK returned getdata(TWDR); PORTD |= (1 << PD3); break; case TW_SR_STOP: // 0xA0: stop or repeated start condition received while selected break; case TW_ST_SLA_ACK: TWDR = buffer[0]; counter++; break;
// 0xA8: SLA+R received, ACK returned
case TW_ST_DATA_ACK: // 0xB8: data transmitted, ACK received if(counter == length){ enableACK = 0; }else { TWDR = buffer[counter]; counter++; } break;
xx
Příloha D:Realizace
case TW_ST_DATA_NACK: // 0xC0: data transmitted, NACK received break; case TW_ST_LAST_DATA: // 0xC8: last data byte transmitted, ACK received case TW_BUS_ERROR: // 0x00: illegal start or stop condition PORTD &= ~(1 << PD3); twi_init(); default: counter = 0; length = 0; break; } if (enableACK != 0x00) { //send acknowledge temp = TWCR; temp |= (1 << TWEA); temp &= ~(1 << TWINT); TWCR = temp; } else { //no send acknowledge TWCR &= ~((1 << TWEA) | (1 << TWINT)); } TWCR |= (1 << TWEN) | (1 << TWIE) | (1 << TWINT); sei(); //enable global interrupt } void getdata(char code) { counter = 0; sendchar(code); switch(code) { case 0x20: //manufacturer name length = 9; buffer[0] = manufacturer[0]; buffer[1] = manufacturer[1]; buffer[2] = manufacturer[2]; buffer[3] = manufacturer[3]; buffer[4] = manufacturer[4]; buffer[5] = manufacturer[5]; buffer[6] = manufacturer[6]; buffer[7] = manufacturer[7]; buffer[8] = manufacturer[8]; break; case 0x21: //device name length = 8; buffer[0] = devname[0]; buffer[1] = devname[1]; buffer[2] = devname[2]; buffer[3] = devname[3]; buffer[4] = devname[4]; buffer[5] = devname[5]; buffer[6] = devname[6]; buffer[7] = devname[7]; break;
xxi
Příloha D:Realizace
case 0x22: //device chemistry length = 5; buffer[0] = chemname[0]; buffer[1] = chemname[1]; buffer[2] = chemname[2]; buffer[3] = chemname[3]; buffer[4] = chemname[4]; break; case 0x0d: //relative state of charge length = 2; if(PB5 == 0){ buffer[0] = statebattery[0]; buffer[1] = statebattery[1]; }else{ buffer[0] = s_statebattery[0]; buffer[1] = s_statebattery[1]; } break; case 0x08: //temperature length = 2; buffer[0] = temperature[0]; buffer[1] = temperature[1]; break; case 0x0f: //remaining capacity length = 2; buffer[0] = actcapacity[0]; buffer[1] = actcapacity[1]; break; case 0x16: //battery status length = 2; if(PB5 == 0){ buffer[0] = batstatus[0]; buffer[1] = batstatus[1]; }else{ buffer[0] = s_batstatus[0]; buffer[1] = s_batstatus[1]; } break; case 0x10: //full charge capacity length = 2; buffer[0] = fullcapacity[0]; buffer[1] = fullcapacity[1]; break; case 0x03: //battery mode length = 2; buffer[0] = batmode[0]; buffer[1] = batmode[1]; break; case 0x19: //design voltage length = 2; buffer[0] = designvoltage[0]; buffer[1] = designvoltage[1]; break; case 0x0a: //current length = 2; if(PB5 == 0){
xxii
Příloha D:Realizace
case
case
case
case
case
case
case
case
case
buffer[0] = current[0]; buffer[1] = current[1]; }else{ buffer[0] = s_current[0]; buffer[1] = s_current[1]; } break; 0x0b: //average current length = 2; buffer[0] = avgcurrent[0]; buffer[1] = avgcurrent[1]; break; 0x09: //voltage length = 2; if(PB5 == 0){ buffer[0] = voltage[0]; buffer[1] = voltage[1]; }else{ buffer[0] = designvoltage[0]; buffer[1] = designvoltage[1]; } break; 0x14: //charging current length = 2; buffer[0] = charcurrent[0]; buffer[1] = charcurrent[1]; break; 0x18: //design capacity length = 2; buffer[0] = designcapacity[0]; buffer[1] = designcapacity[1]; break; 0x1c: //serial number length = 2; buffer[0] = serialnumber[0]; buffer[1] = serialnumber[1]; break; 0x00: //manufacturer access length = 2; buffer[0] = manaccess[0]; buffer[1] = manaccess[1]; break; 0x17: //cycle count length = 2; buffer[0] = cycle[0]; buffer[1] = cycle[1]; break; 0x1b: //manufacture date length = 2; buffer[0] = mandate[0]; buffer[1] = mandate[1]; break; 0x13: //average time to full length = 2; buffer[0] = timetofull[0]; buffer[1] = timetofull[1];
xxiii
Příloha D:Realizace
break; case 0x07: length = 2; buffer[0] = buffer[1] = break; case 0x0c: length = 2; buffer[0] = buffer[1] = break;
//atrateOK atrateok[0]; atrateok[1]; //max error maxerror[0]; maxerror[1];
default: counter = 0; length = 1; buffer[0] = 0; break; } } void get_voltage(void){ cli(); ADMUX = 0; //reset ADC ADCSRA = 0; //reset ADC _delay_ms(1); //time for reset ADCSRA |= ((1 << ADEN) | (1 << ADPS2)); //prescaler at 16 of clock source ADMUX |= (1 << REFS0); //Avcc(+5v) as voltage reference ADMUX &= ~(1 << REFS1); //Avcc(+5v) as voltage reference ADMUX &= ~(1 << MUX0); //ADC0 _delay_ms(1); //time for set ADC ADCSRA |= (1 << ADSC); while(!(ADCSRA & (1 << ADIF))); ADCSRA |= (1 << ADIF); adcvalue = ADC; adctemp = ((adcvalue * 60.00) / 1023.00) * 250.00; voltage[1] = adctemp / 255; voltage[0] = adctemp & 0x00ff; if(adctemp > 12400) { //green LED PORTD |= ((1 << PD5) | (1 << PD6)); PORTD &= ~(1 << PD7); statebattery[0] = 100; //100% batstatus[0] = 0xa0; //fully charged PORTD |= (1 << PD4); }else if((adctemp > 9400) & (adctemp < 12200)) { //orange LED PORTD |= ((1 << PD5) | (1 << PD7)); PORTD &= ~(1 << PD6); PORTD &= ~(1 << PD4); batstatus[0] = 0xc0; //need charge statebattery[0] = (adctemp - 9400) / 28; // 12,4V-9,4V to 100%-0% }else if(adctemp < 9400) { //red LED PORTD |= ((1 << PD6) | (1 << PD7)); PORTD &= ~(1 << PD5); batstatus[0] = 0xd0; //fully discharged statebattery[0] = 0; //0%
xxiv
Příloha D:Realizace
PORTD &= ~(1 << PD4); } sei(); } void get_current(void){ cli(); ADMUX = 0; //reset ADC ADCSRA = 0; //reset ADC _delay_ms(1); //time for reset ADCSRA |= ((1 << ADEN) | (1 << ADPS2)); //prescaler at 16 of clock source ADMUX |= ((1 << REFS0) | (1 << REFS1)); //internal 2.56V as voltage reference ADMUX |= (1 << MUX0); //ADC1 _delay_ms(1); //time for set ADC ADCSRA |= (1 << ADSC); while(!(ADCSRA & (1 << ADIF))); ADCSRA |= (1 << ADIF); adcvalue = ADC; //read value from ADC PORTD |= (1 << PD2); //measure's resistor on adctemp = ((adcvalue * 60.00) / 1023.00) * 94.00; adctemp &= ~adctemp; adctemp++; charcurrent[1] = adctemp / 255; //save low byte charcurrent[0] = adctemp & 0x00ff; //save high byte sei(); } int main(void) { DDRD |= ((1 << DDD7) | (1 << DDD6) | (1 << DDD5) | (1 << DDD4) | (1 << DDD3) | (1 << DDD2)); PORTD |= ((1 << PD7) | (1 << PD6) | (1 << PD5) | (1 << PD4) | (1 << PD3) | (1 << PD2)); DDRB |= (0 << DDB5); PORTB |= (1 << PB5); //jumper com_init(25); //4800kbps,8bit,no parity twi_init(); //slave receiver while(1) { _delay_ms(2000); get_voltage(); //measure voltage if(PB5 == 0){ _delay_ms(2000); PORTD &= ~(1 << PD2); //close MOSFET get_current(); //measure current } } return 0; }
xxv