Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega32][ASM] Przetwarzanie A/C

arturssp 27 Maj 2008 23:37 2263 10
  • #1 27 Maj 2008 23:37
    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]

    0 10
  • Arrow Multisolution Day
  • Arrow Multisolution Day
  • #3 28 Maj 2008 01:03
    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.

    0
  • #4 28 Maj 2008 01:20
    Balu
    Poziom 38  

    A dławik jest?
    A masa pod prockiem jest?
    A rozdzielona masa analogowa i cyfrowa jest?

    0
  • #5 28 Maj 2008 08:17
    kamyczek
    Poziom 34  

    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.

    0
  • #6 28 Maj 2008 10:15
    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.

    0
  • #7 28 Maj 2008 12:22
    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

    0
  • #8 28 Maj 2008 16:22
    ktrot
    Poziom 19  

    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.

    0
  • #9 28 Maj 2008 19:24
    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.

    0
  • #10 28 Maj 2008 23:39
    szymtro
    Poziom 30  

    "mov R16, ADCH" czy to się skompiluje? bo mam wrażenie że:

    Code:
    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.

    0
  • #11 29 Maj 2008 15:08
    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.

    0