LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

Digilent Pmod i STM32 (cz. 7) – PmodBT2, PmodTC1 i PmodCLP

PmodTC1

PmodTC1 jest modułem do pomiaru temperatury za pomocą termopary w zakresie od -73°C do +482°C z dokładnością ±2°C. Składa się on z dwóch elementów – termopary typu K, a także układu MAX31855, będącego przetwornikiem z kompensacją temperatury zimnego złącza. Jest to konieczne ze względu na konieczność utrzymywania tzw. zimnych końców termopary w ściśle określonej temperaturze, najczęściej 0°C. Zastosowanie kompensacji usuwa to ograniczenie przez pomiar temperatury otoczenia, która jest jednocześnie temperaturą zimnego złącza.

Fotografia 3. Moduł PmodTC1

Połączenia modułu PmodTC1

PmodTC1 posiada dwa złącza – J1 do podłączenia termopary, a także J2 z interfejsem SPI. Przy podłączaniu termopary należy zwrócić uwagę na oznaczenia poszczególnych przewodów – kolor oplotu każdego z nich (żółty i czerwony) odpowiadają oznaczeniom obu terminali złącza (T+ YLW, T- RED). Drugie ze złączy odpowiada standardowemu złączu Pmod SPI typu 2, bez sygnału MOSI, ponieważ komunikacja odbywa się tylko jednym kierunku. Moduł można podłączyć do złącza Pmod-SPI zestawu KAmeleon, w którym schemat połączenia z pinami mikrokontrolera wygląda tak, jak to przedstawiono w tabeli 3. Podłączony moduł zaprezentowano na fotografii 4.

Tabela 3. Podłączenie modułu PmodTC1 do złącza Pmod-SPI zestawu KAmeleon; w tabeli pominięto sygnały niepołączone (NC) oraz linie zasilania

Sygnał Numer pinu złącza Pmod Pin mikrokontrolera
CS 1 PB0
MISO 3 PE14
SCK 4 PA1

Fotografia 4. Moduł PmodTC1 podłączony do zestawu KAmeleon

Komunikacja z układem MAX31855

Układ MAX31855 nie wymaga konfiguracji, a odczyt danych odbywa się za pośrednictwem interfejsu SPI. Dane zwracane przez moduł są zakodowane na 32 bitach, tak jak na rysunku 5. Poszczególne pola bitowe wyjaśniono w tabeli 4.

Tabela 4. Znaczenie danych przesyłanych przez moduł PmodTC1

Numer bitu Opis
31 – 18 Zmierzona wartość temperatury w postaci 14-bitowej liczby stałoprzecinkowej ze znakiem; rozdzielczość wynosi 0,25°C/LSB.
16 Wartość 1 oznacza, że wystąpił jeden z błędów zakodowanych na bitach 2 – 0.
15 – 4 Temperatura zimnego złącza mierzona wewnątrz układu MAX31855; wartość zmierzona ma postać 12-bitowej liczby stałoprzecinkowej ze znakiem, o rozdzielczości 0,0625°C/LSB.
2 Wartość 1 oznacza błąd zwarcia termopary do napięcia zasilania.
1 Błąd zwarcia termopary do masy sygnalizowany przez wartość 1.
0 Wartość 1 oznacza błąd niepodłączenia termopary.

 

Rysunek 5. Dane wysyłane przez moduł PmodTC1

Konwersja temperatury nie wymaga wyzwalania, ponieważ wykonywana jest przez cały czas. Czas trwania pojedynczej konwersji to 100 ms. Wartości zmierzone przechowywane w pamięci, a także flagi błędów są aktualizowane tylko wtedy kiedy sygnał CS jest w stanie wysokim, czyli nie ma aktywnej transmisji danych. Należy również pamiętać, że układ jest gotowy do pracy dopiero po 200 ms od włączenia zasilania.

Kod projektu

Kod do konfiguracji modułu PmodTC1 znajduje się w funkcji PmodTC1_Config w pliku src/PmodTC1.c. Funkcja ta konfiguruje interfejs SPI1 w trybie 1 (CPOL = 0, CPHA = 1), z programową kontrolą sygnału CS i danymi o długości 16 bitów. Dodatkowo SPI jest konfigurowany w trybie tylko do odczytu ze względu na brakujący sygnał MOSI. Opisaną konfigurację przedstawiono na listingu 6. Inicjalizacja GPIO znajduje się tak jak zwykle w funkcji HAL_SPI_MspInit, która jest wywoływana przez bibliotekę STM32Cube wewnątrz funkcji HAL_SPI_Init.

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

Listing 6. Konfiguracja interfejsu SPI dla modułu PmodTC1

void PmodTC1_Config(void)
{
  pmodTc1Spi.Instance = SPI1;
  pmodTc1Spi.Init.Mode = SPI_MODE_MASTER;
  pmodTc1Spi.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  pmodTc1Spi.Init.DataSize = SPI_DATASIZE_16BIT;
  pmodTc1Spi.Init.CLKPolarity = SPI_POLARITY_LOW;
  pmodTc1Spi.Init.CLKPhase = SPI_PHASE_2EDGE;
  pmodTc1Spi.Init.NSS = SPI_NSS_SOFT;
  pmodTc1Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  pmodTc1Spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
  pmodTc1Spi.Init.TIMode = SPI_TIMODE_DISABLE;
  pmodTc1Spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  pmodTc1Spi.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  HAL_SPI_Init(&pmodTc1Spi);
}

Odczyt danych

Za odczyt danych odpowiedzialna jest funkcja PmodTC1_GetValues, która odczytuje 32-bitowe dane w postaci dwóch słów 16-bitowych i konwertuje je na dwie wartości zmiennoprzecinkowe. W każdym z dwóch słów sprawdzany jest bit znaku znajdujący się na najstarszym bicie. Jego wartość jest zapamiętywana i uwzględniana po konwersji liczby stałoprzecinkowej na zmiennoprzecinkową. Należy pamiętać o tym, że każda z wartości jest przesunięta ze względu na bity przechowujące kody błędów i bity nieużywane. Procedurę konwersji pokazano na listingu 7.

Listing 7. Odczyt i konwersja danych z modułu PmodTC1

void PmodTC1_GetValues(float* temp, float* tempRef, uint8_t* status)
{
  uint16_t data[2] = {0};
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
  HAL_SPI_Receive(&pmodTc1Spi, (uint8_t*)data, 2, 100);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
  uint16_t tempSign = data[0] & 0x8000;
  data[0] &= ~0x8000;
  *temp = (data[0] >> 2) / 4.0;
  if(tempSign != 0)
    *temp *= -1;
  uint16_t tempRefSign = data[1] & 0x8000;
  data[1] &= ~0x8000;
  *tempRef = (data[1] >> 4) / 16.0;
  if(tempRefSign != 0)
    *tempRef *= -1;
  *status = data[1] & 0x03;
}

W głównej pętli programu dane z modułu są odczytywane co 500 ms, a zmierzone wartości temperatury i kody błędów są wysyłane na port szeregowy LPUART1 za pośrednictwem funkcji Serial_Write.

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