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



Teraz jest 12 maja 2026, o 20:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 19 cze 2016, o 12:48 
Offline
Nowy

Dołączył(a): 23 maja 2016
Posty: 8
Pomógł: 0

Witam!

Wykonuje pomiar temperatury przy pomocy Atmega32, zewnętrznego przetwornika ADC MCP3424 i PT100.

RTD obliczam poprzez pomiar z ADC spadku napięcia na RTD oraz rezystorze wzorcowym. Do tego momentu nie mam problemów, wyświetlam obliczone RTD, porównuję z tabelą temp, zgadza się.
Chciałbym jednak przeliczyć RTD na temperaturę, korzystając z polskiej normy PN-EN 60751 prezentuje się to wzorem zależności od RTD:

Obrazek

gdzie
A = 3,9083×10-3
B = -5,7750×10-7

I tu moje pytanie, nie zależy mi na ograniczaniu pamięci, mogę wykorzystać float, jednak nawet on nie "pomieści" współczynnika B, jest jakiś sposób aby to "obejść" czy pozostaje mi jedynie aproksymacja?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2016, o 16:14 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

Jest na to sposób. Zwiększa się programowo rozdzielczość zmiennej poprzez jej powiększenie przez pomnożenie przez odpowiednią liczbę. Przykładowo mamy liczbę 1,2345 pomnożyć przez 2,3456. Wtedy tworzy się zmienną uint16_t, która może pomieścić 2^16 cyfr, czyli zakres od 0 do 65535. Mnożę 1,2345*10000 i tak samo drugą liczbę. Następnie wykonuję mnożenie dwóch liczb, której wynik jest wpisywany do zmiennej również o odpowiedniej wielkości, aby nie obciął liczb najmniej znaczących. Po pomnożeniu dzielimy wynik przez 10^8 i wyciąga się część całkowitą, a następnie wykonuje się operację modulo % 10^8 i wyciąga się resztę z dzielenia, czyli liczbę dziesiętną. Te dwie liczby można zapisać w osobnych zmiennych, albo tablicach i odpowiednio wyświetlać później.

Analogicznie w Twoim przypadku zapisać liczby przykładowo w postaci A = 39083 e-7 oraz B = - 57750 e - 11. Następnie nie pomniejszać tych liczb przez e-x, czyli tak na prawdę jedną mnożysz * e7, a drugą razy e11. Następnie trzeba zastanowić się jaka jest kolejność wykonywanych operacji matematycznych i wykonać je w poszczególnych krokach dopierając odpowiednio zakresy zmiennych ze strony 75 z BlueBooka. Na końcu po uzyskaniu wyniku tak jak pisałem dzieląc liczbę przez e7 + e11 czyli e 19 uzyskasz wartości całkowite, a operacją modulo częsci dziesiętne. Jak widzisz myk polega na tym, ze całości i dziesiątki są rozdzielone w dwóch zmiennych zachowując ich całkowitą pracyzję, a wyświetlając wynik łączysz je po prostu "graficznie".

Wszystko zależy od tego co chcesz potem robić z tą liczbą.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2016, o 16:38 
Offline
Użytkownik
Avatar użytkownika

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

witam,
podobnie do podpowiedzi kolegi.
przyszło mi do głowy że można spróbować ominąć problem przekształcaniem wzoru, i podstawianiem wartości wstępnie (do obliczeń) z przesunięciem *10 do 9-tej.
coś w tym kierunku.

rozłożyć wzór na dwie części, (-A/2B) + ( pierwiastek z ...... / 2B)

A=3,9083x10-3
B=-5,775x10-7

AA= A * 10^9 = 3908300
BB= B * 10^9 = 577,5

(-A/2B) = - AA/2*BB

i tylko zwrócić uwagę na przesunięcie przecinka przy obliczaniu pierwiastka, i skorygować.

pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2016, o 17:44 
Offline
Nowy

Dołączył(a): 23 maja 2016
Posty: 8
Pomógł: 0

Pierwsza część tj (-A/2B) jest zrozumiała, ale jak rozbić tę część z pierwiastkiem? Zmienna Rt jest oczywiście typu float.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2016, o 18:54 
Offline
Użytkownik
Avatar użytkownika

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

kurczaki...
wysoka precyzja.
zamysł taki: nie wiem czy poprawny :!: :?:

po obliczeniu pierwszej części wzoru = 3383,809524.
dodać drugą licząc maże jakoś tak:

A_do_obliczeń = A * 100000 /*będzie zawyżone *10 do 5 */
B_do_obliczeń = B * 100000 /*będzie zawyżone * 10 do 5 */

we wzorze licząc kwadrat, będzie wynik zawyżony *10 do 10
dlatego A_do.... + ( 4B(.....) * 100000) żeby też zawyżyć z *10 do 5, na *10 do 10,
wyciągnięty pierwiastek z sumy, będzie zawyżony już tylko *10 do 5,trzeba go podzielić przez zawyżone 2*B_do_obliczen, i teraz wyrównamy, dzieląc / 100000.

wynik dodać do pierwszego.

hmm.. czy to zda egzamin :?:

------------------------ [ Dodano po: 15 minutach ]

a może jeszcze zawyżać, żeby nie zgubić cyfr po przecinku- jest tylko 6 znaków precyzji :idea:



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

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

Witam,
Tak sobie jeszcze pokombinowałem, może naprowadzi na sposób.
patrząc na wzór...

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

tak to jakoś widzę.
pozdrawiam.



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 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