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

Jak uruchomić przetwornik ADS1256 na AVR z użyciem SPI?

pawgo2606 06 Mar 2012 18:42 3463 25
REKLAMA
  • #1 10642349
    pawgo2606
    Poziom 10  
    Witam.
    Dysponuję układem ADS1256 i próbowałem go uruchomić na podstawie poniższego programu:
    plik c
    Kod: text
    Zaloguj się, aby zobaczyć kod


    plik h na podstawie noty katalogowej

    Kod: text
    Zaloguj się, aby zobaczyć kod


    układ chcę obsłużyć za pomocą ATmega32. Prosiłbym o kontakt z kimś kto obsługiwał ten układ ewentualnie o przejrzenie kodu.
  • REKLAMA
  • #2 10647133
    Slawek_K
    Poziom 12  
    Witam,

    Zauważyłem w Twoim programie kilka rzeczy, które musisz sprawdzić:
    1. W jaki sposób jest wybierany układ ADS1256 do komunikacji? Powinien być zerowany pin w Atmega, który jest podłączony do wejścia CS. Jeśli jest na stałe podłączony do masy to jest dobrze.
    2. Odbiór danych (odczyt wartości) z układu może nastąpić przy zboczu opadającym wyjścia DRDY w ADS1256. W Twoim programie następuje to przy stanie wysokim.
    3. Przy zapisie rejestrów konfiguracyjnych do ADS1256 nie jest potrzebne sprawdzanie stanu wejścia PIN_RDY (DRDY w ADS1256). Można wysyłać nową komendę, następnie wydać rozkaz synchronizacji.
    4. Zauważyłem, że konfigurujesz w ADS1256 rejestr MUX na wejścia AIN6 i AIN7 "write_register(MUX,0x67); //wejścia AIN0 i AIN1" - w komentarzu natomiast wpisujesz AIN0 i AIN1.
    5. Warto również dodać funkcję czy przetwornik został prawidłowo skonfigurowany, może ona polegać na zapisie rejestrów konfiguracyjnych, następnie odczytu i porównaniu ich z rejestrami do zapisu. Jeśli będą takie same to można przejść do dalszej części programu.

    Robię projekt z układem ADS1248. Sposób komunikacji jest bardzo podobny do ADS1256.

    pozdrawiam
    Sławek
  • REKLAMA
  • #3 10648525
    pawgo2606
    Poziom 10  
    z komeną while(PIN_RDY) zgodzę się z Tobą, myślałem że dopóki jest stan wysoki to trwa w tym while i później idzie dalej jak jest stan niski, jeśli chodzi o punkt 3 to zastosuję się do Twoich spostrzeżeń, co do 4 pkt to bawiłem się wejściami a komentarz pozostał, nie bardzo rozumiem 5 punkt, myślałem że konfiguruję układ za pomocą funkcji ADS1256_Init();
  • #4 10649310
    Slawek_K
    Poziom 12  
    Witam,

    Odnośnie sprawdzania warunku while(PIN_RDY) to problem może być w przypadku gdy układ wogóle nie będzie odpowiadał lub się uszkodzi. Wtedy program zatrzyma się i nic nie będzie robił oprócz sprawdzania tego warunku (no i ewentualnie przerwania). Najlepiej jest zrealizować detekcję zbocza opadającego programowo lub podłączyć do wejścia, które taką detekcję posiada.
    Odnośnie mojego punktu 5 to warto w inicjalizacji dodać sprawdzanie czy konfiguracja przebiegła pomyślnie. Wówczas następne funkcje będą wiedziały czy mają być wykonywane.
    Nie odpisałeś na punkt 1 odnośnie wyboru układu.

    pozdrawiam

    Sławek
  • #5 10649630
    pawgo2606
    Poziom 10  
    używam pinów DRDY oraz CS (CS obecnie zwarty do masy bo chcę opanować najpierw ten przetwornik) bo po SPI będę obsługiwał jeszcze ATmegę32. chcę wykorzystać właśnie sygnał DRDY jako synchronizację więc może pójdzie mi jeżeli zastosuję zamiast while(PIN_RDY); --> while(PIN_RDY) {} we wszystkich funkcjach to program powinien przejść dalej jeżeli będzie stan niski
  • #6 10649681
    Slawek_K
    Poziom 12  
    Witam,

    Konstrukcja while(PIN_RDY) {"obsługa ADS1256"} będzie wykonywać się tylko wtedy gdy pin PIN_RDY będzie miał wartość TRUE. Jeśli już to proponuję użyć konstrukcji if (warunek) {wyrażenie}.

    pozdrawiam
    Sławek
  • #7 10649823
    pawgo2606
    Poziom 10  
    A mam pytanie co do procedury inicjalizacji i ustawień ADS, czy jest jakaś konkretna sekwencja wpisywania rejestrów i komend?? bo na stronie TI znalazłem coś takiego dla sekwencji ciągłego pomiaru
    http://e2e.ti.com/support/data_converters/precision_data_converters/f/73/t/95242.aspx#331746
    czy muszę w tej konwencji zmodyfikować kod czy zamieszczone na wstępie postu funkcje są dobre bo te są pisane na podstawie datasheet
  • #8 10649933
    Slawek_K
    Poziom 12  
    Witam,

    Na tej stronie to jest przykład w jaki sposób został skonfigurowany ADS1256 i opisany problem ze stabilnością w odczycie. Na początku również miałem problemy z komunikacją z ADS1248. Problem polegał na tym, że nie doczytałem wszystkiego w datasheet. Generalnie jeśli trzymasz się datasheet to komunikacja z ADS powinna zadziałać bez problemów. Zacznij od weryfikacji konfiguracji, czyli zapis rejestrów systemowych a następnie odczytu ich i weryfikacja z tym co wysyłałeś do ADS.

    pozdrawiam
    Sławek
  • #9 10650117
    pawgo2606
    Poziom 10  
    Czyli chodzi o sprawdzenie tego co wysyłam tak?? komendą RREG
  • Pomocny post
    #10 10650178
    Slawek_K
    Poziom 12  
    Witam,

    Tak dokładnie przy pomocy funkcji RREG. Jak tak robię i jeśli jest ok to wystawiam stan READY_ADC. Zdefiniowałem sobie taki typ wyliczeniowy: typedef enum
    {
    INIT_ADC,
    ERROR_ADC,
    NOT_READY_ADC,
    READY_ADC,
    ADC_OK
    } ADC_State; //typ wyliczeniowy dla stanu przetwornika ADC

    W zależności od miejsca programu zmieniam jego stan oraz sprawdzam w jakim jest stanie przetwornik ADS.

    pozdrawiam
    Sławek
  • REKLAMA
  • #11 10651703
    pawgo2606
    Poziom 10  
    w weekend pokombinuję z softem i odezwę się o swoich postępach. Zastosuję się do uwag i dam znać:) dziękuję Ci Sławek za pomoc i liczę na dalsze podpowiedzi od Ciebie:)

    Dodano po 2 [godziny] 24 [minuty]:

    mam problem z odczytem tych rejestrów... zgodnie z datasheet wysyłam
    Kod: text
    Zaloguj się, aby zobaczyć kod


    w main mam
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i mi nie odczytuje danych mimo że w inicjalizacji ustawiam MUX
    Kod: text
    Zaloguj się, aby zobaczyć kod

    read_registera robię na podstawie poniższego
  • #12 10655418
    Slawek_K
    Poziom 12  
    Witaj,

    Z tego co widzę to przy odczycie rejestrów konfiguracyjnych badasz stan wyjścia DRDY (PIN_RDY) - nie trzeba tego robić. Ja w swojej aplikacji dla ADS1248 nie robię tego (spośób komunikacji i odczytu jest bardzo podobny).
    Druga sprawa w funkcji odczytu rejestrów "unsigned char read_registera(unsigned char reg)" chcesz odczytać dwa rejestry (bajty) "spi_TranByte(0x01); //2ND command byte" (podajemy n-1 bajtów do odczytu, czyli wartość 0x01 oznacza odczyt 2 bajtów). Tymczasem dalej jest odczytywany tylko jeden bajt i funkcja kończy swoje działanie.
    Proszę sprawdź najpierw te rzeczy.

    pozdrawiam
    Sławek
  • #13 10663501
    bubu2606
    Poziom 15  
    mam kod w takiej postaci
    Kod: text
    Zaloguj się, aby zobaczyć kod

    próbuję odczytać wartość jednego rejestru MUX i na wyświetlaczu mam na zmianę 193 i 255... czasem 129 w żaden sposób nie odpowiada to temu co wysyłam w inicjalizacji a mianowicie write_register(MUX,0x01); i nie wiem gdzie tkwi problem...

    Dodano po 4 [minuty]:

    dodam że z innymi rejestrami jest identycznie tylko że tam to w ogóle wyświetla mi cały czas różne liczby...

    Dodano po 2 [minuty]:

    transmisja po SPI powinna być napisana poprawnie zgodnie z notą katalogową ATmega32 więc już brakuje mi pomysłów gdzie jest źle.
  • #14 10664301
    Slawek_K
    Poziom 12  
    Witam,

    Patrzyłem na Twój kod obsługi (odczytu i zapisu rejestrów konfiguracyjnych) i nie widzę generalnie błędów. W inicjalizacji ADS1256 proponuję dodać komendę SDATAC (Stop Data Reading Continuously) przed wysłaniem konfiguracji rejestrów. Nie wiem jak wygląda schemat połączeń więc trudno jest mi doradzić coś więcej.

    pozdrawiam
    Sławek
  • REKLAMA
  • #15 10664729
    pawgo2606
    Poziom 10  
    właśnie mam pytanie co do tej inicjalizacji. Czy te rejestry są we właściwej kolejności bo z tego co patrzyłem w nocie katalogowej to nie widziałem tak jakiejś konkretnej sekwencji wysyłania rejestrów i komend. Jak to zrealizowałeś w swoim układzie??

    Dodano po 19 [minuty]:

    schemat układu
  • #17 10666954
    Slawek_K
    Poziom 12  
    Witam,

    W moim układzie z ADS1248 wysyłanie konfiguracji rejestrów jest wykonywane w różnej kolejności - według mnie nie ma to większego znaczenia, ważna jest tylko prawidłowa składnia wysyłanej ramki do SPI.
    Widzę na schemacie, że zasilanie układu ADS1256 jest +3,3 V (część cyfrowa). Jakim napięciem jest zasilany mikrokontroler?
    Jeśli napięciem 5V to jest już problem.

    pozdrawiam
    Sławek
  • #18 10666989
    pawgo2606
    Poziom 10  
    Witam, część cyfrowa 3,3 natomiast analogowa 5V ATmega32 zasilana jest 5V, ale w tym linku
    http://masters.donntu.edu.ua/2011/fknt/pavlik/diss/indexe.htm
    wykorzystuje ATmege8-16AU więc tez 5V stosuje i raczej nie powinien to być problem z napięciem.
    Dodatkowo w nocie katalogowej jest taki zapis
    DIGITAL INTERFACE CONNECTIONS
    The ADS1255/6 5V tolerant SPI-, QSPI, and
    MICROWIRE-compatible interface easily connects to a
    wide variety of microcontrollers. Figure 27 shows the basic
    connection to TI’s MSP430 family of low-power
    microcontrollers. Figure 28 shows the connection to
    microcontrollers with an SPI interface like TI’s MSC12xx
    family or the 68HC11 family. Note that the MSC12xx
    includes a high-resolution A/D converter; the ADS1255/6
    can be used to add additional channels of measurement
    or provide higher-speed conversions. Finally, Figure 29
    shows how to connect the ADS1255/6 to an 8xC51 UART
    in serial mode 0 in a 2-wire configuration. Avoid using the
    continuous read mode (RDATAC) when DIN and DOUT
    are connected together.

    Dodano po 3 [godziny] 39 [minuty]:

    widzę że temat śledzi 5 użytkowników. może ktoś z Was widzi błąd w kodzie?? bo nawet jak wysyłam coś takiego

    Kod: text
    Zaloguj się, aby zobaczyć kod


    to mam dziwne rzeczy na wyświetlaczu... może coś w inicjalizacji SPI jest nie tak..
  • #19 10671483
    Slawek_K
    Poziom 12  
    Witam,

    Nie widzę błędu w aplikacji proponuję tylko dodać komendę stop odczytu (SDATAC) w procesie inicjalizacji układu ADS1256. Jeśli dalej są problemy to proponuję przyjrzeć się przy pomocy oscyloskopu co się dzieje na magistrali SPI (CLK, MISO, MOSI) lub poprzez JTAG.

    pozdrawiam
    Sławek
  • #20 10672233
    pawgo2606
    Poziom 10  
    czyli mam zrobić tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #21 10672419
    Slawek_K
    Poziom 12  
    Witam,

    Ja na początku wysyłam komendę SDATAC do ADS1248, a następnie dopiero przesyłam konfigurację z tym, że zapisuję od razu kilka rejestrów. Poniżej fragment aplikacji związanej z inicjalizacją ADS1248.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    pozdrawiam
    Sławek
  • #22 10672609
    pawgo2606
    Poziom 10  
    zauważyłem też że resetujesz na początku układ. czy jest to obowiązkowe czy lepiej go resetować przed podaniem komend?? spróbuję napisać na Twój sposób i sprawdzić go:)
  • #23 10672947
    Slawek_K
    Poziom 12  
    Witam,

    Resetowanie nie jest konieczne ale ja dodałem reset (RST_ON_ADS). Chciałem mieć pewność, że układ jest gotowy do komunikacji. U mnie reset jest wykonywany poprzez wyjście mikrokontrolera. Mam również wyjście sygnał startu (START1_ON) przetwarzania przez ADS.

    pozdrawiam
    Sławek
  • #24 10691193
    pawgo2606
    Poziom 10  
    dalej kombinuję z tym programem i nici.. czy ktoś bawił się tym ADS??
  • #25 10693871
    Slawek_K
    Poziom 12  
    Witam,

    Jeśli dalej masz problemy z komunikacją to proszę podeślij na priv pełen schemat oraz program. Inną radą jest sprawdzenie magistrali SPI przy pomocy oscyloskopu lub analizatora stanów logicznych.

    pozdrawiam
    Sławek
  • #26 10764693
    pawgo2606
    Poziom 10  
    Witam, udało mi się odpalić układ:) teraz biorę się za składanie projektu do jednej całości :) mam problem użyciem klawiatury 4x4 na dwóch portach bo nie będę dysponował całym wolnym portem ale to już temat na inny post
REKLAMA