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

[ATMEGA32][C][SPI] Atmega32 i przetwornik LTC2157

gasior_sp 28 Sie 2010 01:01 3618 15
REKLAMA
  • #1 8447140
    gasior_sp
    Poziom 10  
    Witam,

    Podłączyłem do Atmegi 32 przetwornik cyfra-analog LTC1257 programowany przez SPI. Przetwornik ma pracować z napięciem odniesienia 10V i być zasilany 15 V napięcia.

    Poniżej schemat połączeń.

    [ATMEGA32][C][SPI] Atmega32 i przetwornik LTC2157

    Zgodnie z tym co wyczytałem w nocie katalogowej , wysyłam do przetwornika dwa razy po 8 bitów danych, a napięcie na wyjściu powinno pojawić się gdy linię LOAD przestawię w stan niski. Obsługę SPI realizuję to przez poniższe funkcję.

    
    void SPI_MasterInit(void)
    {
    /* Set MOSI and SCK output, all others input */
    DDRB = _BV(7) | _BV(5) | _BV(0);
    PORTB |= _BV(0);   // stan wysoki
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    }
    
    
    // funkcja wysyłania danych do przetwornika
    void SPI_MasterTransmit(uint16_t a)
    {
    uint16_t b;
    uint8_t  c;
    
    PORTB |= _BV(0);   // stan wysoki
    /* Start transmission */
    b = ((a>>8)&0x000F);
    c= b;
    SPDR = c;
    loop_until_bit_is_set(SPSR, SPIF);
    c = (a&0x00FF);
    SPDR = c;
    loop_until_bit_is_set(SPSR, SPIF);
    PORTB &= ~_BV(0);   // stan niski
    _delay_us(100);
    PORTB |= _BV(0);   // stan wysoki
    
    }
    


    Mimo wysyłania do przetwornika różnych ciągów bitów, na wyjściu nie pojawia mi się żadne napięcie.
    Sprawdziłem miernikiem połączenia. Na wyjściu DOUT pojawia się napięcie (~7,68V) więc układ powinien być sprawny.
    W czym może tkwić problem? Możliwe, że istnieje konflikt urządzenia SPI z programatorem STK500 na liniach ISP? (Próbowałem z podłączonym i odłączonym programatorem i efekt jest ten sam.)
  • REKLAMA
  • #2 8447307
    Freddy
    Poziom 43  
    Przeczytaj jeszcze raz karte katalogową, jakie 2 x po 8 bitów ?
  • #3 8447788
    gasior_sp
    Poziom 10  
    Przetwornik ma 12 bitów, a SPI wysyła tylko 8, więc wysyłam dwa razy po 8 i liczy się ostatnie 12 bitów jakie znajdzie się w buforze przed zmianą stanu linii LOAD na niski.
  • REKLAMA
  • #4 8448075
    Freddy
    Poziom 43  
    W dokumentacji na stronie 7 masz wyraźnie pokazane co i jak masz wysłać.
  • REKLAMA
  • #5 8448104
    gasior_sp
    Poziom 10  
    Na tym właśnie się wzorowałem, z tym że nie mogę wysłać na raz 12 bitów, bo rejestr w AVR jest 8 bitowy, więc wysyłam 4 zera i 4 pierwsze bity, a potem kolejne 8 i dopiero wtedy ustawiam linię LOAD na niski stan.
    Takie rozwiązanie znalazłem w tym temacie:
    Link

    Wejście przetwornika jest na rejestrze przesuwnym więc te pierwsze 4 zera odpadają i w rejestrze powinno zostać właściwe 12 bitów. Z tym, że na wyjściu przetwornika ciągle jest 0V.
  • Pomocny post
    #6 8448953
    Andrzej__S
    Poziom 28  
    Próbowałeś zmieniać bity CPOL i CPHA w rejestrze SPCR. Skoro próbkowanie jest na zboczu narastającym, to może spróbuj ustawić je oba na 1. Miałem kiedyś przez to kłopoty z jakąś pamięcią na SPI i ten manewr pomógł.
  • #7 8449773
    gasior_sp
    Poziom 10  
    Tak.
    Ustawiałem tak już wcześniej, teraz dla pewności sprawdziłem wszystkie 4 kombinacje i na wyjściu ciągle nic nie ma.
  • #8 8458765
    rpal
    Poziom 27  
    Bo tam ewidentnie trzeba wysyłać słowo 12-bitowe. Nie lepiej bylo wybrać inny przetwornik ? Albo też musisz zrobić programową obsługę transmisji szeregowej nie używającą SPI.
  • Pomocny post
    #9 8458936
    tymon_x
    Poziom 30  
    rpal napisał:
    Bo tam ewidentnie trzeba wysyłać słowo 12-bitowe. Nie lepiej bylo wybrać inny przetwornik ? Albo też musisz zrobić programową obsługę transmisji szeregowej nie używającą SPI.

    Słowo to sobie może mieć nawet w tera bitów, jest to rejestr przesuwny typu SISO. Ważne dla niego są bity, które trzyma w przerzutnikach na wyjściu. Więc gasior_sp dobrze kombinuje.

    1. Ustaw CPOL=1, CPHA=1.
    2. Jak możesz przejdź na wewnętrzne Vref. (opcjonalnie, opis w katalogu)
    3. Zmniejszy zegar i ustaw większy preskaler.
    4. Podłączyć diodę LED na Dout
    5. Wyślij i sprawdź czy działa.
    6. Czy dostajesz to samo co na wejściu.

    Zmniejszym zegarem lepiej widać, wyślij 2048, powinieneś dostać połowę Vref.
    Zatrzaśnij ręcznie do masy.

    Jeśli nie:
    1. Napisz programową obsługę wysyłania za pomocą buttona.
    2. Podłącz diodę na Dout.
    3. Sprawdź czy dostajesz to samo co na wejściu.

    Zmierz wszystko co trzeba, jakie podajesz mu Vref? Co to jest Component_1?
    Filtrujesz zasilanie?
  • #10 8459967
    gasior_sp
    Poziom 10  
    Zasilanie jest filtrowane, na wyjściu LM7815 mam kondensator 100n. To napięcie zasila przetwornik oraz przez kondensator 330n do LM7805 z które zasilany jest AVR.

    Component_1 to LT1021-10, taki jak pokazany w nocie, żeby uzyskać napięcie referencyjne 10V.

    CPOL i CPHA są ustawione na 1.
    Taktowanie AVRa ustawione na 4Mhz, preskaler dzielił przez 16, a w nocie jest, że do 1,4Mhz powinno chodzić, więc to raczej nie to. Zmieniłem teraz maksymalnie w dół na 32kHz i nic się nie zmienia.

    Wysłałem do przetwornika 2048.
    Na DOUT mam 7,96V. Na Vout ciągle 0V.
    Napięcie referencyjne jest 9,96V.

    Nie za bardzo rozumiem do czego ma służyć ta dioda? Zmiany bitów są za szybkie, żeby zaobserwować coś diodą.
  • Pomocny post
    #11 8460007
    tymon_x
    Poziom 30  
    gasior_sp napisał:
    Nie za bardzo rozumiem do czego ma służyć ta dioda? Zmiany bitów są za szybkie, żeby zaobserwować coś diodą.

    Chodziło o danie mniejszego kwarcu lub programowe generowanie cyklu zegara w ten sposób, żeby zobaczyć "na własne oczy" czy rejestr się przesuwa. Może być dioda lub miernik w takim przypadku, kiedy nie masz oscyloskopu. Z Din po zboczu narastającym powinieneś dostać na Dout ten sam stan po 12 cyklach.
  • #12 8460110
    gasior_sp
    Poziom 10  
    Oscyloskopu niestety nie mam.
    Najmniejszy kwarc jaki mam to 32Khz, ale to i tak przy najniższym preskalerze daję 256 zmian na sekundę. Więc ta opcja chyba odpada.
    Spróbuje zrobić to programowo.

    Jeśli dobrze rozumiem to wyjście DOUT jako wyjście rejestru przesuwnego powinno dawać na wyjściu te same bity co na wejściu. Więc jeśli wysyłam do przetwornika do 2048 tylko raz, to czemu na wyjściu DOUT mam ciągle stałe napięcie 7,9V?
  • REKLAMA
  • #13 8460325
    gasior_sp
    Poziom 10  
    Zrobiłem taką próbę:

    
    DDRB = _BV(7) | _BV(5)  | _BV(0);
    PORTB |= _BV(0);   // stan wysoki
    while(1){
    
    _delay_ms(1000);
    PORTB ^= _BV(7); // przełączenie bitu
    PORTB ^= _BV(5); // przełączenie bitu
     
    } 
    


    Bit 7- to zegar, 5-DIN, 0- to Load.

    Stany na SCK i DIN się zmieniają na DOUT ciągle zero, zmieniłem czas oczekiwania na 1 ms i dalej mam 0.


    EDIT: A teraz dałem na stałe jedynkę na DIN i mam na DOUT 7,8V
  • Pomocny post
    #14 8460438
    tymon_x
    Poziom 30  
    No to jak zasilasz Vcc=15V, to dając stan 1 na Din, powinieneś dostać na Dout=Vcc, bo to w końcu po rejestrze przesuwnym masz CMOS, którego jest pociągnięte zasilanie Vcc (schemat, opis w nocie) i z niego wychodzi Dout. Więc spodziewam się najgorszego scenariusza z możliwych:/
  • #15 8460448
    gasior_sp
    Poziom 10  
    No właśnie dlatego mnie dziwiło stałe napięcie na DOUT w momencie gdy wysłałem bity tylko raz.
    Czyli mam rozumieć, że zakup nowego przetwornika mnie czeka?
  • #16 8472258
    gasior_sp
    Poziom 10  
    Zakupiłem nowy przetwornik, wysłałem 2048 tą moją metoda i na wyjściu pojawiło się 4,99V. Zmieniłem na 1024 i jest 2,50V.

    Czyli z wysyłaniem wszystko było dobrze, a tylko przetwornik uszkodzony.
REKLAMA