Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 26 lis 2024, o 19:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 29 ] 
Autor Wiadomość
PostNapisane: 12 cze 2015, o 20:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Witam,
Zainspirowany wątkiem http://forum.atnel.pl/topic11966.html i artykułem w nim zawartym http://wp.josh.com/2014/11/06/battery-fuel-guage-with-zero-parts-and-zero-pins-on-avr/ postanowiłem zbadać pomiar Vcc wykorzystując BandGap na żywym organizmie. Próbuje to testować na ATB. Niestety otrzymuje kompletnie nieprawdziwe wyniki... Wskazania także nie reagują na zmiany napięcia zasilania.

Procesor: Atmega32
Taktowanie: kwarc 11.0592

Wszystkie szczegóły opisują komentarze. Oto kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po wgraniu do procka na LCD wyświetla się:
Vcc = 12 (co by wskazywało na 1.2V, jednak układ zasilany jest z USB ok. 5V)
ADC = 1016
Wskazania nie zmieniają się także, gdy Vcc wynosi od 3.5 do 5V

Pewnie gdzieś się wkradł błąd. Może któryś z kolegów naprowadzi na dobre tory? :)

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 00:32 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Wydaje mi się, że nie możesz 2 razy pod rząd pobierać wartości z ADCW, pobierz ją do zmiennej i to na niej działaj.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 07:04 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Zastanawia mnie, w jaki sposób kolega chce uzyskać źródło BandGap = 1.1V w ATMega32. Ten procek jest "biedny" i oferuje "tylko" wewnętrzne źródło napięcia odniesienia 2.56V oraz oczywiście Vcc.
Ciekawy artykuł na temat BandGap można przeczytać tutaj

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 09:53 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Oczywiście, że jest Bandgap, popatrz na 202 stronę noty na schemat co jest do multipleksera przyłączone. A kilka stron dalej masz tabelkę która przedstawia jakimi bitami rejestru ADMUX się je wybiera.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 10:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Piotrek_P napisał(a):
Zastanawia mnie, w jaki sposób kolega chce uzyskać źródło BandGap = 1.1V w ATMega32.

Kolego ja tu zastosowalem Vbg =1.22V tak jak w dokumentacji megi32. Wszystkie szczegóły opisałem w komentarzach. Bity w rejestrach raczej dobrze ustawiłem, wszytkie wg noty pdf.
Tylko ten wynik... "chusteczkowy".

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 11:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Nie wiem czy dobrze myślę ale w DS na stronie 316
jest wykres zależności pomiędzy VCC a Bandgap, i
jeśli dobrze go interpretuje to napięcie Bandgap
zmienia się w zakresie 1.23V do 1,24V przy VCC 2,7V do 5,5V.

Jeśli dobrze rozumuje to musiał byś brać pod uwagę dwa lub więcej miejsc po przecinku
i je wyświetlać .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 12:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Zaba napisał(a):
Jeśli dobrze rozumuje to musiał byś brać pod uwagę dwa lub więcej miejsc po przecinku
i je wyświetlać .

Jak najbardziej biorę pod uwagę 2 miejsca po przecinku
Vbg mnożę *100 żeby pozbyć się ułamka (1.22 *100, czyli 122) i podstawiam do wzoru. Na koniec wynik dzielę przez 10 żeby otrzymać dziesiąte części volta (np. dla Vcc=5V, wynik zmiennej 'zasilanie' powinien wynosić 50)

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 13:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Zdecydowanie ADCW trzeba użyć raz juz po pętli. A w pętli dajesz sprawdzanie bitu ADSC. Teraz dostajesz jakąś nieokreśloną liczbę.
Zobacz u Mirka na blogu, jest tam wszystko pokazane.

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 13:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

sq5rix napisał(a):
Zdecydowanie ADCW trzeba użyć raz juz po pętli.

Tak zrobiłem.
Dodatkowo wszystkie zmienne i wyniki przerobiłem na uint16_t, ale dalej głupoty pokazuje.

Musze od nowa to przeanalizować i może coś znajdę...

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 14:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

No ja bym nie analizował tylko zajrzał na bloga, tam jest działający przykład. Zmieniasz tylko ADMUX.
Fajnie że to odpalasz, ja juz od tygodnia sie z tym marudzę :)

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 15:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

@sq5rix
wzorowałem się oczywiście na przykładzie z tego artykułu co dałeś linka, bo tam jest prosto to opisane.
sq5rix napisał(a):
Fajnie że to odpalasz

Przyda mi się to bo czasem próbuję coś stworzyć zasilane z baterii. Wcześniej potrzebowałem kilka dodatkowych elementów i 2 wolnych pinów, a teraz może się uda wszystko programowo rozwiązać.

Zaglądałem tez do linka od kolegi Piotrek_P http://www.ikalogic.com/avr-monitor-power-supply-voltage-for-free/ ale tam sposób jest przecież ten sam (obliczenia wg tego samego wzoru)

No nic posiedzę jeszcze w wolnej chwili nad tym i jak rozwiążę problem to się z Wami podzielę gotowcem:)
A jak macie jakieś sugestie to zapodajcie:)

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 21:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Chyba 'cza' sprawdzić to na innych prockach - np. jakaś Atmega8 - bo na tej Atmedze32 nic nie wykrzesam.

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 10:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Hmm, taki głupi pomysł mi przyszedł do głowy. A jak podajesz to napięcie? Bo jak przez przetworniczkę ....
We wzorze na vbat zamieniłbym ADCW na adc.....

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 10:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Hmm, a ja podejrzewam linię 22 kodu z pierwszego posta.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 12:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Moim skromnym zdaniem to powinno wyglądać trochę inaczej.
Zapraszam do testów. Oczywiście trzeba dobrać VBG w pliku band_gap.h
W mojej Atmega32 prawidłowe wskazania są dopiero dla Vbg=130 (1.30V)
plik main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


plik band_gap.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


plik band_gap.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 17:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Wirnick napisał(a):
Hmm, a ja podejrzewam linię 22 kodu z pierwszego posta.

Ale ja tu nie korzystam w ogóle z przerwań, więc dlatego ta linia jest zakomentowana.

Kolego anshar widzę, że nieco inaczej podszedłeś do tematu - nieco inaczej obliczasz Vcc -> vbat = ( ( adc * VBG ) / 1024 );
Dzięki za kod. Muszę sprawdzić Twój sposób. Z tego co piszesz wynika, że rzeczywiste napięcie VBG w procku jest dalekie od tego co podają w nocie (czyli 1.22V).

sq5rix napisał(a):
Hmm, taki głupi pomysł mi przyszedł do głowy. A jak podajesz to napięcie? Bo jak przez przetworniczkę ....
We wzorze na vbat zamieniłbym ADCW na adc.....

Testuję to na 3 sposoby. 1. Zasilanie z USB, 2. Zasilanie z akumulatorków (ok 3.8-4V), 3. Zasilacz regulowany (w zakresie 3 - 5V) i wynik cały czas pokazuje ten sam (ADC = 1022, Vcc ok 1.2V)

Pewnie ten wzór co stosuję się nie sprawdza. Spróbuje tak jak kolega anshar
zamiast Vcc = (Vbg * 1024) / ADC, zastosuje vbat = ( ( adc * VBG ) / 1024 )
różnica jest zasadnicza.

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 17:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Elegancki kod!!

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 18:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Panowie Działa! Dzięki wielkie za pomoc:)

tak jak zaproponował kolega anshar dodałem to małe opóźnienie w inicjalizacji ADC
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Kurcze no sam bym na to nie wpadł, że to coś da.

Jeśli chodzi o wzór to jednak ten pierwszy (jak w artykule kolegi sq5rix) jest prawidłowy.
VBG na razie ustawione jak w nocie 1.22. Później to skalibruje jak podłącze miernik.

------------------------ [ Dodano po: 7 minutach ]

Wklejam jeszcze prawidłowy kod dla potomnych. Jak ktoś chce to niech już sobie dzieli na pliki i rozdziela inicjalizację ADC i pomiar na osobne funkcje. Póki co moja wersja jest "w jednym worku"

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 19:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Dodam jeszcze, że według noty katalogowej: ADC = (Vin * 1024) / Vref
Aby wyliczyć Vin:

ADC = (Vin * 1024) / Vref // mnożymy lewą i prawą stronę przez Vref
ADC * Vref = Vin * 1024 // dzielimy przez 1024
(ADC * Vref) / 1024 = Vin
czyli
Vin = (ADC * Vref) / 1024

Teraz podstawiając:
Vin = vbat
Vref = VBG
ADC = adc
uzyskamy:
vbat = (adc * VBG) / 1024

