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

[AtMega32] [C] ADC MCP3004 odczyt danych

Domage 11 Lis 2011 22:47 1777 4
  • #1 10128329
    Domage
    Poziom 11  
    Witam
    Mam mały problem z odczytem danych po SPI.A konkretniej konwersją bitów.
    Przetwornik działa, odbiera i wysyła.

    Datasheet MCP3004

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ustawienia SPI:
    SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<SPI2X);

    Przy 12V mam dokładnie 312mV Swoją drogą, może to jest problemem?
    Powinno być 0,6 bo dzielnik mam 1:20. Między sygnałem a masą jest 20 Mohm

    Vref 4,8V
    Na wyświetlaczu przy 12V mam V=0020 a przy takim dzielniku powinno być około 66 bitów.
    i odpwiednio: 5V 0008 , 4,8 0007

    Główny problem zapewne będzie w przesunięciach bitowych przy deklaracji "data"
    próbowałem już z operatorami + oraz |
    zmieniałem CHANEL1 na 0x18,i dodawałem dwie puste transmisje i przesunięcia o odpowiednio <<6, >>2, >>8.
  • Pomocny post
    #2 10128380
    kiziu13
    Poziom 17  
    Zgodnie z rysunkiem 6-1, adc[2] to młodszy bajt, więc nie wiem w jakim celu go przesuwasz. Dodatkowo starszy bajt przesuwasz o zbyt mało miejsc. Operacja powinna wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Oczywiście data musi być zmienną 16-bitową.

    PS. Zakładam, że połączenia i konfiguracja SPI są poprawne
  • #3 10128808
    Domage
    Poziom 11  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po twoim pytaniu sprawdziłem SPI, i w ustawieniach nie doszukałem się błędu.Zmieniłem jedynie częstotliwość zegara z 1 na 2Mhz.
    SPI ustawiane wg 136strony datasheet' atmegi32:

    SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(0<<SPR1)|(1<<CPOL)|(1<<CPHA); 
    SPSR = (1<<SPI2X); 

    Po wpisaniu twojej formy przy około (nie jestem pewien źródła 12V, bo to zasilacz PC) 312mV na wejściu ADC wyskakuje 83 bity, a nie 66 jak powinno.
    przy 130mV (5V brane z zasilania ADC) pokazuje 35 a nie 27 jak powinno.
    Sprawdzałem 5 razy na oscyloskopie, i na wejściu Vref jest dokładnie 4,8V
    Układ ADC zasilany z 5V . Może tutaj jest problem, że Vref nie jest równe Vcc ?

    No chyba że ja mam coś nie tak, z wyświetlaniem danych. na wyświetlaczu, albo schematem. Postaram się przejrzeć jeszcze raz wszystko, dokładnie, przy świetle dziennym.

    PS mam również bliźniaczy przetwornik ADC 3204 (12 Bit), więc jak domyślam się, wystarczy zmienić data = adc[1]&0x0F; ?? Chociaż z tą i bez tej zmiany pokazuje prawie to samo co 3004.

    Póki co poradziłem sobie zmieniając w programie Vref i zakładając ogólnie,co jest nie zgodne z prawdą, że Vref=4V.
  • #4 10129483
    kiziu13
    Poziom 17  
    W takim razie pokaż schemat i obecny kod. Na pewno dzielnik masz dobrze policzony?
  • #5 13745780
    Domage
    Poziom 11  
    Temat można zamknąć, tak dawno temu to robiłem, że już zapomniałem co było nie tak, a programu już nie odnajdę.
    Dzięki za chęć pomocy.
REKLAMA