Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Wyznaczanie rezystancji - temperatury na podstawie wartości z tablicy

vp32 12 Mar 2019 08:19 930 20
Automation24.pl
  • #1
    vp32
    Level 11  
    Cześć.
    Prosty układ. Czujnik temperatury - termistor połączony szeregowo z rezystorem. Taki dzielnik napięcia podłączony do ADC uC i napięcie mierzone na termistorze.
    Musze to przeliczyć na temperaturę.
    Mam w tablicy wartości rezystancji i odpowiadającej jej temperaturze.

    Utknąłem jak teraz to ze sobą powiązać?
    Jak mając odczyta z ADC pobrać z tablicy wartość temperatury.
    O ile przełożenie ADC na rezystancję nie będzie chyba kłopotem, bo rezystor w szeregu jest znany więc mogę obliczyć o tyle jak powiązać to z tablicą jeśli wartości rezystancji nie będą identyczną wartością obliczoną?
  • Automation24.pl
  • #2
    BlueDraco
    MCUs specialist
    Zapisz odpowiedni wzór w arkuszu kalkulacyjnym, obejrzyj powstałą w ten sposób tabelę i wymyśl jakąś zwartą postać dla programu, np. zapisz w tablicy wartości ADC odpowiadające kolejnym wartościom temperatury w stopniach i po odczytaniu wartości ADC przeszukaj tę tablicę w dowolny sposób. Najszybciej - wyszukiwanie "binarne", ale przy temperaturze lepiej działa szukanie od ostatniej wartości.

    Pytanie nie ma żadnego związku z mikrokontrolerami, raczej z podstawową matematyką.
  • #3
    Anonymous
    Level 1  
  • #5
    vp32
    Level 11  
    odalladoalla wrote:
    A to przeglądałeś

    Nie, ale to już blisko. Kiedyś na Wikipedii był przykład w C jak na podstawie wartości z tabeli wyznaczyć wartość temperatury dla czujnika PT100. Nie wiem dlaczego ale nie ma już tego algorytmu. Był fajny, bo szybki.

    LChucki wrote:
    Lepiej dać źródło prądowe.

    Racja, ale najpierw muszę rozwiązać problem z zamianą napięcia bądź rezystancji na temperaturę na podstawie wartości z tablicy.

    BlueDraco wrote:
    Pytanie nie ma żadnego związku z mikrokontrolerami, raczej z podstawową matematyką

    Każdy ma prawo uważać co się podoba, wg mnie ma bo szukam algorytmu, a nie wzoru.
  • Automation24.pl
  • #6
    khoam
    Level 42  
    vp32 wrote:
    Był fajny bo szybki.


    Najszybszy to jest taki, który normalizuje wartości rezystancji do przedziału liczb całkowitych (0, X), gdzie X jest rozdzielczością pomiaru (nie mylić z dokładnością)
    Po takiej normalizacji, otrzymasz wektor wartości temperatur, którego indeksy odpowiadają wartościom znormalizowanej rezystancji - brakujące lub dublujące się indeksy wektora musisz "ręcznie" skorygować.
    Tak przygotowany wektor umieszczasz w kodzie programu.
    W samym programie, po odczycie rezystancji , normalizujesz jej wartość (analogicznie, jak przy przygotowywaniu wektora temperatur) i odczytujesz następnie temperaturę bezpośrednio po indeksie wektora.

    Zalety: najszybsza metoda odnajdywania wartości, niezależna od rozdzielczości X plus bonus w postaci mniejszej zajętości w pamięci (tylko wartości temperatur).
    Wady: znormalizowany wektor jest aproksymacją funkcji temperatury od rezystancji, więc pomiar staje się mniej dokładny (zwiększenie wartości X nieco pomaga, ale tylko do pewnego poziomu - poeksperymentuj).

    Nie wiem, czy jest fajny ;)
  • #7
    Anonymous
    Level 1  
  • #8
    krzysiek_krm
    Level 40  
    vp32 wrote:
    termistor połączony szeregowo z rezystorem

    Termistory są generalnie dość nieliniowe więc w ogólnym przypadku powinieneś zastosować jakąś sprzętową linearyzację, chyba że masz przetwornik o jakiejś ogromnej rozdzielczości. Linearyzacja termistorów jest w sumie dość dobrze opisana.
  • #9
    arturt134
    Level 27  
    A może po prostu skorzystaj ze wzoru. Producent termistora zwykle podaje wzór na wyznaczenie temperatury z rezystancji. Fakt, że to zmienny przecinek, mnożenie i logarytm (taki był wzór w datasheet termistora NXP, którego używałem), ale nie bawisz się w żadne tablice. Temperatura jest przebiegiem wolnozmiennym (z definicji), więc mimo poświęcenia dość dużej ilości czasu na obliczenia, możesz ją obliczać rzadziej.
  • #10
    khoam
    Level 42  
    arturt134 wrote:
    Fakt, że to zmienny przecinek, mnożenie i logarytm (taki był wzór w datasheet termistora NXP, którego używałem), ale nie bawisz się w żadne tablice.

    Czy sądzisz, że zastosowanie takiej arytmetyki zmiennopozycyjnej będzie bardziej efektywne niż używanie predefiniowanych tablic?

    vp32 wrote:
    Prosty układ.

    A jaki konkretnie procesor?
  • #11
    arturt134
    Level 27  
    Używanie predefiniowanych tablic wymaga dużego nakładu pracy programisty w celu ich przygotowania, natomiast zużywa mało zasobów CPU do obliczenia wyniku.

    Używanie arytmetyki wymaga małego nakładu pracy programisty, natomiast zużywa więcej zasobów CPU do obliczenia wyniku.

    To, która metoda jest bardziej efektywna w danej sytuacji zależy od aplikacji i dostępnych zasobów.
  • #12
    vp32
    Level 11  
    Niestety muszę skorzystać z tablicy. Prawda, zajmie mi to nieco czasu na przygotowanie, lecz chodzi o to że nie mam żadnych współczynników tego czujnika. Odczytałem sobie logerem temperaturę i wartość odczytaną z ADC więc tablicę zrobię, lecz proszę Was o pomoc jak potem taka tablice odczytywać.
    Trochę poszukąlem przykładów
    Znalazłem coś takiego

    Code: c
    Log in, to see the code
    }


    Czy Ktoś może mi wytłumaczyć po co oni takie coś stworzyli? Po co tu dt?

    I po co tu interpolacja? Skoro mam wartość ADC to jej w tablicy odpowiada jakaś liczba będącą temperaturą, co co tu interpolować?
  • #13
    Anonymous
    Level 1  
  • #14
    vp32
    Level 11  
    Ale ja nie napisałem że szukam czegoś na temat czujnika PT100!
    Ten wklejony kod to miałby przykład jak ktoś na podstawie tabeli próbował wyznaczyć temperaturę.
    Ja próbuję coś na podstawie tego skleić, bo mam już swoją zrobioną.
    mój czujnik nie ma nawet oznaczenia, jego charakterystyka nie przypomina nic co można by wykorzystać. To jakiś chiński czujnik, ale nie moge go wymienić bo ma jakąś dziwną obudowę z gwintem NTP
  • #15
    krzysiek_krm
    Level 40  
    Metodą "łoma i siekiery" możesz stworzyć tablicę, która ma tyle komórek ile poziomów kwantyzacji ma przetwornik AD. Adresujesz tablicę wartością ADC i masz temperaturę. Tyle że tablica będzie duża.
  • #16
    khoam
    Level 42  
    krzysiek_krm wrote:
    Tyle że tablica będzie duża.

    Niekoniecznie, wszystko zależy od tego poziomu "kwantyzacji" - dla "sąsiadujących" wartości z ADC odczyty temperatury mogą być praktycznie takie same.
  • #17
    tmf
    Moderator of Microcontroller designs
    Kurcze już 15 postów, na coś co można ogarnąć jednym zdaniem. W nocie termistora, jest wzór, są podane współczynniki beta, wystarczy sobie w excelu, zrobić prostą tabelkę, a potem copy&paste do programu. Ot cała filozofia. Można też dodatkowym rezystorem lekko zlinearyzować charakterystykę termistora w pożądanym zakresie, co zwiększy nam dla danych temperatur dokładność interpolacji, jeśli chcemy przyoszczędzić miejsca na tabelę z danymi, lub interpolować liniowo pomiędzy punktami w tabeli. A jak mamy procesor z FPU, albo nadmiar mocy i pamięci, to po prostu można odpowiedni wzór wstawić w kod programu i po sprawie. Swoją drogą, ze względu na rozrzut parametrów termistorów może i tak byc potrzebna kolibracja, chociaż akurat przy PT100 niekoniecznie.
  • #18
    Anonymous
    Level 1  
  • #19
    vp32
    Level 11  
    tmf wrote:
    Kurcze już 15 postów, na coś co można ogarnąć jednym zdaniem

    Masz racje 15 postów i większość nie na temat.
    że zacytuje samego siebie:
    Quote:
    Niestety muszę skorzystać z tablicy. Prawda, zajmie mi to nieco czasu na przygotowanie, lecz chodzi o to że nie mam żadnych współczynników tego czujnika.

    Zresztą pisałem że to przykład i tylko po to aby pokazać i zapytać dlaczego w taki dziwny sposób aproksymują.
    Niestety nie wiem jak pobrać coś z tabeli w której ilość rekordów nie odpowiada wartości odczytanej.
    Ja może czytam bez zrozumienia ale z was cześć tez. sorry
  • #20
    khoam
    Level 42  
    vp32 wrote:
    Niestety nie wiem jak pobrać coś z tabeli w której ilość rekordów nie odpowiada wartości odczytanej.
    Ja może czytam bez zrozumienia ale z was cześć tez. sorry

    Przepraszam, ale nie rozumiem, co napisałeś w pierwszym zdaniu. Jak dokładnie jest zdefiniowana ta tabela? Jak zdefiniowany jest ten rekord?
  • #21
    tmf
    Moderator of Microcontroller designs
    vp32 wrote:
    Niestety nie wiem jak pobrać coś z tabeli w której ilość rekordów nie odpowiada wartości odczytanej.

    Prosto. Masz odczytane napięcie z dzielnika. Porównujesz je z kolejnymi napięciami w tabeli, aż dojdziesz do miejsca, w którym na poprzendim indeksie masz wartość mniejszą, a na kolejnym większą. Odczytujesz temperatury skojarzone z oboma indeksami i aproksymujesz. I tyle.