[AD2][Pascal] SPI - Digital I/O | mostek Wheatstone'a | WaveForms SDK w Pascal | cz.3-C

Tutaj umieszczamy tematy związane z językami programowania niepasującymi do innych działów.
Regulamin forum
Temat prosimy poprzedzić nazwą języka umieszczonego w nawiasach kwadratowych np. [Pascal].
Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

[AD2][Pascal] SPI - Digital I/O | mostek Wheatstone'a | WaveForms SDK w Pascal | cz.3-C

Postautor: tasza » sobota 22 gru 2018, 12:55

♬ ☘ Moja muzyka do kodowania ♬ ♬ ♬ ☘
♫ ♩ ♪ The Birthday Massacre ⚡ ☘ ⚡ Looking Glass ♪ ♩ ♫
https://youtu.be/m6HAFYi8-sY


Tryptyk Protokolarny

część trzecia - SPI


Kolejny bardzo popularny sposób komunikacji to tytułowe SPI (Serial Peripheral Interface), oczywiście i ta magistrala ma swoje miejsce w oknie Protocol, na swojej dedykowanej zakładce. Ma także pełne wsparcie od strony WaveForms SDK, choć nie ukrywam - w porównaniu z UART czy I2C - tam trzeba się nieco nagłówkować.

Chcąc przygotować demko napotkałam pewien drobny kłopot - co by tu wybrać na głównego bohatera odcinka?

Wszelkie rejestry przesuwne typu 74LS165 (in) czy 74HC595 (out) były już eksploatowane do znudzenia wręcz, przetwornik TLC591 też był chyba przerabiany jak i termopara MAX6675, no scalaki do SPI się normalnie kończą. Szczęściem przypomniała mi się bardzo ciekawa kostka, kolejny próbkowy gifcik od moich milusińskich z firmy Microchip Technology, a mianowicie - sterowany via SPI cyfrowy potencjometr.

Tak więc, z układowego punktu widzenia, w roli głównej wystąpi kostka MCP41HV51103 (rodzinka MCP41HVX1) czyli wysokonapięciowy potencjometr 10kΩ.

01_41hv51103.jpg


Wszelkie dane katalogowe i opisy znajdziemy w lokalizacji: :arrow: http://ww1.microchip.com/downloads/en/d ... 05207b.pdf

Mistrzami drugiego planu zostaną zgodnie: maleńkie źródło napięcia wzorcowego 10.0V typu LT1031: :arrow: https://www.analog.com/media/en/technic ... 1031fb.pdf i oczywiście niezawodne i wszędobylskie Meratroniki V640 oraz V543. To lecimy...

02_LT1031.jpg


Gałka to przeżytek

Wstępne eksperymenty z komunikacją SPI przeprowadziłam oczywiście przy pomocy okienkowej aplikacji WaveForms, chwilę trwało dogadanie się z wszelkimi opcjami, ale finalnie udało mi się porozumieć z kostką potencjometru, okienka i pomiary rezystancji dla trzech skrajnych ustawień (0, 50%, max) przedstawia rysunek poniżej.

03_Rvar_spi.jpg


Jak widzimy zakładka SPI okna Protocol kompleksowo obsługuje komunikację i jest w miarę intuicyjna, ale na kilka rzeczy należy zwrócić uwagę. Po pierwsze, listy wyboru Polarity i Phase określają tak zwane SPI Mode, co tam ma być ustawione - narzuca nam dokumentacja układu, z którym będziemy się komunikować. Po drugie - rozdzielono logicznie bloki polecenia i danych w ramce SPI, tak więc przy komunikacji z girlandą kostek typu np. 74HC595 trzeba się mentalnie przestawić na taki sposób podawania danych.

Wstępne testy kostki potencjometru polegały na pomiarze rezystancji dolna końcówka (B)-suwak(W) i to widzimy na obrazku. Ciekawą natomiast okazała się zmiana rezystancji potencjometru przy zmianie napięcia zasilającego układ, pomiary dla ±10V i ±15V:

Kod: Zaznacz cały

Ucc    ±10V       ±15V 
data   Rab kΩ     Rab kΩ   
-------------------------
FF     10.144     10.117
80     5.162      5.133
00     0.135      0.106


Podobnie jest z rezystancją mierzoną na skrajnych zaciskach A-B potencjometru, widzimy to na obrazku poniżej dla zasilania 10 i 15V.

04_Rmax.jpg


Tak w ogóle, to temat tego potencjometru jest megaciekawy sam w sobie, ale jednak wracamy do zastosowania.

Pan Charles Wheatstone i SPI

Skoro mamy element zmieniający rezystancję według danych z interfejsu SPI to czemu by nie zbudować, choćby próbnego, modelowego układu mostka, jaki drzewiej wymyślił pan Wheatstone :arrow: https://pl.wikipedia.org/wiki/Mostek_(elektronika)

Zatem proszę, na rysunku poniżej schemat mojego układu do eksperymentów:

05_schem_bridge.png


Realizacja na płytce stykowej:

06_bridge.jpg


No i oczywiście aspekty programowe. Do obsługi SPI w WaveForms SDK mamy oddelegowany specjalny zestaw funkcji, etap typowej inicjalizacji interfejsu przedstawia fragment listingu:

main.pas pisze:

Kod: Zaznacz cały

procedure TMainForm.SetupSPI;
begin
  FDwfDigitalSpiFrequencySet( hAd2, 1E3 );     // 1kHz
  FDwfDigitalSpiClockSet( hAd2, DIO_1 );       // CLK = DIO_1
  FDwfDigitalSpiDataSet ( hAd2,  FUNC_DQ0_MOSI_SISO (* idxDQ *), DIO_2 );   // DQ0 (MOSI) = DIO_2
  FDwfDigitalSpiDataSet ( hAd2,  FUNC_DQ1_MISO (* idxD1 *), DIO_3 );        // DQ1 (MISO) = DIO_3
  FDwfDigitalSpiModeSet ( hAd2, 0 ); // SPI w 0 - Mode 0,0 , 3-Mode 1,1
  FDwfDigitalSpiOrderSet ( hAd2, 1 );  // MSB first
  FDwfDigitalSpiSelect ( hAd2, DIO_0, SPI_SEL_HIGH );   // /SEL = DIO_0, wymuś H
end;


a cała aplikacja w lokalizacji: :arrow: https://github.com/bienata/AnalogDiscov ... 1_bridge_1

Nie ma tu wielkich czarów, ale proszę zauważyć, że w wywołaniach funkcji posługuję się odpowiednio nazwanymi stałymi, co poprawia czytelność całości, taką mam przynajmniej nadzieję. Dla porównania kawałek kodu, który powstał bezpośrednio na bazie przykładów Digilenta: :arrow: https://github.com/bienata/AnalogDiscov ... i_41hv51_1

Samo wysyłanie ramek danych przez skonfigurowane łącze jest banalnie proste:

main.pas pisze:

Kod: Zaznacz cały

  FDwfDigitalSpiSelect ( hAd2, DIO_0, SPI_SEL_LOW );
  FDwfDigitalSpiWrite16 ( hAd2, DQ_MOSI_MISO , 16, @spiTx, 1 );
  FDwfDigitalSpiSelect ( hAd2, DIO_0, SPI_SEL_HIGH );


gdzie spiTx to zmienna typu smallint (16 bit), niosąca zawartość do nadania.

Całość daje nam aplikację do obsługi testowego mostka Wheatstone'a, okienko jak poniżej:

07_bridge_app.png


Przygotowania do pamiątkowego filmiku:

08_kochany_bajzelek.jpg


I na koniec - efekt pracy zabawowego mostka Wheatstone'a, który w sumie całkiem sensownie działa:

https://youtu.be/GZBMYBv-DaM

Prezentowane wartości są as-is, bez zaokrągleń - tu chodzi o demo funkcjonalne, a nie o urealnienie odczytów.
A w formie dygresji - widać jak przydatny w warsztacie jest V640, tym razem ze względu na możliwość wystąpienia w roli wskaźnika zera. Na cyfrowym mierniku z Biedronki nie byłoby takiego efektu wizualnego.

Epilog tymczasowy

Krótka opowiastka o SPI kończy niniejszym Tryptyk Protokolarny.

Podobnie jak dla UART czy I2C - zestaw funkcji kompleksowo obsługuje większość życiowych przypadków, nawet jeżeli spotkamy się z rozwiązaniem sprzętowym typu domowa samoróbka na rejestrach TTL - będziemy w stanie nawiązać z tym łączność, to pewnik. Uwaga na temat przykładów od Digilent obowiązuje - trzeba się nieco pozastanawiać, ale gdy zaskoczymy jak to pracuje - droga do własnych eksperymentów stoi otwarta.

Tak wiem, pozostała jeszcze magistrala CAN, ale to już by się zrobił poliptyk to po raz, a po dwa - musiałabym siedzieć z laptopem w zimnym samochodzie. No i w moim Passatku pełny CAN nie jest raczej dostępny na złączu pod hamulcem ręcznym (tam jest afaik OBD-2), a majstrowanie przy wiązkach to mi się raczej nie uśmiecha, auto wolę mieć sprawne. póki co.


#slowanawiatr
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony niedziela 23 gru 2018, 07:03 przez tasza, łącznie zmieniany 2 razy.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

SuperGość
Uber Geek
Uber Geek
Posty: 2346
Rejestracja: piątek 04 wrz 2015, 09:03

Re: [AD2][Pascal] SPI - Digital I/O | mostek Wheatstone'a | WaveForms SDK w Pascal | cz.3-C

Postautor: SuperGość » sobota 22 gru 2018, 21:12

Auto zostaw w spokoju :) dzięki wielkie za fajny cykl i dobrego odpoczynku w Święta.

Awatar użytkownika
j23
Expert
Expert
Posty: 506
Rejestracja: czwartek 08 paź 2015, 18:40

Re: [AD2][Pascal] SPI - Digital I/O | mostek Wheatstone'a | WaveForms SDK w Pascal | cz.3-C

Postautor: j23 » sobota 22 gru 2018, 21:55

Tutorial = arcydzieło. Dzięki wielkie Tasza. Nawet nie wiesz ile tutaj przydatnych informacji w Twoim tutorialu (chodzi mi głównie o wykorzystanie Linux'a i generalnie finezyjne połączenie "staroci" z elektroniki z najnowszymi osiągnięciami). Tylko czekać aż pojawią się nowe projekty np.zasilaczy opartych na tym module i np.LM317, a może już są? Nawet nie wiem.
Pozdrawiam! 73 Jarek
Internet łączy ludzi, którzy dzielą się swoimi zainteresowaniami, pomysłami i potrzebami, bez względu na geograficzne (przeciwności).
BOB TAYLOR, PARC


Wróć do „Inne języki programowania”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości