[DIY] Mikroprocesorowy miernik pojemności

co i jak zrobiłem...
joon
Posty: 621
Rejestracja: niedziela 04 mar 2012, 15:31
Lokalizacja: Przemyśl

[DIY] Mikroprocesorowy miernik pojemności

Post autor: joon »

Witam serdecznie wszystkich forumowiczów.
Parę dni temu doszedł do mnie zamówiony zestaw do nauki programowania (http://and-tech.pl/produk-testowy/ )
Początkowo miałem w planach naukę w języku C niestety zakończyło się jak na razie Bascomem.
To co przedstawiam niżej jest prototypem do pomiaru pojemności akumulatorów Li- Po, Li-ion.

Schematu na razie nie przedstawiam- jest jeszcze parę rzeczy do zmiany (np. obciążenie aktywne nie działa jak powinno- wraz ze spadkiem napięcia prąd nie jest utrzymywany na stałym poziomie lecz powoli spada).

Na chwilę obecną pomiary różnią się o około 5-15% z pojemnością zmierzoną na fabrycznym sprzęcie u znajomego. Program jak już wspomniałem napisany jest w Bascomie pod procesor ATMEGA 32 (taki mam zainstalowany w zestawie).
Źródło poniżej:

Kod: Zaznacz cały

$regfile = "m32def.dat"
$crystal = 16000000

Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
       'konfiguracja wyświetlacza Lcd
Config Porta = Input
Config Adc = Single , Prescaler = Auto , Reference = Off
Const Vref = 2.35
      'konfiguracja przetwornika ADC
Config Pind.6 = Output                                      'załączenie obciążenia
Config Pind.7 = Output                                      'buzzer


Config Pind.2 = Input
Set Portd.2
       'na wejściu INT0 także włączamy podciąganie i konfigurujemy pin jako wejście
       'pin D.2 jest połączony z wyjściem układu pcf8583 który generuje przerwanie co 1s
       'jest to wzorzec czasu
Enable Interrupts
Config Int0 = Falling

       'włączamy globalny system przerwań - bez tego żadne przerwanie nie zadziała
       'przerwanie powstanie przy zboczu opadającym

Enable Int0
       'włączamy przerwanie INT0 (PD2) - przerwanie jest aktywne w stanie niskim (pin jest wejściem)
On Int0 Przerwanie
'definiujemy działanie po wykryciu przerwania INT0 - skok do podprogramu Przerwanie
Dim W As Word , U As Single , J As Single , S As String * 11 ,
Dim L As Single

                                                            'Deklaracja Zmiennych


Lcd "Miernik poj."                                          'powitanie
Lowerline
Lcd "ver 1.0"
Wait 1
Cls

Glowny:


Set Portd.6
Set Portd.7
Waitms 100

Reset Portd.7
L = 0
W = 0
U = 0
Do
Cls
Lcd "U1: 0.00 V"                                            'wartosci stale na wyswietlaczu
Lowerline
Lcd "I: 0.00 A"
W = Getadc(0)                                               'pomiar napięcia po dzielniku napięcia 1:2
U = W
U = U / 1023
U = U * Vref
U = U * 2
S = Fusing(u , "#.##")
Locate 1 , 5
Lcd S
If U <= 2.8 Then Gosub Koniec;
W = 0
W = Getadc&#40;1&#41;                                               'pomiar prądu poprzez pomiar spadku napięcia na rezystorze
J = W
J = J / 1023
J = J * Vref
J = J / 2.2
S = Fusing&#40;j , "#.##"&#41;
Locate 2 , 4
Lcd S
Wait 1
Loop
End

Przerwanie&#58;
Incr L
Return

Koniec&#58;
If U > 2.8 Then Goto Glowny;
Reset Portd.6
Set Portd.7
Waitms 100
Reset Portd.7
Cls
L = L / 3600
S = Fusing&#40;l , "##.##"&#41;
Lcd "pojemnosc&#58;"
Locate 1 , 11
Lcd S
Do
Loop
Return


No i kilka zdjęć podczas pracy:

Obrazek

Obrazek

Obrazek

Obrazek



Z góry proszę o jak najmniej słów krytyki :)
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Dlaczego zastosowałeś źródło napięcia odniesienia 2,35V?
Proponuję 2 lub 4V wtedy ewentualne mnożenie jest przesunięciem w lewo o 1 lub 2
Podobnie sytuacja z dzieleniem przez 1023, dzielenia są niedokładne i pochłaniają sporo czasu. Np dzielenie przez 1024 jest przesunięciem w prawo o 10.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
joon
Posty: 621
Rejestracja: niedziela 04 mar 2012, 15:31
Lokalizacja: Przemyśl

Post autor: joon »

1. Wbudowane w procka tak pływało że musiałem zastosować zewnętrzne- tylko takie miałem pod ręką.
2. Maksymalne napięcie z rezystora pomiarowego (bocznika) wynosi ~ 2,2V dlatego zastosowałem tak niskie napięcie- dokładniejszy pomiar prądu mam dzięki temu
3. Nie mam nigdzie dzielenia przez 1023, jedynie przez 3600 :) Co do czasu to ne istotne ile zajmuje dana operacja- wzorzec czau (1s) brany jest z układu PCF który generuje sprzętowe przerwania co sekundę.

Ogólnie to jest tylko prototyp- chciałem sprawdzić czy jestem w stanie "Zrobić" coś takiego. Docelowo ma być pomiar 4 ogniw jednocześnie oraz wysyłanie danych poprzez USB do PC w celu kreślenia charakterystyk ogniw :)
Defcio
Posty: 308
Rejestracja: wtorek 25 maja 2010, 22:36
Lokalizacja: Piła/Nowy tomyśl

Post autor: Defcio »

Zrobiłeś to w kilka dni to jesteś geniuszem, takich rzeczy ludzie uczą się pół życia.
Jak dla mnie to niesamowite, gdyby tak wszyscy potrafili to elektronika poszła by do przodu stokrotnie szybciej, ładowarki mikroprocesorowe mielibyśmy w latach 70', no dobrze jakieś proste były ale na cele militarne i specjalistyczne choć dostęp do mikro-kontrolerów już cywilnie był to dopiero ostanie 10 lat rozwinęło tą dziedzinę.
Ni-Cd Man.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam

Kod: Zaznacz cały

W = 0
W = Getadc&#40;1&#41;                                               'pomiar prądu poprzez pomiar spadku napięcia na rezystorze
J = W 
Nie musisz zerować zmiennej przed pomiarem, ważniejsze jest odrzucić pierwszy pomiar po uruchomieniu ADC, bo wtedy najczęściej są zrzucane śmieci z bufora.
Możesz zrobić:
J=Getadc(1)
Zmniejszy to ilość kroków i instrukcji, teraz to może nie istotne, ale jak zacznie brakować pamięci, każdy myk się przydaje.
joon pisze:3. Nie mam nigdzie dzielenia przez 1023,

Kod: Zaznacz cały

U = U / 1023 
??


No i jeszcze:

Kod: Zaznacz cały

Lcd S
Do
Loop
Return 
Nie rozumiem tej pętli bez wyjścia

Jeśli chodzi o napięcie odniesienia, to "fabrycznie" jest 2,56V co daje 2,5mV na 1 z ADC.
Pływanie ADC, może być pożądane (swoją drogą sprawdź poprawność filtrowania sygnału Vref). Otóż doprowadzając asynchroniczny szum do wejścia Vref i dokonując uśrednienia dużej liczby pomiarów, możemy zwiększyć dokładność pomiaru. Jest to szeroko omówione w jednej z not Atmela DOC8003
Np: 32 pomiary dzielimy przez 16 i otrzymujemy rozdzielczość 2048

A znów DOC2559 omawia problemy z kalibracją i dokładnością przetworników ADC.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
joon
Posty: 621
Rejestracja: niedziela 04 mar 2012, 15:31
Lokalizacja: Przemyśl

Post autor: joon »

Pyra dzięki za uwagi. Ale jak już pisałem od niedawna "siedzę" w Bascomie, parę lat temu coś tam programowałem w szkole średniej ale to jeszcze było na '8051- stare czasy.
Teraz wiem co będzie zmienione w wersji 1.1 :D

Co do dzielenia- zapomniałem o tym :oops:
A pętla bez wyjścia "kulturalnie" zawiesza program po wyświetleniu pojemności zmierzonej, nic innego nie wpadło mi do głowy opr&#8364;cz takiego rozwiązania.

Ps. Co do pamięci: procek który mam na płycie został wybrany celowo- najpierw chcę nauczyć się programowania a później optymizacji kodu jak już będę biegle władał poleceniami.
Ps2. Ten program przeszedł takie rewolucje że w zasadzie powinienem go jeszcze raz napisać od nowa, pierwszy pomiar pokazał że aku ma parę milionów mAh :mrgreen:
Ps3. muszę zdobyć jakiś koszyczek na 18650- patent z gumką troche zaczyna mnie już drażnić :/

Defcio- wejdź na http://forum.atnel.pl/ - tam to dopiero ludzie wymiatają :)
Defcio
Posty: 308
Rejestracja: wtorek 25 maja 2010, 22:36
Lokalizacja: Piła/Nowy tomyśl

Post autor: Defcio »

Joon, nawet nie wchodzę ,chyba raz byłem, w głowie się mi zakręciło i wyszedłem, przeciętny inżynier potrafi wielokrotnie mniej, ale tacy ludzie tworzą postęp, reszta podłącza zasilacze i wymienia silniki :wink: .

Jak dla mnie ekstra projekt, może za jakiś czas uczynisz z tego ładowarkę do li-ion.
Ni-Cd Man.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
joon pisze:A pętla bez wyjścia "kulturalnie" zawiesza program po wyświetleniu pojemności zmierzonej, nic innego nie wpadło mi do głowy opr&#8364;cz takiego rozwiązania.
Może zrób tak:
Pod dowolny port np. B1 podpinasz mikrostyk.

Kod: Zaznacz cały

PortB.1 = Input
Set PortB.1
......

Do
Debounce PinB.1, 0, Glowny
Loop
End
I masz "kulturalny" powrót do ponownego pomiaru.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
ElSor
Site Admin
Posty: 5041
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

joon pisze:Początkowo miałem w planach naukę w języku C niestety zakończyło się jak na razie Bascomem.
Czyli masz podobnie jak ja tak ok miesiąca temu. Napisałem program do ATTINY13 w 1 dzień w bascomie, później przez 2 tyg go ulepszałem (uwalniałem pamięć, dodawałem nowe rzeczy) a na końcu stwierdziłem, że muszę przejść i tak na C. Tłumaczenie z B na C zajęło mi ok 4-5dni (jeszcze program wymaga kilku poprawek) ale na dzień dobry zyskałem ok 20% więcej wolnej pamięci, bez szczególnej wiedzy w zakresie optymalizacji kodu i większości tricków z C. Łatwo i szybko na początku w C nie jest na pewno ale przynajmniej wiem co dokładnie procesor robi. Widzę też, ze komendy nie zabierają aż tylu kB pamięci, więc będę mógł jeszcze trochę bajerów "wcisnąć" w procka. Także jeśli nie znasz dobrze lub bardzo dobrze bascoma tylko dopiero się uczysz go, to zawczasu zmień go na C. Jeśli poszukujesz ciekawych materiałów do C to zgłoś się a podam kilka ciekawych stron związanych z nauką C.
DNF
Posty: 4606
Rejestracja: piątek 23 lis 2007, 19:07
Lokalizacja: Bydgoszcz

Post autor: DNF »

Wpadłem zobaczyć co tam na forum atnel się dzieje i wyszedłem.. Chyba bym wsiąkł na długie miesiące i zakupił jeszcze programator :D
joon
Posty: 621
Rejestracja: niedziela 04 mar 2012, 15:31
Lokalizacja: Przemyśl

Post autor: joon »

Pyra - dzięki, tego polecenia nie znałem :)
ElSor strony też mam, gorzej że brak mi jakichkolwiek podstaw w tym języku- a przykłady z niektórych źródeł nie wiadomo czemu nie działają u mnie :/ Zbieram fundusze na zestaw fajnych (upatrzonych) książek, ale to chyba dopiero pod choinkę kupię sobie. No chyba że masz coś naprawdę od podstaw to poproszę na pw :)
DNF w moim przypadku programator nie jest potrzebny - jest wbudowany w płytkę uruchomieniową :)

Ale odnośnie miernika; jakieś sugestie, uwagi? Nie ukrywam że do świat chciałbym go złożyć na dedykowanej PCB, napisać nowy program z dodaniem paru funkcji i wywaleniem zbędnych i dać komuś do testów :)
Awatar użytkownika
pier
Posty: 1467
Rejestracja: poniedziałek 21 lut 2011, 09:02
Lokalizacja: Biłgoraj-Sól

Post autor: pier »

Daj jeszcze jakiś schemat to coś więcej będzie można powiedzieć.
Jeśli chodzi o układ stabilizacji prądu rozładowania to Możesz zastosować ten sprawdzony układ.
joon
Posty: 621
Rejestracja: niedziela 04 mar 2012, 15:31
Lokalizacja: Przemyśl

Post autor: joon »

Schematu na razie nie ma, po za pcb jest w pająku obciążenie aktywne ale będzie zmienione na podobne jak w linku który podałeś.

Niestety w moim kochanym mieście na podkarpaciu jeden sklep jest od paru dni nieczynny, w drugim wije nadal komuną, a w trzecim to co najwyżej rezystory mogę kupić (i to nie każde).
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Poszukaj polskiej pomocy do Bascoma bascavr.HLP, Jest tam mnóstwo przykładów i omówione wszystkie instrukcje.

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
cudny
Posty: 505
Rejestracja: czwartek 25 sie 2011, 16:13
Lokalizacja: Zagórze/Kraków

Post autor: cudny »

DNF, mam tak samo :D Tylko, że programator mam. :D

Nieumiejętność programowania mnie strasznie ogranicza... Chętnie bym nawet teraz siadł do nauki i pewnie bym się szybko podstaw nauczył i jakiś zegarek chociażby sklecił, ale mam inne rzeczy na głowie :/

Czego ja bym nie zrobił, gdybym umiał programować ... :mrgreen:
Solarforce L2 XM-L 8xAMC
ODPOWIEDZ