logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Przeliczenie wartości ADC na stopnie Celsjusza - termometr na bazie uC i 1N4148

seg 22 Mar 2011 22:52 5891 20
  • #1 9310973
    seg
    Poziom 13  
    Witam,

    Mimo poszukiwań w internecie i prób praktycznych nie potrafię napisać programu w Bascom'ie (pisząc wprost: zrozumieć przekształceń i wyliczyć temperatury) do termometru mikroprocesorowego z użyciem diody 4148 w roli czujnika temperatury. Próbowałem już pytać w wątku o laminatorach itd. Mimo przeglądnięcia wielu stron i spędzenia wielu godzin na próbach praktycznych nadal nie potrafię sobie z tym poradzić. Tłumaczono mi, że to ze wzoru na prostą itd. - nic z tego nie rozumiem, gdyż po podstawieniu do wzorów danych otrzymanych w pomiarach wychodzą mi na LCD bzdury typu temperatura -300 "ileśtam" stopni C.

    Poniżej zamieszczam schemat podłączenia czujnika bez wnikania w kwestie rezonatora, zasilania układu, odsprzęgań, stabilizacji itd. Poz względem hardware'u wszystko śmiga. Gorzej z softem.

    Zamieszczając więc moje ogołocone z błędnych przeliczeń wypociny (kod Bascom'a) proszę o dopisanie kilku linijek, które ożywią ten prosty przecież układ. Jeżeli mielibyście chwilę, prosiłbym także o wyjaśnienie dlaczego "tak" ma to wygądać, dlaczego tego typu zmienne, itd. Prosiłbym jednocześnie o odpowiedzi osoby, które są pewne tego co piszą - najlepiej te, które sprawdziły IDENTYCZNY układ w praktyce. Mam już dość kosmicznych wyników na wyświetlaczu. Jeżeli jest to dla Was banał - bardzo proszę o pomoc.

    Z tego co mogę powiedzieć na obecną chwilę, to wiem, że złącze p-n na ujemną chatakterystykę temperaturową -2.2mV/st. C, i na wyświetlaczu LCD mam wynik "działek" ADC z pinu PC0 oscylujący wokół 289 (przy wewn. Vref - "Internal"). i temperaturze otoczenia (pomieszczenia) około 26'C.

    Chcę dodać, że interesuje mnie tylko rozwiązanie dotyczące podanego schematu podłączenia czujnika i języka Bascom. Proszę więc o ograniczenie się do wskazówek, bez zagłębiania się w aj-si-elki, opampy, termopary, dallasy i czujniki LMXX, język C itd. - będę baaardzo wdzięczny

    Pozdrawiam!

    Oto "mój kod", yhh, ale wstyd

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #2 9311497
    arktik1
    Poziom 27  
    Poczytaj w HELPie BASCOMa o konfiguracji i wyświetlaniu danych z ADC.
    Na elektrodzie jest mnóstwo przykładów, patrz np."Woltomierz".
    Poza tym odczyt temperatury diodą to raczej wątpliwa forma dokładności temperatury.
  • #3 9311710
    bolek
    Poziom 35  
    Wątpliwa to może nie, ale nie obejdzie się bez dodatkowego osprzętu przy diodzie. Do tego wypadało by się zastanowić jak bardzo musi się zmieć temperatura, aby wykrył to ADC...
  • #4 9312014
    seg
    Poziom 13  
    Panowie proszę o skupienie się na temacie. Proszę o nie zagłębianie się w dokładność takiego urządzenia itd. To ma działać i tyle. Będzie skakało co 2 stopnie i tyle mi wystarczy. Wiem jak zrobić woltomierz i jak przeliczyć działki ADC na napięcie. W tym nie ma nic enigmatycznego. Zbudowanie woltomierza nie stanowi dla mnie najmniejszego problemu. Nie o tym jednak pisałem. Co z tego, że przeliczę wartość ADC na napięcie? Wyjdzie mi z tego ~1,42V przy Vref = 5V i 10 bitowym ADC (lub 0,72V przy Vref = 2,56) i co z tym dalej robić? Nie tędy droga. To odnośnie pierwszej odpowiedzi.

    Jeżei chodzi o drugą odpowiedź - zapewniam, że taki układ wystarczy, bez wzmacniania i dopasowywania.

    =>Przykład w C<=
  • #5 9313102
    arktik1
    Poziom 27  
    "Wiem jak zrobić woltomierz i jak przeliczyć działki ADC na napięcie. W tym nie ma nic enigmatycznego. Zbudowanie woltomierza nie stanowi dla mnie najmniejszego problemu. Nie o tym jednak pisałem. Co z tego, że przeliczę wartość ADC na napięcie? Wyjdzie mi z tego ~1,42V przy Vref = 5V i 10 bitowym ADC (lub 0,72V przy Vref = 2,56) i co z tym dalej robić? Nie tędy droga."
    Skoro wiesz jak zrobić woltomierz to zrób termometr.
    Jak myślisz do czego jest ADC w UC?
  • #6 9313264
    piotrva
    VIP Zasłużony dla elektroda
    cóż, ja jedynie rozumiem, ze kolega raczej pyta o to jak konkretne napięcie przeliczyć na temperaturę, czyli inaczej jakim wzorem można wyrazić zmianę parametrów diody w funkcji temperatury.
    Co do tak szczegółowych zagadnień osobiście wiedzy nie posiadam, ale czy nie myślał kolega o najprostszym ręcznym badaniu takiej funkcji?
    Ja bym to zrobił tak:
    1. dioda do koszulki termokurczliwej
    2. kubek z gorącą wodą (100 st. C)
    3. dioda do kubka, obok termometr mierzący temp do 100 st.
    4. i czekamy cierpliwie aż woda ostygnie i co np. 1 st. na termometrze wzorcowym zapisujemy napięcie/wynik pomiaru z ADC.
    5. potem możesz dorzucić parę kostek lodu, żeby zejść do ok. 0 st. C
  • #7 9313513
    seg
    Poziom 13  
    Myślałem, że podejście do "problemu" na tym forum poprawiło się nieco przez lata..

    :arrow: arktik1

    Co Twój post wnosi do tematu? Czy nie wynika z opisu probemu, że wiem do czego służy przetwornik A/D?

    :arrow: piotrva

    Tak, potrzebuję wzoru. Nie jest to prosta zależność jak np. w czujniku LM35 gdzie mamy bodajże 10mV/st. C W tym przypadku mam około -2,2mV/st. C i nie rozumiem jak z tego wyliczyć temperaturę.

    Czy ktoś może zwyczajnie napisać tych 5 linijek kodu? Ktoś, kto sprawdził TAKI układ w praktyce. Proszę o powstrzymanie się od pisania nie na temat.
  • #8 9315311
    Bembniarz
    Poziom 2  
    Witam

    Nie jestem ekspertem w tym temacie, ale przy okazji pisania pracy dyplomowej zetknąłem się z problemem.
    Moim zdaniem możesz zrealizować to w następujący sposób:

    1. Musisz określić spadek napięcia na diodzie w określonej temperaturze
    (proponuję umieścić diodę w mieszaninie wody z lodem i odczytać wartość na wyjściu ADC)
    2. Masz teraz już dwie dane potrzebne do obliczenia mierzonej temperatury
    (napięcie w temperaturze odniesienia i temperaturowy współczynnik zmian tego napięcia
    owe około -2mV/K - jak podają różne mądre książki)
    3. Teraz należy tak zadziałać z naszymi danymi, aby uzyskać, najlepiej wprostproporcjonalną, charakterystykę.

    Tych paru linijek kodu Ci niestety nie podam bo dopiero co zaczynam się uczyć programowania uC. Mogę Ci jednak dać przepis matematyczny jak to napisać.

    Jeżeli za temperaturę odniesienia przyjmiesz 0°C to od wartości odczytanej dla temperatury odniesienia odejmujesz wartość odczytaną dla temperatury mierzonej a wartość wyniku przeliczasz na stopnie Celsjusza ze współczynnikiem dodatmim (2mV/K)

    np.: jeżeli ustawisz napięcie odniesienia tak że LSB=2mV wtedy otrzymany wynik będzie równy temperaturze w °C.
    jeżeli LSB=1mV to temperatura mierzona Tm=wynik/2 [°C]
    jeżeli LSB=xmV to temperatura mierzona Tm=wynik*(x/2) [°C]
    To są założenia przy temperaturze odniesienia 0 °C
    Przy innej temperaturze odniesienia do obliczonego Tm musisz dodać wartość temperatury odniesienia
    PS.
    Musisz też pamiętać o kalibracji układu przy każdorazowej wymianie diody bo spadek napięcia na na różnych egzemplarzach diody, nawet w obrębie tej samej serii może się różnić na tyle dużo że będzie wprowadzało znaczący błąd do pomiaru.
  • #9 9315373
    Dr. Kuj
    Poziom 13  
    Kiedyś mój znajomy zrobił termometr na tej diodzie i atmedze. Precyzja pomiaru jest bardzo wysoka.
    Przeliczenie adc na temperature to żaden problem. Przecież wszystko można zrobić programowo.
  • #10 9315390
    seg
    Poziom 13  
    Witam,

    Skoro to żadem problem, to daj propozycję kodu w Bascom'ie..
  • #11 9315401
    Bembniarz
    Poziom 2  
    Jeszcze jedno
    jak chcesz określić dokładnie współczynnik temperaturowy zmian napięcia przewodzenia to po wykonaniu pomiaru dla 0[°C] zagotuj diodę i określ napięcie dla 100[°C]
    następnie V(100)-V(0) podzielić na 100 i masz współczynnik temperaturowej zmiany napięcia przewodzenia diody

    pozdrawiam
  • #12 9315458
    Konto nie istnieje
    Poziom 1  
  • #13 9315824
    piotr5000
    Poziom 21  
    26 st C = 289
    26 st C = 1411 mV
    wsp temp = -2,2 mV / st C
    641 st C = 0 V
    641 / 289 = 2,13 st C / 1 odczyt_ADC

    T -Temperatura

    T = odczyt_AdC * 2,13
    T = 641 - T

    dla twojego przykładu:

    T =289 * 2,13 ( T = 615,57 )
    T = 641-615,57 ( 25,43 - jeśli wystarczy taka dokładność )

    ozdrawiam Piotr
  • #14 9316241
    seg
    Poziom 13  
    Bzdury tu wypisuję, przepraszam:

    Cytat:
    Wyjdzie mi z tego ~1,42V przy Vref = 5V i 10 bitowym ADC (lub 0,72V przy Vref = 2,56) i co z tym dalej robić? Nie tędy droga.


    Jakim prawem napięcie na diodzie miałoby być inne dla różnych Vref ?!

    Sprostowanie:

    :arrow: Dla Vref Internal, czyli ~2.56V wartość ADC wynosi 289 przy 26°C co daje napięcie (2.56 / 1024) * 289 = 722mV

    :arrow: Dla Vref Avcc, czyli 5V wartość ADC wynosi 155 przy 26°C co daje napięcie (5 / 1024) * 155 = 757mV

    Różnica napięć wynika zapewne z faktu iż "Vref Internal" Mega8 często nie ma nic wspólnego z 2.56V (ewentualnie zasilanie /a przez to Avcc/ nie jest równe 5V, jednak z mniejszym prawdopodobieństwem - zastosowałem LM317 i 1% metalizowane rezystory w dzielniku). Nie mam "tu" miernika więc nie sprawdzę na pinie ile ma wewnętrzne Vref.

    Wracając do tematu, u mnie jest tak:

    :arrow: piotr5000

    26°C = 155 (przy Vref = 5V :) )
    26°C = (5 / 1024) * 155 = 757mV
    wsp temp = -2,2 mV / °C
    757mV / 2,2mV daje 344°C = 0V
    344 / 155 = 2,22°C / 1 odczyt_ADC

    T -Temperatura

    T = odczyt_AdC * 2,22
    T = 344 - T

    dla mojego przykładu:

    T =155 * 2,22 ( T = 344,1)
    T = 344 - 344,1 (-0,1°C Kurza twarz!)

    Ja wiem, że ostatnią "matematykę" miałem 13 lat temu, ale nie daję rady z tym..
    Co robię nie tak?

    :idea: Co myślicie o tym? Tu wygląda to niesamowicie prosto!

    =>OPIS<=

    =>KOD<=

    ..zmienna offset (PS dlaczego 116? Skąd to się wzięło?)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    .. i fragment odpowiedzialny za przeliczenia:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ..tak więc rozumiem, że właczony zostaje ADC i PORTA ustawiony jako wejście. Rozumiem, że od ref odejmowana jest wartość ADC (co to jest to ref? skąd to się wzięło? To jest temperatura otoczenia /jej wartość ADC/ czy co?)

    ..póżniej temp zmienna zostaje pomnożona przez 221? Skąd taka liczba? to jest jakaś wielokrotność 2.21mV czyli jakby współczynnika temperaturowego diody?

    ..dalej zmienna temp dzielona jest przez 102? Skąd ta wartość? To dzielnik zastosowany w celu unikania operacji floating point na zmiennej temp?

    ..na koniec jakieś 25 :) czyżby temperatura otoczenia?

    Na filmiku ładnie to śmiga, u mnie nie chciało..
    Proszę o wyjaśnienie jak to działa, bo przykład jest bardzo prosty programowo, ale nie rozumiem skąd pojawiają się wspomniane wyżej liczby w przeliczeniach..
  • Pomocny post
    #15 9316352
    piotr5000
    Poziom 21  
    startowałeś z temp = 26 , czyli
    344+26= 370

    T = odczyt_AdC * 2,22
    T = 370 - T

    dla mojego przykładu:

    T =155 * 2,22 ( T = 344,1)
    T = 370 - 344,1 ( 25,9 °C Kurza twarz!)
  • #16 9316444
    seg
    Poziom 13  
    :arrow: piotr5000

    Wygląda na to, że wszystko śmiga :) Kwestia wykalibrowania i kilku pomiarów, ale to już nie problem.

    Jestem Ci BARDZO WDZIĘCZNY!


    :arrow: Pozostali Forumowicze
    Jeżeli mielibyście chwilę, spójrzcie jeszcze na przykład w C z mojego ostatniego posta.
  • #18 9316601
    seg
    Poziom 13  
    Chciałbym, żebyście w miarę możliwości odpowiedzieli na postawione w moim poście pytania.
  • #19 9319446
    Konto nie istnieje
    Poziom 1  
  • #20 9320202
    seg
    Poziom 13  
    :arrow: e marcus

    Cytat:
    Masz to wszystko wyjaśnione w opisie przykładu


    Cytat:
    więc przyjęto szacunkowo wstępną wartość 'ref = 116', która na samym poczatku programu jest ustalona przez przyciski RD0/RD1 do jakieś optymalnej wartości.


    Angielski to nie problem, rozumiem co tam jest napisane. Problemem jest to, że nie rozumiem przeliczeń.

    Cytat:
    (...)a resztę wyjaśnia code


    Nie znam C, próbuję wyciągać wnioski z tego co widzę.

    Cytat:
    Pozostałe niejasne (?) wspóczynniki "*221" i "\102" - wykonaj te działania a otrzymasz odpowiedź.


    temp = 116 - 155 [-39]
    temp = -39 * 221 [-8619]
    temp = -8619 / 102 [-84,5]
    temp = 25 + (-84,5) [-59,5]

    temp = -59,5°C :!:

    Nic z tego nie rozumiem.
  • #21 9327348
    Konto nie istnieje
    Poziom 1  
REKLAMA