Możliwe, że się mylę, ale tak ja to sobie wyliczyłem. Nie wiem czemu w "artykule" jest inaczej.
Dodam, że przyjąłem jako Vref napięcie katalogowe 1.22V i nie widzę możliwości, aby go zmierzyć fizycznie miernikiem.

Faktycznie według tego wzoru: vbat = ( VBG * 1024) / adc
też wszystko pięknie działa.

Tak więc wspólnymi siłami można powiedzieć, że się udało. :D

Przepraszam jeśli napisałem głupoty, ale dopiero poznaję ADC i jego możliwości.
Może ktoś mógłby podpowiedzić dlaczego w oryginalnym artykule użyto innego wzoru?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 20:23 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

anshar napisał(a):
Nie wiem czemu w "artykule" jest inaczej.

W tej metodzie mierzysz Vref, NIE Vin. Vin jest znane, stałe i równe bandgap, Vref jest napięciem zasilania czyli baterii a więc się zmienia.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 20:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Kolego anshar,
Muszę trochę sprostować to co napisałeś.
W tej metodzie:
- jako napięcie wejściowe Vin podajemy napięcie odniesienia ze źródła bandgap czyli VBG
- jako napięcie odniesienia Vref podajemy napięcie zasilania czyli Vcc
więc po podstawieniu i przekształceniach (nie chce mi się tutaj pisać wszystkiego krok po kroku)
Vcc (czyli zmienną vbat) obliczamy ze wrozu:

vbat = ( VBG * 1024) / ADC

wyraźnie widać to także na tej stronie
http://wp.josh.com/2014/11/06/battery-fuel-guage-with-zero-parts-and-zero-pins-on-avr/
tutaj tak samo
http://www.ikalogic.com/avr-monitor-power-supply-voltage-for-free/

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 20:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zgadza się panowie! :D Teraz już wszystko jasne! Jak to mówi p. Mirek - facepalm :D
Dziękuję bardzo za wyjaśnienie!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 21:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Hehe to teraz ja strzelam sobie facepalm, bo znalazłem durnego babola w moim pierwszym kodzie
to ta linijka
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

widzicie o co chodzi?
no przed MUX3 zabrakło jednego znaczka "<"
Teraz te drobne opóźnienia nie mają większego znaczenia (tylko mniejsze):)
Ale dzięki temu tematowi chyba rozpracowaliśmy temat bandgap i już nie będzie wątpliwości.

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 21:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

O raju ale super Bug :O

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 22:17 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

gordon10 napisał(a):
przed MUX3 zabrakło jednego znaczka "<"

I właśnie dlatego ja wolę niekoszerne makro _BV() ;-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 cze 2015, o 23:57 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27313
Lokalizacja: Szczecin
Pomógł: 1041

xor napisał(a):
I właśnie dlatego ja wolę niekoszerne makro _BV()

Jak to mówią jeden woli jabłka inny woli gruszki ;)

Ja ZDECYDOWANIE wolę normalne operatory przesunięć ;) bo od nich i tak się nie ucieknie podczas programowania, zamiast kociego _bv .... No ale ... co tu dużo mówić - jak ktoś już programuje "nie od dziś" to sam wybierze to co lubi. ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2015, o 12:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 293
Lokalizacja: Jaskółowo k. Warszawy
Pomógł: 9

Koledzy bardzo fajnie się rozprawiliście z tym BandGap'em.
Za pozwoleniem kopiuje sobie kodzik.
Na pewno się przyda.

Jak tylko znajdę chwilę podzielę się ciekawym rozwiązaniem z wykorzystaniem wifi Mirka.

_________________
POZDROWIONKA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2015, o 12:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Kopiujcie do woli, wielkiej filozofii tu nie ma:)
Przerobienie na inne procki też banalne

Ja pracuje jeszcze nad prezentacją wyniku - żeby wyświetlać to na pasku 8-miu LEDów

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2015, o 18:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

gordon10 napisał(a):
Kopiujcie do woli, wielkiej filozofii tu nie ma:)
Przerobienie na inne procki też banalne

Wielkie dzięki!
Skopiowałem i na ATmedze8 uzyskałem dodatkowy pin do pomiaru napięcia - AREF (od 1,2V do VCC).
Trochę zmieniłem kod ;)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Co Wy na to?
Zainteresowany jestem multipleksowaniem pomiarów(baterii i napięcia na AREF) :mrgreen:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 29 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO