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



Teraz jest 27 lis 2024, o 20:34


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 3 wrz 2020, o 17:38 
Offline
Użytkownik

Dołączył(a): 19 gru 2012
Posty: 712
Lokalizacja: Opole
Pomógł: 23

Witam

Postanawiam przenieść swój kod napisany w Arduino bezpośrednio na C i mam pewnie problem z zastąpieniem funkcji map czyli kalibracji względem dwóch punktów max i min.
W zapisie matematycznym funkcja wygląda następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Postanowiłem ją zaadaptować na swoje potrzeby już w Eclispe ale jakoś z marnym skutkiem, gdyż w wyniku działania funkcji mam cały czas 0.

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


Gdzie może leżeć błąd? Zdaje sobie sprawę że wynikiem takiej funkcji może być liczba po przecinku ale śmiało mogę ją uciąć do pełnych wartości. Dodam ze w tym przykładzie jest to pomiar wilgotności gleby a wartości max i min dobrane są testowo po badaniach w szklance wodzy i wartości w powietrzu gdzie dla obecności w wodzie mamy 360 a w powietrzu 820



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2020, o 19:18 
Offline
Nowy

Dołączył(a): 31 maja 2018
Posty: 17
Pomógł: 1

Wilu88 napisał(a):
wynik_adc - ADC_calibration_min

Tu będzie błąd 0-820 = 64715

Tak samo tu
Wilu88 napisał(a):
ADC_calibration_max - ADC_calibration_min


360-820= 65105

czyli w skrócie

64715*100= (nie wiem dokładnie ile bo zostanie przekroczone kilka kronie uint16_t) w przybliżeniu mi wychodzi 63905

wiec 63905/65105 = 0,98itd... czyli dla uint16_t będzie =0

Jak byś zauważył on korzysta z log 32bit wiec będą ujemne liczby a ty unsigned int 16bit wiec masz tylko dodatnie liczby i jeszcze mniejsza zmienna



Ostatnio edytowano 3 wrz 2020, o 19:29 przez daro0606, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2020, o 19:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Wilu88 napisał(a):
uint16_t ADC_calibration_min = 820;
uint16_t ADC_calibration_max = 360;


może odwrotnie wartości ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2020, o 19:28 
Offline
Użytkownik

Dołączył(a): 19 gru 2012
Posty: 712
Lokalizacja: Opole
Pomógł: 23

Daro69 napisał(a):
Wilu88 napisał(a):
uint16_t ADC_calibration_min = 820;
uint16_t ADC_calibration_max = 360;


może odwrotnie wartości ?


tak to brzmi ale wartości są OK po prostu max jest wtedy gdy jest woda a bez wody jest min i ten czujnik zwraca takie napięcia.

------------------------ [ Dodano po: 4 minutach ]

daro0606 napisał(a):
Wilu88 napisał(a):
wynik_adc - ADC_calibration_min

Tu będzie błąd 0-820 = 64715

Tak samo tu
Wilu88 napisał(a):
ADC_calibration_max - ADC_calibration_min


360-820= 65105

czyli w skrócie

64715*100= (nie wiem dokładnie ile bo zostanie przekroczone kilka kronie uint16_t) w przybliżeniu mi wychodzi 63905

wiec 63905/65105 = 0,98itd... czyli dla uint16_t będzie =0

Jak byś zauważył on korzysta z log 32bit wiec będą ujemne liczby a ty unsigned int 16bit wiec masz tylko dodatnie liczby i jeszcze mniejsza zmienna


Nie wiem czy o to Ci chodziło ale zamiana zmiennej ADC_gleba na int16_t oraz rzutowanie do int16_t nic nie daje dalej mam wynik 0 przy wynik_adc=730



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2020, o 20:31 
Offline
Nowy

Dołączył(a): 31 maja 2018
Posty: 17
Pomógł: 1

Zmień wszystkie typy danych na int32_t to może zrozumiesz...

to wtedy będzie tak przy wynik_adc-730

730-820= -90
-90 *100 = -9000

360-820 = -460

-9000 / -460 = 1 czyli ADC_gleba powinna być 1 chyba że zaokragli do 2


Autor postu otrzymał pochwałę


Ostatnio edytowano 3 wrz 2020, o 20:54 przez daro0606, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 wrz 2020, o 20:38 
Offline
Użytkownik

Dołączył(a): 19 gru 2012
Posty: 712
Lokalizacja: Opole
Pomógł: 23

daro0606 napisał(a):
Zmień wszystkie typy danych na int32_t to może zrozumiesz...


Rozumiem że nie masz na myśli również zmiennych? Bo tam nie widzę sensu zmiany.

Jeszcze teraz patrze czy to nie jest problemem, bo wynik wyrzucam do uartu za pomocą mirkowej funkcji uart_putlong tyle że ona za parametr przyjmuje uint32_t.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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