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

Pomiar napięcia przez SPI z MCP3202 - XMEGA

kamil94goldman 26 Wrz 2017 23:08 768 11
  • #1 26 Wrz 2017 23:08
    kamil94goldman
    Poziom 3  

    Witam, zrealizowałem pomiar napięcia poprzez interfejs SPI z układem przetwornika 12 bitowego MCP3202. Mierzę napięcie od 0 do 5 V więc wyniki na LCD powinny być od 0 do 4095 lecz otrzymuje wyniki od 0 do 32767. Nie mogę dojść gdzie tkwi błąd czy w konfiguracji czy może w scalaniu wyniku ?

    Oto program:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0 11
  • #2 26 Wrz 2017 23:33
    2675900
    Użytkownik usunął konto  
  • #3 26 Wrz 2017 23:44
    tmf
    Moderator Mikrokontrolery Projektowanie

    @Piotrus_999 Ja tam na pokazanym przez ciebie diagramie widzę konieczność przeczytania 2 bajtów (16 bitów) i zamaskowania 4 najbardziej znaczących bitów, które zostaną odczytane jako 1.
    @kamil94goldman Oprócz braku maskowania, po wysłaniu pierwszego bajtu (config) nie czyścisz rejestru odbiornika SPI. W efekcie czytasz o jeden bajt "do tyłu". Pamiętaj, że na SPI nadawaniu zawsze towarzyszy odbiór.

    0
  • #4 26 Wrz 2017 23:54
    2675900
    Użytkownik usunął konto  
  • #5 27 Wrz 2017 00:12
    tmf
    Moderator Mikrokontrolery Projektowanie

    Piotrus_999 napisał:
    tmf napisał:
    Piotrus_999 Ja tam na pokazanym przez ciebie diagramie widzę konieczność przeczytania 2 bajtów (16 bitów)


    Doprawdy - może i jestem ślepy po operacji katarakty ale (bity numerowałem od ZERO tak ja w bajcie bity są od zero do 7 ale bitów jest 8)

    Pomiar napięcia przez SPI z MCP3202 - XMEGA

    Ja ich widzę 17.


    To spójrz na całą notę:
    Pomiar napięcia przez SPI z MCP3202 - XMEGA
    Widać, że transmisja podzielona jest na 3 bajty - bajt kontrolny i 2 bajty z wynikiem, w którym 4 (wystarczy 3) najbardziej znaczące bity należy zamaskować.

    0
  • #6 27 Wrz 2017 00:30
    2675900
    Użytkownik usunął konto  
  • #7 27 Wrz 2017 01:09
    kamil94goldman
    Poziom 3  

    No więc tak. Postępując zgodnie z dokumentacją zrobiłem tak jak poniżej i wszystko działa chyba dobrze

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dodano po 6 [minuty]:
    Lecz tak się zastanawiam nad jedną sprawą. Jak można odebrać 12 bitów wyniku w przerwaniu od SPI skoro rejestr SPIC.DATA mikrokontrolera jest 8 bitowy?

    Dodano po 9 [minuty]:

    Oraz czy można z tym układem pracować w przerwaniach? bo jak by nie patrzeć to co każdą próbkę trzeba go od nowa konfigurować i nie wystarczy tylko ustawić odpowiednio CS.

    0
  • #8 27 Wrz 2017 13:04
    tmf
    Moderator Mikrokontrolery Projektowanie

    Piotrus_999 napisał:
    Nie Kolego @tmf W tym przypadku pierwszy bajt zawiera tylko start a w drugim są dane kontrolne + 5 bitów do zegara i trzeci dummy byte. Ale z tego co widze to Kolega autor tego tak nie robi. Jak by nie patrzeć jest to 5 bitów kontrolnych + 12 bitów danych = 17. Jaki jest padding to już insza inszość = można go sobie ustawić po uważaniu.


    Można te pięc bitów (włacznie z null umieścić w pierszym) bajcie a wtedy w drugim bedzie bardziej znaczący bajt a w trzecim przesunięte o 4 lewo 4 młodsze bity wyniku - albo cokolwiek innego.


    Nie ma znaczenia, przecież widzisz, że łącznie jest nadawanych 24 bitów, z czego najmniej znaczących 12 zawiera wynik. Czyli odbierasz 3 bajty, pierwszy wyrzucasz, kolejne dwa składasz i maskujesz najbardziej znaczące 4 bity. Dokładnie tak jak napisałem. Do czego więc zmierza twój wywód?

    Dodano po 3 [minuty]:

    kamil94goldman napisał:
    Lecz tak się zastanawiam nad jedną sprawą. Jak można odebrać 12 bitów wyniku w przerwaniu od SPI skoro rejestr SPIC.DATA mikrokontrolera jest 8 bitowy?

    Dodano po 9 [minuty]:

    Oraz czy można z tym układem pracować w przerwaniach? bo jak by nie patrzeć to co każdą próbkę trzeba go od nowa konfigurować i nie wystarczy tylko ustawić odpowiednio CS.


    Rejestr SPI ma bufor, więc pierwsze 8 bitów trafia do bufora, w tym czasie kolejnych 8 jest odbierane do rejestru odbiornika SPI, dopiero kolejny bajt przepełniłby bufor (o ile nie korzystasz z UART w trybie SPI). To robi MCU i nie za bardzo cię to interesuje, poza faktem, że odbiór musi być synchronizowany z nadawaniem, żebyś potem nie czytał jakiś danych dotyczących poprzednich transmisji.
    Oczywiście możesz to oprzeć o przerwania, tyle, że przy szybkości tego interfejsu nie za bardzo ma to sens (o ile nie korzystasz z jakiegoś istotnego preskalera zegara SPI. Sensowniej byłoby zaprząc do pracy DMA. W tym celu też najlepiej w trybie master korzystać z UART w trybie SPI a nie interfejsu SPI. UART ma dodatkowy poziom buforowania i lepszą współpracę z DMA.

    0
  • #9 27 Wrz 2017 13:37
    kamil94goldman
    Poziom 3  

    A jeśli chodzi o przerwania z samego SPI. Żeby odczytać wynik muszę wysłać 3 bajty więc, żeby złożyć wynik z przerwań to muszą nastąpić aż trzy przerwania i z nich złożyć wynik? Bo gdyby mieć np. 32 bitowy mikrokontroler to wysłałoby się raz dane i od razu odczytało cały wynik w jednym przerwaniu a tutaj muszę operować na 8 bitach.

    0
  • #10 27 Wrz 2017 14:39
    tmf
    Moderator Mikrokontrolery Projektowanie

    To nie ma wiele wspólnego z bitowością procesora. To ile bitów na raz można wysłać zależy od budowy interfejsu SPI - niezbyt często zdarza się aby interfejs umożliwiał przesłanie 32 bitów na raz, lub umożliwiał płynną zmianę ilości wysyłanych bitów. Jak pisałem tu przerwania są bez sensu - przy największej szybkości wysyłania danych, wysłanie 8 bitów trwa 16 taktów zegara. Wejście w przerwanie, jego obsługa i wznowienie kodu może trwać dłużej. Jeśli masz większe ciągi danych do przesłania, albo okresowo chcesz ponawiać przesyłanie danych to użyj DMA. Wyśle i odbierze dane, umieści w określonym miejscu w pamięci, możesz ponawiać wyzwalanie np. timerem, wszystko odbywa się bez udziału rdzenia. Oczywiście wszystko zależy ile tych danych będzie - jak często próbkujesz.

    Dodano po 1 [minuty]:

    BTW, ten zewnętrzny ADC jest niezbędny? W XMEGA masz dwa 12-bitowe ADC. Dlaczego ci one nie wystarczą?

    0
  • #11 27 Wrz 2017 14:42
    kamil94goldman
    Poziom 3  

    Chodzi mi tutaj bardziej o samą nauke obsługi niż do praktyczego zastosowania.

    Zrobiłem taki program odbierając wynik w przerwaniach (3 przerwania = 1 wynik) ku mojemu zdziwieniu działa w miarę prawidłowo hehe. Lecz niekiedy zdarza się że wynik się rozjedzie o +/- 50 ale najczęściej zachodzi to po przestawieniu napięcia i stosunkowo rzadko.

    1. Czy taki program jest prawidłowy ? czy można coś poprawić?

    2. Jeśli chodzi o ilość cykli co jaką zachodzą przerwania to można to tak obliczyć?

    - Częstotliwość taktowania = 32MHz
    - Prescale SPI = 64

    Czyli częstotliwość SPI = 32 MHz/64 = 500 kHz

    Zapełnienie 8 bitowego rejestru SPI zajmuje około 8 cykli, czyli przerwania zachodzą z częstotliwością 500 kHz/8 = 62,5 kHz

    a wtedy częstotliwość przetwonika wynosi 62,5 kHz/ 3 przewania = 20,8 ksps?

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #12 27 Wrz 2017 16:09
    tmf
    Moderator Mikrokontrolery Projektowanie

    Wyliczenia są mniej więcej poprawne - mniej więcej, bo dla dokładnych wyliczeń należałoby uwzględnić opóźnienia wprowadzane przez wykonywanie programu. Dla dokładnego samplowania używa się np. timera, niemniej przy zewnętrznym ADC jitter kilku taktów i tak będzie. Przekłamania wyniku mogą byc spowodowane np. sposobem dostępu do zmiennej wynik. Skoro jest współdzielona poiędzy pętlą główną programu i ISR to należy zadbać o atomowy dostęp do tej zmiennej. Poza tym ilość odczytów rejestru SPI jest mniejsza niż ilość zapisów, czyli rozsynchronizowuje się nadajnik i odbiornik i być może to też jest powodem błędów. BTW, zamiast 3 ifów, można wykorzystać switch/case.

    0