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

[AVR][ASM][TINY45]Czujnik temperatury

n01x 16 Sie 2008 15:44 2329 14
REKLAMA
  • #1 5444277
    n01x
    Poziom 12  
    Witam,


    Ma ktoś jakieś doświadczenia z sensorem temperatury w attiny45?
    Konkretnie porzeuje to skalibrować według tego:

    To be capable of achieving
    more accurate results the temperature measurement can be calibrated in the application software.
    The sofware calibration can be done using the formula:

    T = k * [(ADCH << 8 ) | ADCL] + TOS

    where ADCH and ADCL are the ADC data registers, k is the fixed slope coefficient and TOS is the
    temperature sensor offset. Typically, k is very close to 1.0 and in single-point calibration the
    coefficient may be omitted. Where higher accuracy is required the slope coefficient should be
    evaluated based on measurements at two temperatures.

    Pisze w assemblerze. Ma ktos jakiś pomysł?
  • REKLAMA
  • #2 5445565
    n01x
    Poziom 12  
    Nikt nie pomoże przełożyć tego na asm?

    Albo chociaż jak mam to rozumieć [(ADCH << 8 ) | ADCL] ?
  • REKLAMA
  • Pomocny post
    #3 5445833
    Pituś Bajtuś
    Poziom 28  
    n01x napisał:
    Albo chociaż jak mam to rozumieć [(ADCH << 8 ) | ADCL] ?

    ADCH przesunięte w lewo o 8 bitów i zsumowane logicznie z ADCL. A po polsku to dwa bajty skleić w słowo 16-bitowe ;)
  • #4 5446182
    n01x
    Poziom 12  
    Pituś Bajtuś napisał:
    n01x napisał:
    Albo chociaż jak mam to rozumieć [(ADCH << 8 ) | ADCL] ?

    ADCH przesunięte w lewo o 8 bitów i zsumowane logicznie z ADCL. A po polsku to dwa bajty skleić w słowo 16-bitowe ;)



    Czyli pomożyć przez 256 i dodać (or) do adcl tak? Tylko czemu to ma byc na 16 bitach?
  • #5 5447325
    crazy_phisic
    VIP Zasłużony dla elektroda
    Pewnie dlatego że przetwornik jest 10 bitowy i potrzebuje 2 bajty na wynik pomiaru... dokumentacja się kłania.
  • REKLAMA
  • #6 5448324
    n01x
    Poziom 12  
    crazy_phisic napisał:
    Pewnie dlatego że przetwornik jest 10 bitowy i potrzebuje 2 bajty na wynik pomiaru... dokumentacja się kłania.




    Dobra. Mój błąd. Ale czy jak przesune to o 8 w lewo to czy nie będzie tam 0?
    Prosze o kawałek kodu z dodawaniem dwóch 8 bitowych z wynikiem 16 bitowym.
    A to przesuwanie to np.: lsl r16 (powtórzyć 8 razy)?

    Pozdrawiam
    n01x




    Nie radze sobie z tą arytmetyką w ASM., mógłby mi to ktos wytłumaczyć jakoś?
    Temperatura nie przekroczy 255 stopni wiec teoretycznie (w/g mnie) moze to być na 8 bitach tak?
  • Pomocny post
    #7 5449527
    Lysoleq
    Poziom 17  
    Cytat:
    Prosze o kawałek kodu z dodawaniem dwóch 8 bitowych z wynikiem 16 bitowym.


    Przykładowy kod:

    
    in 	r17,ADCH
    clr 	r16
    PETLA_PRZESUN_LEWO:
    lsl 	r17
    inc 	r16
    cpi 	r16,8
    brne PETLA_PRZESUN_LEWO
    in 	r16,ADCL
    movw 	XH:XL,r17:r16
    


    Po tej operacji poprawny wynik jest w rejestrach XL i XH.

    Cytat:
    Temperatura nie przekroczy 255 stopni wiec teoretycznie (w/g mnie) moze to być na 8 bitach tak?

    Nie wiem jak dokładnie liczy ten przetwornik na którym pracujesz, ale teoretycznie nie :). A co jeżeli przetwornik zlicza co 0,5C? Wtedy 127C jest zapisane jako wartość 254. Po drugie, pewny jesteś że 0C odpowiada wartość 0?
  • REKLAMA
  • #8 5449723
    n01x
    Poziom 12  
    Lysoleq napisał:

    Po drugie, pewny jesteś że 0C odpowiada wartość 0?



    Mówisz o przesunięciu w lewo o 8?
    00000001 co będzie jak to przesuniesz o 8 w lewo?
  • Pomocny post
    #9 5449777
    marek_Łódź
    Poziom 36  
    Niechęć do czytania dokumentacji jest powszechna i z pewnością się przekłada na uzyskane wyniki lub ich brak

    [AVR][ASM][TINY45]Czujnik temperatury

    Czyli trzeba

    1. Odczytać wartość z przetwornika ("w zasadzie" jest to wynik w Kelwinach)
    2. Odjąć ofset wynikający z kalibracji (w pierwszym podejściu jakieś 273-275)
    3. Przemnożyć przez nachylenie (w pierwszym podejściu można se darować)

    Uzyskamy wynik w stopniach Celsjusza


    Lysoleq napisał:

    in r17,ADCH
    clr r16
    PETLA_PRZESUN_LEWO:
    lsl r17
    inc r16
    cpi r16,8
    brne PETLA_PRZESUN_LEWO
    in r16,ADCL
    movw XH:XL,r17:r16


    Ten numer nie przejdzie. Wysunięcie bajtu 8xinstrukcją lsl da zawsze w wyniku zero. Jeśli już to trzeba ADCH załadować do starszego bajtu z pary, a ADCL do młodszego.

    A tak naprawdę to wystarczy od ADCL odjąć ok 20 a ADCH pominąć milczeniem i już

    255 stopni Celsjusza to fikcja, bo zakres temperatur pracy zamyka się na 80°C

    DOKUMENTACJA :!: a dopiero potem pytać na forum
  • #10 5449794
    n01x
    Poziom 12  
    marek_Łódź napisał:
    Niechęć do czytania dokumentacji jest powszechna i z pewnością się przekłada na uzyskane wyniki lub ich brak

    [AVR][ASM][TINY45]Czujnik temperatury

    Czyli trzeba

    1. Odczytać wartość z przetwornika ("w zasadzie" jest to wynik w Kelwinach)

    2. Odjąć ofset wynikający z kalibracji (w pierwszym podejściu jakieś 273-275)

    3. Przemnożyć przez nachylenie (w pierwszym podejściu można se darować)

    Uzyskamy wynik w stopniach Celsjusza

    255 stopni Celsjusza to fikcja, bo zakres temperatur pracy zamyka się na 80°C

    DOKUMENTACJA :!: a dopiero potem pytać na forum



    Czytałem dokumentacje (nawet wkleiłem jej fragment w pierwszym poscie). Mój problem jest zupełnie inny chodziło bardziej o wyliczenie wyniku.

    Gdzie wyczytałeś jaka jest wartość offsetu?
  • Pomocny post
    #11 5449854
    marek_Łódź
    Poziom 36  
    n01x napisał:
    Gdzie wyczytałeś jaka jest wartość offsetu?
    Stoi jak byk w tabelce. k=1, T dla 25 C wynik ok 300
    czyli odczyt ADC to temperatura w około Kelwinach

    Po odjęciu 20 od młodszego bajtu wyniku mamy stopnie Celsjusza. Wszystko
    Ewentualnie korekta ofsetu przez kalibracje na jeden punkt. Kalibracja dwupunktowa raczej nie ma sensu, bo przeliczanie sie komplikuje a dokładność wyniku i tak się wiele nie poprawi.
  • #12 5449866
    n01x
    Poziom 12  
    marek_Łódź napisał:
    n01x napisał:
    Gdzie wyczytałeś jaka jest wartość offsetu?
    Stoi jak byk w tabelce. k=1, T dla 25 C wynik ok 300
    czyli odczyt ADC to temperatura w ok. Kelwinach

    Po odjęciu 20 od młodszego bajtu wyniku mamy stopnie Celsjusza. Wszystko
    Ewentualnie korekta ofsetu przez kalibracje na jeden punkt. Kalibracja dwupunktowa raczej nie ma sensu, bo przeliczanie sie komplikuje a dokładność wyniku i tak się wiele nie poprawi.


    Widzisz, czytać nie wystarczy, trzeba jeszcze rozumieć.
    Dzieki.
  • #13 5449908
    marek_Łódź
    Poziom 36  
    Skoro ten problem (chyba) za nami, napiszę jeszcze, że można by próbować zwiększyć dokładność stosując oversampling, co zdecydowanie skomplikuje cały proces przeliczeń (trzeba by przejść na zmienny przecinek lub rozbudować obliczenia stałoprzecinkowe np na 4 bajty),
  • #14 5449917
    n01x
    Poziom 12  
    marek_Łódź napisał:
    Skoro ten problem (chyba) za nami, napiszę jeszcze, że można by próbować zwiększyć dokładność stosując oversampling, co zdecydowanie skomplikuje cały proces przeliczeń (trzeba by przejść na zmienny przecinek lub rozbudować obliczenia stałoprzecinkowe np na 4 bajty),


    Narazie spróbuje napisać kod bez komplikacji (chociaż z moją znajomością assemblera na pewno będą).
    Nie wykluczone, że jeszcze się odezwe.


    Pozdrawiam
    n01x

    Dodano po 5 [godziny] 40 [minuty]:

    marek_Łódź napisał:


    Lysoleq napisał:

    in r17,ADCH
    clr r16
    PETLA_PRZESUN_LEWO:
    lsl r17
    inc r16
    cpi r16,8
    brne PETLA_PRZESUN_LEWO
    in r16,ADCL
    movw XH:XL,r17:r16


    Ten numer nie przejdzie. Wysunięcie bajtu 8xinstrukcją lsl da zawsze w wyniku zero. Jeśli już to trzeba ADCH załadować do starszego bajtu z pary, a ADCL do młodszego.

    A tak naprawdę to wystarczy od ADCL odjąć ok 20 a ADCH pominąć milczeniem i już



    No i jak tu sie wzorować na dokumentacji:

    The sofware calibration can be done using the formula:
    T = k * [(ADCH << 8 ) | ADCL] + TOS


    Reasumując:
    załadować do r16 młodszy bajt i odjąć: subi r16,0x14 ?
  • #15 5451755
    marek_Łódź
    Poziom 36  
    n01x napisał:
    No i jak tu sie wzorować na dokumentacji:

    The sofware calibration can be done using the formula:
    T = k * [(ADCH << 8 ) | ADCL] + TOS



    Jak najbardziej można się wzorować, tyle że ten wzór operuje zmienną integer (powiedzmy 16-bitową). W takim przypadku bajt ADCH wysunięty o osiem bitów w lewo daje starszy bajt liczby. W asemblerze wystarczy wpisać odczyt starszego bajtu przetwornika do starszego bajtu wyniku.

    Inaczej jest, gdy spróbujemy ten wzór zaimplementować na zmiennych bajtowych, co widać w cytowanym kodzie. Jeśli zaczniemy obracać starszy bajt wyniku w rejestrze 8-bitowym otrzymamy bzdurę, która "zorowana" z młodszym bajtem wyniku da nam kolejną bzdurę.

    Reszta wynika z analizy przytoczonego fragmentu dokumentacji.

    1. W pierwszym przybliżeniu mamy nachylenie przetwornika równe 1LSB/stopień, co oznacza uzyskanie wyniku w stopniach po odjęciu ofsetu. Jeśli pominiemy sobie starszy bajt, mamy (300LSB=25 °C) czyli po pominięciu jedynki w ADCH daje nam 300-256=44 jednostki (LSB). Żeby z tego otrzymać wymaganą temperaturę musimy odjąć coś koło 20 (powiedzmy 19=13H).

    2.Jeśli chcielibyśmy się odnieść do konkretnego egzemplarza procesora, możemy ten ofset wyznaczyć eksperymentalnie w procesie kalibracji jednopunktowej - ustalamy temperaturę czujnika i z odczytu wyliczamy ile należy odjąć.

    Temperatura odczytana wynosi ADCL minus wyznaczony ofset (np.19). W związku z tym, że k nie jest dokładnie jednością, im dalej od punktu kalibracji, tym większy będzie błąd wyliczenia.. Niestety dalej jak napisaliśmy obliczenia się komplikują.

    3. Uwzględniając dane z tabeli widzimy, że k nie jest dokładnie jednością i co więcej całe przetwarzanie nie jest w pełni liniowe. Możemy sobie zatem wprowadzić korektę k i przeliczać wszystko na długich liczbach stałoprzecinkowych lub na zmiennoprzecinkowych

    4. Dla urealnienia sytuacji należałoby przeprowadzić kalibrację co najmniej dwupunktową, wyznaczając rzeczywiste wartości ofsetu i współczynnika wzmocnienia k

    5. Innym sposobem jest zdjęcie kilku punktów charakterystyki czujnika i wyznaczenie krzywej, na podstawie której moglibyśmy w miarę dokładnie odwzorować odczyty na temperaturę. Taka tabelka zaszyta w pamięci kodu pozwoliłaby na proste i szybkie (3-4 rozkazach maszynowych) wyznaczenie w miarę dokładnej temperatury. Niestety dla uzyskania 100% pewności, że nie gubimy istotnej części wyniku, należałoby przygotować eksperymentalnie taką tabelę konwersji oddzielnie dla każdego egzemplarza procesora, chociaż nie jest powiedziane, że by się nie pokryły.
    Cytat:

    Reasumując:
    Po odczycie przetwornika załadować do r16 młodszy bajt i odjąć: subi r16,0x14 :!:


    albo 0x13
REKLAMA