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



Teraz jest 7 kwi 2026, o 07:00


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 28 sie 2014, o 23:26 
Offline
Nowy

Dołączył(a): 16 cze 2014
Posty: 21
Lokalizacja: Wrocław
Pomógł: 3

Witam, próbuję zrobić woltomierz z zakresu ok. 2-30V. Zastosowałem dzielnik napięcia (współczynnik 31), lecz nie mogę wyliczyć napięcia z pomiaru ADC. Wartość ADC zmienia się prawidłowo, np. przy 12V wynosi ok. 370, przy 6V ok. 182. Obliczając napięcie mnożę przez 11 (1,1V napięcie odniesienia) później przez 31 (współczynnik dzielnika napięć) oraz dziele wszystko przez 1024. Do napięcia 6V liczy nawet ok, trochę zaniża, lecz to pewnie niedokładność dzielnika. Gdy podam napięcie np. 7,5V to wyświetla się już 0,6V :/ W czym problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2014, o 23:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Witam kolege :)
Problem jest w tym że jest w AVR GCC coś takiego co się zwie promocja do typu int i dlatego liczby sa niejako obcinane stąd ten problem. aby sie tego pozbyć w swoich działaniach w jednym z wyrazów składowych tych działań może kolega dodac sobie UL czyli rzutowanie na unsignet long czyli typ 32 bit-owy np.
200 * 11 * 31 / 1024UL

i powinno być OK. Oczywiście wystarczy , że jedno z czesści składowych wyrazenia będzie miało typ np uint32_t i juz będzie po problemie

więcej informacj moż kolega doczytać tutajhttp://atnel.pl/domyslna-promocja-do-typu-int.html

Pozdrawiam.



Ostatnio edytowano 28 sie 2014, o 23:49 przez rajmund96, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sie 2014, o 23:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Zapewne ograniczony typ zmiennej, w której jest przechowywany wynik, do 2 bajtów. Spróbuj zwiększyć zakres typu zmiennej np. uint32_t.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 05:02 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

Pokaż kod bo tak to można gdybać.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 15:48 
Offline
Nowy

Dołączył(a): 16 cze 2014
Posty: 21
Lokalizacja: Wrocław
Pomógł: 3

No właśnie na początku też myślałem, że jest to zbyt mały typ zmiennej, więc spróbowałem 16bitowej, później 32bity i teraz mam 64bity i dalej jest to samo :/
Oto mój kod (to tylko wersja testowa :D):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 20:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

No to opisałem kolegi problemik w komentarzach poniżej :).

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


------------------------ [ Dodano po: 5 minutach ]

Mam nadzieje, ze kolega rozumie w czym bład operator % zwraca resztę z dzielenia :) czyli jeśli
adc = 512 to koledze wyszłoby coś takiego 512 * 341 /1024 = 170
170/10 = 17 V i taki jest prawidłowy winik, a kolega dodał jeszcze % co spowodowało 17 % 10 = 7
Mam nadzieję że pomogłem :)
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 21:18 
Offline
Nowy

Dołączył(a): 16 cze 2014
Posty: 21
Lokalizacja: Wrocław
Pomógł: 3

Hmm, faktycznie to był błąd :D Niestety, po poprawieniu dalej nie pokazujepoprawnego napięcia, podam wartości jakie wyświetlają się dla podanych napięć: 4,5V -> 4.2V, 6,1V -> 5,9V, 7,5V -> 0,5V, 9V -> 2,3V oraz 12V -> 5,7V, przy czym wartość ADC rośnie proporcjonalnie (raczej prawidłowo).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 22:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

Niech kolega spróbuje zamienić tą linijke, ale obstawiam że to guzik da :D problem leży chyba gdzie indziej.

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


na coś takiego

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


oczywiście wczesniej musi kolega zdefiniować zmienną uint32_t wynik;

------------------------ [ Dodano po: 1 minucie ]

aa no i oczywiście w funkcji wysyfającej lcd_int() też nalezy podstawić zmienną wynik a nie liczba :)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 22:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Rzutuj liczby na większy typ. Samo zwiększenie zakresu typu zmiennej "liczba" nic nie da skoro operandy wyrażenia mają niższy zakres typu.

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

Można też od razu podzielić wyrażenie przez 3 co jest w sumie wystarczająco dobrym przybliżeniem pożądanej wartości:

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

Można też zwiększyć zakres typu zwracanego przez funkcję "pomiar", abo przepisać wartość do tej samej zmiennej:

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

Sposobów jest jeszcze całe mnóstwo...


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2014, o 22:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 gru 2013
Posty: 185
Pomógł: 6

aa dobra mam sam wcześniej pisałem o domyslnej promocji do int i teraz sie na tym wyłorzyłem hehe :) ten kod który teraz koledze poleciłem zmienić powinien juz prawidłowo działac, ale wystarczy też dodać w jednej ze składowych zresztą jak juz wcześniej pisałem UL

------------------------ [ Dodano po: kilkunastu sekundach ]

No i mnie kolega uniegł :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 sie 2014, o 15:07 
Offline
Nowy

Dołączył(a): 16 cze 2014
Posty: 21
Lokalizacja: Wrocław
Pomógł: 3

Wielkie dzięki, już napięcie wyświetla się prawidłowo, teraz tylko popracuje nad dzielnikiem by zwiększyć dokładność :D Jeszcze raz dzięki :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 wrz 2014, o 10:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2013
Posty: 77
Pomógł: 6

Dzielnik jak dzielnik skalibruj pomiar. Np. Tak w obwód wepnij miernik i co 0,5V odczytuj wartość ADC i miernika. Następnie wykres X(ADC) Y(napiecie), wyznacz linie trendu najlepiej odwzorcowującą i obliczaj napięcie z równania linii trendu.



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: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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