LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

Digilent Pmod i STM32 (cz. 5) – PmodCLS, PmodDPG1 i PmodISNS20

PmodDPG1

Moduł PmodDPG1 składa się z trzech głównych elementów: różnicowego czujnika ciśnienia – MP3V5010, przetwornika analogowo-cyfrowego ADCS7476, a także układu zapewniającego napięcie referencyjne do pomiarów – REF3030. Pierwszy z nich – MP3V5010, służy do pomiaru różnicy ciśnienia pomiędzy swoimi wejściami. Maksymalna różnica mierzonych ciśnień to 10 kPa, natomiast rozdzielczość pomiaru wynosi 270 mV/kPa. Czujnik posiada wyjście analogowe, z którego można odczytać napięcie proporcjonalne do zmierzonej różnicy ciśnienia na wejściach układu.

Fotografia 3. Moduł PmodDPG1

Za pomiar napięcia na wyjściu czujnika ciśnienia odpowiada 12-bitowy przetwornik analogowo-cyfrowy – ADCS7476 z interfejsem SPI. Konwersja inicjalizowana jest sygnałem CS, który musi być utrzymywany w stanie niskim aż do końca konwersji. Następuje on na szesnastym opadającym zboczu sygnału zegarowego SCLK. Maksymalna częstotliwość zegara to 20 MHz.

Zmiana stanu sygnału CS na wysoki pomiędzy dziesiątym i szesnastym zboczem sygnału zegarowego powoduje pozostanie układu w tym samym trybie, jednak wówczas dane są nieważne. Układ ADCS7476 posiada także tryb obniżonego poboru prądu, do którego przechodzi się zmieniając stan sygnału CS na wysoki przed dziesiątym opadającym zboczem sygnału SCLK. Do pomiaru i odczytu wartości napięcia potrzebne są dwa 16-bitowe transfery SPI – pierwszy do przeprowadzenia konwersji, a także drugi do transmisji danych, które są przesunięte do prawej strony (najmniej znaczące 12 bitów w słowie 16-bitowym). Przedstawiono to na rysunku 4.

Rysunek 4. Transfery SPI potrzebne do pomiaru i odczytu danych (źródło: dokumentacja ADCS7476)

Podłączenie modułu do płytki KAmeleon

Moduł PmdDPG1 należy podłączyć do złącza Pmod-SPI zestawu KAmeleon tak, jak pokazano to na fotografii 5. Połączenia z pinami mikrokontrolera są identyczne jak w przypadku PmodCLS (tabela 1).

Fotografia 5. Moduł PmodDPG1 podłączony do zestawu KAmeleon

Kod przykładu

W przykładzie kod do obsługi modułu PmodDPG1 znajduje się w pliku src/PmodDPG1.c. Pierwsza z funkcji, PmodDPG1_Config przedstawiona na listingu 5, konfiguruje interfejs SPI do komunikacji z układem. SPI jest w trybie 2 (CPOL=1, CPHA=0) z 16-bitowymi danymi. Interfejs skonfigurowano dla transmisji w jedną stronę – bez linii MOSI, ze sprzętową kontrolą sygnału CS.

Kod programu z plikami projektowymi środowiska Atollic można pobrać w sekcji „Do pobrania”

Listing 5. Inicjalizacja interfejsu SPI dla PmodDPG1

SPI_HandleTypeDef pmodDpg1Spi;

void PmodDPG1_Config(void)
{
  // Configure the SPI connected to the Pmod module. Only the MISO line is required.
  // The CS line is controlled by the hardware.
  pmodDpg1Spi.Instance = SPI1;
  pmodDpg1Spi.Init.Mode = SPI_MODE_MASTER;
  pmodDpg1Spi.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  pmodDpg1Spi.Init.DataSize = SPI_DATASIZE_16BIT;
  pmodDpg1Spi.Init.CLKPolarity = SPI_POLARITY_HIGH;
  pmodDpg1Spi.Init.CLKPhase = SPI_PHASE_1EDGE;
  pmodDpg1Spi.Init.NSS = SPI_NSS_HARD_OUTPUT;
  pmodDpg1Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  pmodDpg1Spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
  pmodDpg1Spi.Init.TIMode = SPI_TIMODE_DISABLE;
  pmodDpg1Spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  pmodDpg1Spi.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

  HAL_SPI_Init(&pmodDpg1Spi);
}

Konfiguracja pinów i zegarów

Włączanie zegarów i pinów znajduje się w funkcji HAL_SPI_MspInit, którą wywoływuje funkcja HAL_SPI_Init. Funkcję HAL_SPI_MspInit przedstawiono na listingu 6. Wszystkie piny są kontrolowane sprzętowo i konfigurowane w funkcji alternatywnej dla SPI1.

Listing 6. Inicjalizacja pinów interfejsu SPI dla PmodDPG1

void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
  // Initialize GPIO used by the SPI2 peripheral.
  __HAL_RCC_SPI1_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOE_CLK_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct;

  // Configure all required GPIO lines in alternate mode.
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_14;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

Odczyt i konwersja danych

Ostatnia z funkcji obsługi modułu PmodDPG1 zajmuje się odczytem i przeliczaniem mierzonej wartości. Zaprezentowano ją na listingu 7. Konwersja jest przeprowadzona zgodnie z zależnością zamieszczoną w dokumentacji modułu PmodDPG1 i liczoną według wzoru:

Listing 7. Odczyt i konwersja wartości różnicy ciśnienia

uint32_t PmodDPG1_GetValue(void)
{
  // Receive the 12-bit value from the ADC and convert it to the pressure difference in [Pa].
  // The conversion equation is taken from the PmodDPG1 reference manual.
  uint16_t value[2] = {0};
  HAL_SPI_Receive(&pmodDpg1Spi, (uint8_t*)value, 2, 100);
  value[1] = ((value[1] * 1000 / 4096) - 80) / 0.09;
  return value[1];
}

Przykład odczytuje wartość różnicy ciśnienia cyklicznie co pół sekundy w pętli głównej programu w funkcji main. Po odczycie wyniki są wypisywane na port szeregowy LPUART1, którego obsługa znajduje się w pliku src/serial.c.

Moduły PmodCLS, PmodDPG1 i PmodISNS20 a także zestaw KAmeleon oraz wiele innych płytek ewaluacyjnych i modułów rozszerzających można znaleźć w ofercie Kamami.pl