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



Teraz jest 15 kwi 2026, o 09:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 17 mar 2015, o 17:45 
Offline
Użytkownik

Dołączył(a): 11 kwi 2014
Posty: 196
Lokalizacja: Sandomierz
Pomógł: 0

Witam

Mam pewien problem z czujnikiem MS5611, a dokładniej z obliczeniem temperatury. W pętli co 1sek wywołuję funkcję pobierającą dane z czujnika MS5611 i kalkulującą temperaturę. Ma ona postać

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


Gdzie D2 to dane odczytywane z przetwornika ADC sensora a cal_data[] to sześć stałych dla danego czujnika odczytanych z układu służące do obliczenia temperatury.

Po pierwszym wywołaniu funkcji otrzymuję prawidłową temperaturę, ok 20-21 stopni co by się zgadzało z rzeczywistą temperaturą. Ale drugie i każde kolejne wywołanie funkcji zwraca wartość około -167768. Po wielu próbach zwracając zamiast TEMP/100 innych zmiennych funkcji doszedłem do tego że problem leży w linii

TEMP2 = (dT * dT) / (2147483648);

To TEMP2 w drugim i każdym kolejnym wywołaniu funkcji przybiera jakąś dziwną wartość o kilka rzędów większą niż powinna. Deklarując zmienną int32_t TEMP2; przed warunkiem nadałem jej wartość 0 (int32_t TEMP2 = 0;) niestety ale w tym przypadku każde obliczenie w warunku nie powodowało żadnej zmiany wartości TEMP2, wartość ta zawsze wynosiła 0.

Fragment kodu do obliczenia temperatury zaczerpnięty jest z biblioteki do arduino https://github.com/jarzebski/Arduino-MS ... MS5611.cpp

Ma ktoś jakiś sensowny pomysł co się dzieje ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 mar 2015, o 21:11 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

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


PS. volatile jest niepotrzebne


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 mar 2015, o 16:06 
Offline
Użytkownik

Dołączył(a): 11 kwi 2014
Posty: 196
Lokalizacja: Sandomierz
Pomógł: 0

Dzięki za cenną sugestię, która okazała się rozwiązaniem problemu.
Sam próbowałem dokonywać jawnego rzutowania, jednak wykonałem to rzutując na tym uint64_t cały iloczyn dT * dT. Nie przyniosło to żądanego skutku.
Z drugiej strony liczyłem że kompilator zadba o właściwe obliczenie wartości zmiennej TEMP2.



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

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