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.
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.
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.