LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

Digilent Pmod i STM32 (cz. 9) – PmodNAV, PmodPMON1 i PmodTMP2

PmodTMP2

Ostatnim omawianym modułem w tej części cyklu jest PmodTMP2 z układem Analog Devices ADT7420. Jest to cyfrowy czujnik temperatury o rozdzielczości pomiaru 16 bitów i dokładności:

  • ±0,20°C w zakresie od −10°C do +85°C przy zasilaniu 3,0V
  • ±0,25°C w zakresie od −20°C to +105°C przy zasilaniu od 2,7V do 3,3V.

Fotografia 6. Wygląd modułu PmodTMP2

Moduł ADT7420 umożliwia zdefiniowanie trzech alarmów dla zdefiniowanych progów temperatury:

  • niski,
  • wysoki,
  • krytyczny.

Po przekroczeniu progów niskiego i wysokiego, na linii INT pojawia się sygnał. Natomiast przekroczenie poziomu krytycznego wyzwala przerwanie na linii CT. Obu sygnałów można użyć do obsługi przerwania po stronie mikrokontrolera. Moduł PmodTMP2 udostępnia oba sygnały na złączach J2 (CT) i J3 (INT). Wszystkie zdefiniowane alarmy mogą także używać wartości histerezy wpływającej na wyłączenie alarmu. Sposób generacji przerwania we wszystkich trzech przypadkach przedstawiono na rysunku 7.

Rysunek 7. Generacja przerwań od poszczególnych progów temperatury (źródło: dokumentacja układu ADT7420)

Połączenie z zestawem KAmeleon

Moduł PmodTMP2 został wyposażony w 8-pinowe złącze Pmod I2C (J1), które w przykładzie zostało podłączono do złącza I2C KAmod Expander zestawu KAmeleon. Dodatkowo sygnał INT podłączono do pinu PF15 (D10) na złączu ARDUINO. Sposób połączenia przedstawiono w tabeli 3 i na fotografii 8.

Tabela 3. Sygnały PmodTMP2 oraz odpowiadające im piny złącz ARDUINO, I2C Expander oraz wyprowadzenia mikrokontrolera; w tabeli pominięto linie zasilania występujące na złączu Pmod

Sygnał Numer pinu PmodTMP2 Pin złącza ARDUINO CONNECTOR Pin złącza I2C Expander Pin mikrokontrolera
SCL 1 (J2) 2 PF1
SDA 2 (J2) 3 PF0
INT 3 (J1) D14 PF15

Fotografia 8. Moduł PmodTMP2 połączony z zestawem KAmeleon

Kod przykładu

Kod do komunikacji z modułem PmodTMP2 znajduje się w plikach PmodTMP2.c i PmodTMP2.h. Funkcja służąca do konfiguracji interfejsu I2C i układu ADT7420 – PmodTMP2_Config, znajduje się na listingu 7. W pierwszej kolejności pin PF15 ustawiany jest jako wejście z przerwaniem wyzwalanym zboczem opadającym. Następnie konfigurowany jest interfejs I2C2, dla którego piny (PF0 i PF1) są ustawiane w funkcji HAL_I2C_MspInit wywoływanej wewnątrz HAL_I2C_Init. Na koniec konfigurowane są progi temperatury: niski i wysoki. Wartości progów temperatury przed wpisaniem do rejestrów muszą być przesunięcie o 7 bitów w lewo, co jest jednoznaczne z ich pomnożeniem przez 128. Histereza jest wpisywana bezpośrednio do rejestru i może przyjąć wartości od 0°C do 15°C. Podczas zapisu i odczytu rejestrów układ ADT7420 inkrementuje adres, dlatego jest możliwy zapis i odczyt wielu rejestrów podczas pojedynczej transakcji I2C.

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

Listing 7. Konfiguracja pinów i interfejsu I2C2 dla modułu PmodTMP2

void PmodTMP2_Config(int16_t maxTemp, int16_t minTemp, uint8_t hyst)
{
  // Configure the interrupt (PF15) for temperature thresholds.
  __HAL_RCC_GPIOF_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Pin = GPIO_PIN_15;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

  pmodTmp2I2c.Instance = I2C2;
  pmodTmp2I2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  pmodTmp2I2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  pmodTmp2I2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  pmodTmp2I2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  pmodTmp2I2c.Init.OwnAddress1 = 0x01;

  // Set the I2C_TIMINGR register to fulfill the ADT7420 timing requirements (max 400kHz).
  pmodTmp2I2c.Init.Timing = 0x10563046;

  HAL_I2C_Init(&pmodTmp2I2c);

  // The temperature thresholds are shifted left by 7 bits.
  maxTemp *= 128;
  minTemp *= 128;

  uint8_t tHigh[2] = {maxTemp >> 8, maxTemp & 0x0F};
  uint8_t tLow[2] = {minTemp >> 8, minTemp & 0x0F};
  uint8_t tHyst = hyst;

  HAL_I2C_Mem_Write(&pmodTmp2I2c, PMODTMP2_ADDRESS, 0x04, 1, tHigh, 2, 100);
  HAL_I2C_Mem_Write(&pmodTmp2I2c, PMODTMP2_ADDRESS, 0x06, 1, tLow, 2, 100);
  HAL_I2C_Mem_Write(&pmodTmp2I2c, PMODTMP2_ADDRESS, 0x0A, 1, &tHyst, 1, 100);
}

Odczyt i konwersja danych

Drugą z funkcji potrzebnych do obsługi modułu PmodTMP2 jest PmodTMP2_GetTemperature odpowiedzialna za odczyt i konwersję zmierzonej temperatury. Podobnie jak w przypadku progów, zmierzona wartość temperatury zapisana jest w kodzie uzupełnień do dwójki. Wartość zwracana z funkcji ma dokładność 0,1°C, dlatego przed dzieleniem przez 128 wynik należy pomnożyć przez 10. Kod funkcji przedstawiono na listingu 8.

Listing 8. Odczyt i konwersja temperatury

nt16_t PmodTMP2_GetTemperature()
{
  // Read the current temperature value (2 bytes).
  uint8_t data[2] = {0};
  HAL_I2C_Mem_Read(&pmodTmp2I2c, PMODTMP2_ADDRESS, 0x00, 1, data, 2, 100);

  int16_t temperature = (data[0] << 8) | data[1];

  // The temperature value has 0.0625°C resolution and is shifted left by 3 bits.
  // It is multiplied by 10 to keep the 0.1°C resolution of the result.
  temperature = (temperature * 10) / 128;
  return temperature;
}

Przykładowa aplikacja, której kod znajduje się w pliku main.c, konfiguruje moduł PmodTMP2 i ustawia początkowy stan diody LED 0 informującej o przekroczeniu jednego z ustawionych progów temperatury. Następnie w pętli głównej programu co 1 s odczytywana jest wartość temperatury przesyłana następnie za pośrednictwem portu szeregowego do komputera. W pliku main.c znajduje się także funkcja obsługi przerwania od linii INT zmieniając stan diody LED 0 na płytce KAmeleon.

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