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

[ATmega32][ASM] Przetwarzanie A/C

arturssp 27 Maj 2008 23:37 2545 10
  • #1 5188959
    arturssp
    Poziom 16  
    Witam!
    Mam następujący problem z przetwarzaniem A/C: mikrokontroler atmega32, przetwornik ustawiony na wewnętrzne źródło napięcia odniesienia 2,56V, pomiar z nóżki ADC1, preskaler 128, wyzwalanie jednokrotne (w trybie uśpienia - rozkaz sleep), wynik przesunięty o 6 bitów (odczytywane najstarsze 8 bitów z ADCH). Program pisany w asemblerze, zasada działania programu taka:

    petla:

    ldi R16, 200
    ldi R17, 2
    rcall czekaj_ms (odczekanie 2x200ms = 400ms)

    sleep (uspienie na czas konwersji ADC)

    mov R16, ADCH (skopiowanie wyniku do R16)

    rcall wysw_lcd (pokazanie wyniku na LCD)

    rjmp petla

    czyli program co 400ms mierzy napiecie i podaje wynik na LCD.
    Problem jest nastepujacy - napięcie mierzone ustawiłem dokładnie na 1V (multimetr na zakresie 2000mV pokazuje dokładnie 1000mV - napięcie jest stałe, nie "pływa"), a na LCD dostaję wyniki: 99, 98, 110, 105, 98, 118, 101... itd. Ciągle "pływają" wyniki konwersji ADC... co z tym fantem zrobić? Chciałbym, aby pomiar był stały, zeby dawał mi powiedzmy zawsze wynik 100 czy jaki kolwiek inny (np 90), ale jesli jest 1V to zeby na LCD byla stala wartość a nie skakanie w przedziale od 98 do 120... Co może być przyczyną? Proszę o poradę..

    Pozdrawiam!

    Artur

    Poprawiłem tytuł:
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [c_p]
  • #3 5189168
    arturssp
    Poziom 16  
    Kondensatory 100nF od AREF i AVCC do masy mam (przylutowane od strony druku bezposrednio do podstawki procesora), przewód od wejścia do mierzonego napięcia mam ok 25cm (niestety nie mam możliwości skrócenia - musi być te 25cm). Na zasilaniu procesora (końcówka VCC) też mam kondensator 100nF do masy (lutowany do podstawki), a zasilanie zrobione na 7805 z kondensatorem 1000uF+100nF po stronie 5V i 1000uF+100nF po stronie wejścia. 7805 zasilam z zasilacza laboratoryjnego napięciem 12V. Niestety pomimo tych kondensatorów problem nadal występuje.
  • #5 5189371
    kamyczek
    Poziom 38  
    Zapnij oscyloskop na to co mierzysz i zeknij sobie to samo zrób z VCC i AVCC i VREF ewentualnie zmien dzielnik i zrób wolniejszy pomiar. Pewnie masz jakieś szpilki na tym co mierzysz i tyle.
  • #6 5189612
    fantom
    Poziom 31  
    A ja bym bardziej stawial na niestabilnosc temperaturowa wewnetrznego zrodla napiecia odniesienia. Struktura krzemu nagrzewa sie podczas pracy procesora i jesli zrodlo napiecia odniesienia nie jest dobrze skompensowane temperaturowo to napiecie odniesienia bedzie plywac a co za tym idzie wynik konwersji rowniez. Mozesz spobowac zmierzyc napiecie odniesienia, wedlug dokumentacji pin AREF jest podlaczony bezposrednio do ADC wiec mozna na nim zmierzyc napiecie odniesienia podlaczone do ADC i zobaczyc tam czy sobie nie plywa.
  • #7 5189974
    Balu
    Poziom 38  
    Fantom rzadko używam zew. odniesienia a jednak nigdy mi nic nie pływało bardziej niż o 1, 2 LSB... Nawet bez jakiejś indukcyjnej filtracji:>
    Jak nie stabilne temp. to wygrzać procka trzeba i wtedy mierzyć :D
  • #8 5190817
    ktrot
    Poziom 20  
    Jaki masz zegar uC? Jeżeli CLK<8Mhz to preskaler 128 jest za duży. Czas konwersji powinien być w przedziale 65-260uS. Czy ten czas 400ms dobrze zaprogramowałeś? Jeżeli i tak czekasz 400ms to może rób w tym czasie pomiary? Na przykład 256 pomiarów:

    clr r0
    clr r1
    petla256razy:
    sleep
    r16 <-ADCH
    add r1,r16
    clr r16
    adc r0,r16
    call czekaj
    koniec petli

    w r0 mamy średnią z 256 pomiarów.
    Ogólnie można zrobić 2^n pomiarów i póżniej odpowiednio przesunąć rejestry.
  • #9 5191466
    arturssp
    Poziom 16  
    Witam!
    Masa cyfrowa i analogowa nie sa rozdzielone - nie bardzo wiem jak to zrobic. Na napieciu mierzonym nie mam szpilek ani innych zakłóceń - sprawdziłem oscyloskopem, to samo tyczy się AVCC, VCC i AREF. Co do zegara - mam zewnętrzny kwarc 16MHz, więc podział 128 wydaje mi się poprawny. Spróbuję jeszcze z tym uśrednianiem, napiszę co i jak. Dziękuję za zainteresowanie tematem.

    Pozdrawiam.
  • #10 5192734
    szymtro
    Poziom 30  
    "mov R16, ADCH" czy to się skompiluje? bo mam wrażenie że:
    in r16,adcl
    in r16,adch
    rozwiąze problem.

    Czy czasem M32 nie ma tego samego z przerwaniami adc i sleep co M8?
    Ma ale nie używasz przecież przerwania adc.
  • #11 5194173
    arturssp
    Poziom 16  
    Witam!
    oczywiście mam w kodzie in r16, adch, wczesniej napisalem mov, ale to tylko jako zasada, ze jest kopiowanie do r16 wartosci z adch. Problem "pływających" wyników rozwiązany - ekranowanie przewodu pomiarowego i przewodów z czujników pomogło. Dziękuję wszystkim za odpowiedzi!
    Pozdrawiam serdecznie.

    Artur

    Temat zamykam.
REKLAMA