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

[ASM][atmega8] Przeliczanie napięcia z ADC

malina555 28 Maj 2011 17:27 3221 5
  • #1 9553298
    malina555
    Poziom 14  
    Witam. Mam problem z programem napisanym w asemblerze (którego niestety nie znam). Mianowicie potrzebuje z niego wyciągnąć w jaki sposób przelicza on napięcia z ADC w tym przypadku na wartość temperatury. Dokładnie chodzi mi o pomiar na ADC0. Jest mi to potrzebne ponieważ chciałbym wzór przeliczania z tego programu wstawić do programu który piszę w Bascomie.

    Z góry dziękuje za pomoc :)
  • #2 9553383
    sweter_007
    Poziom 14  
    Z szacunkiem. Porywasz się z widłami na słońce. Naucz się assemblera a wszystko się wyjaśni. Poza tym radziłbym zostawić bascoma i przerzucić się na C.
    A propo ADC. Ja to robie tak:
    W zmiennej uint16_t odczyt, mam odczyt z ADC. Przyjmując 10bit rozdzielczość i 2.56 Vref.
    Liczę: 2^10=1024; 2.56/1024=0,0025=25*10^(-4)
    Kolejna zmienna: uint32_t wynik=odczyt*25 / 10 i mamy wynik w mV (w szczególe, to przed dzieleniem przez 10 sprawdzić czy ostatnia cyfra jest >4 i dodać 1 jeśli tak)

    Kolejne cyfry do wyświetlenia możemy uzyskać przez rekurencyjne dzielenia modulo i odejmowanie. Pozdr
    [error]nie podzielimy szybko przez 10:)
  • #3 9553425
    malina555
    Poziom 14  
    W bascomie mam to zrobione tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ta wartość ma wskazywać wartość temperatury z czujnika w kobie lutowniczej. Tyle że zmieniam właśnie kolbę na inną i wzmacniacz termopary został wykonany inaczej przez co wartość temperatury teraz się nie zgadza :/ Czyli teraz aby wyliczyć samo napięcie muszę zrobić tak?????:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A tutaj dołączam w języku rosyjskim niestety opis pomiaru tej temperatury:

    Cytat:
    При изменении напряжения на среднем выводе (контролируйте высокоомным вольтметром или мультиметром) от 0 В до 2.5 В должны появиться на верхнем ряду, HG1-HG3, показания, точнее при изменении от 50 мВ до 2.4 В показания должны меняться от 10 до 480, т.е. программная характеристика АЦП 5 мВ/°C


    Z tego co wywnioskowałem z translatora to wynika że 5mV to jeden stopień celsjusza. Dobrze to odczytałem??? W jaki sposób można to wyliczyć teraz???
  • #4 9561093
    asembler
    Poziom 32  
    sweter_007 napisał:

    Dzielenie przez 10 możemy zastąpić przez przesunięcia bitowe w prawo.

    Od kiedy?
    Jak juz koniecznie dzielic przez 10 stosujac przesuniacia 2 prawo to może tak?
    Oczywiscie zakladając wymagana dokładnośc
    X=a/8-a/32+a/128-a/512+............
  • #5 9562399
    sweter_007
    Poziom 14  
    Skorzystanie z rozwinięcia w szereg Taylora jest jednym ze sposobów. Chociaż wydawało mi się, że przybliża się rozwinięciem jakieś bardziej skomplikowane wyrażenia, gdzie stosunek dokładność/czas wykonania będzie korzystny. Assemblera znam z programowania na PC. W AVR używam C, na razie asm nie jest mi potrzebny.
    Z ciekawości zajrzałem do datasheeta atmegi8. Mnożenie jest wykonywane w dwa cykle, czyli jeśli dobrze rozumuję, w przypadku zmiennych 8bitowych bardziej opłaca się po prostu pomnożyć(tam gdzie nie mnożymy przez potęgi 2). Jednak nie znalazłem instrukcji dzielenia. Kolega assembler wie może jaki kod jest generowany? Jakaś pętelka z odejmowaniem?
    Znalazłem: http://www.atmel.com/dyn/resources/prod_documents/doc0936.pdf
    Z różnych postów wynika, że zajmuje to ok. 650 cykli. WOW. Wg. mnie takie rozwinięcie Taylora jednak świetnie by się spisywało przy generowaniu grafiki, szczególnie 3d.
  • #6 9562445
    asembler
    Poziom 32  
    Kolega asembler wie jaki kolega asembler genreuje kod.
    W zaleznosci do zastosowania stosuje kilka metod mający swoje wady i zalety czas/wielkosc kodu/ilość wykorzystywanych rejestów

    Najprostrza jest oczywiscie metoda cyklicznego odejmowania.
    Dokładna metoda która była tu optymalizowana wspólnie na elektrodzie i doszło o ile pamietam do 324 taktów przy dzieleniu 4 bajtowych liczb (mogę sie mylić)
    Przybliżona matoda jak wyżej.
    Dokładna ale nie taka szybka metoda wyliczeń od razu na liczbach BCD co po uwzględninu że potem wynik bedzie wyświetlany w systemie 10 prawie wychodzi na to samo. Procedury napisane w ten sposób aby można było uzyskiwac dowolną dokładnosć (max 128 cyfr
    Gdziekolwiek tylko sie da to staram sie jednak stosowac dzielnie przez 2,4,8 ... a kompilator wylicza resztę i wrzuca jako stałe.
REKLAMA