Digilent Pmod i STM32 (cz. 9) – PmodNAV, PmodPMON1 i PmodTMP2
PmodPMON1
Moduł PmodPMON1 jest monitorem mocy składającym się z dwóch układów firmy Analog Devices: ADM119 i AD5112. Pierwszy układ to monitor prądu i napięcia z możliwością generacji alarmu po przekroczeniu zadanej wartości natężenia prądu, ustalanej poprzez napięcie podawane na pin SETV. Do tego celu służy drugi z układów – AD5112, będący potencjometrem cyfrowym o całkowitej rezystancji 5 kΩ i 64 pozycjach ślizgacza. Sposób połączenia obu układów przedstawiono na rysunku 4.
Rysunek 4. Połączenie układów ADM119 i AD512 w module PmodPMON1 (źródło: dokumentacja modułu PmodPMON1)
Oba układy są podłączone do jednej magistrali I2C. Potencjometr jest widoczny pod adresem 0x2F, natomiast monitor ma adres konfigurowany za pomocą zworek JP1 i JP2. W przykładzie obie zworki są ustawione w pozycji 1, dzięki czemu ustawiony jest adres 0x30.
Połączenie z płytką KAmeleon
Moduł PmodPMON1 posiada 8-pinowe złącze Pmod I2C (J2) służące do komunikacji z obydwoma układami. Oprócz tego dostępne są: złącze J1, zawierające sygnały CONV (wyzwalanie konwersji) i ALERT (powiadomienie o przekroczeniu progu), a także J3 służące do podłączenie mierzonego układu. Do podłączenia modułu zostały wykorzystane dwa złącza na płytce KAmeleon, oznaczone jako: I2C KAmod Expander i ARDUINO CONNECTOR, zgodnie z tabelą 2.
Tabela 2. Sygnały PmodPMON1 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 PmodPMON1 | Pin złącza ARDUINO CONNECTOR | Pin złącza I2C Expander | Pin mikrokontrolera |
SCL | 1 (J2) | – | 2 | PF1 |
SDA | 2 (J2) | – | 3 | PF0 |
CONV | 1 (J1) | D15 | – | PF14 |
ALERT | 3 (J1) | D14 | – | PF15 |
Kod przykładu
Kod do obsługi modułu PmodPMON1 znajduje się w plikach PmodPMON1.c oraz PmodPMON1.h i składa się z czterech funkcji. Pierwsze dwie zajmują się konfiguracją interfejsu I2C i wyprowadzeń mikrokontrolera. Fragment funkcji PmodPMON1_Config przedstawiono na listingu 6. Konfiguruje ona interfejs I2C oraz oba układy znajdujące się w module PmodPMON1. Komenda 0x05 przesyłana do układu ADM119 uruchamia ciągłą konwersję natężenia prądu oraz napięcia. Z kolei bajty 0x02 i 0x01 przesłane do potencjometru AD5112 ustawiają wartość rezystancji zgodnie z zależnością:
W równaniu tym wartość D jest równa drugiemu z bajtów (0x01), a wartości rezystancji RAB i RW wynoszą odpowiednio 5 kΩ i 70 Ω. Takie ustawienie potencjometru ustala napięcie ~89mV na wejściu SETV monitora ADM119, co z kolei powoduje generację alarmu po przekroczeniu natężenia prądu o wartości ~49mA ze względu na wartość rezystora pomiarowego (R2) wynoszącą 0,1 Ω i wzmocnienie napięciowe układu pomiarowego wynoszące 18.
Funkcja PmodPMON1_Config konfiguruje także dwa piny mikrokontrolera podłączone do sygnałów CONV (PF14) oraz ALERT (PF15). Pierwszy z nich jest ustawiany jako wyjście w stanie wysokim, co wymusza ciągłą konwersję. Drugi jest wejściem z przerwaniem wyzwalanym na obu zboczach sygnału.
Listing 6. Fragment funkcji konfigurującej interfejs I2C
void PmodPMON1_Config(void) { ... pmodPmon1I2c.Instance = I2C2; pmodPmon1I2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; pmodPmon1I2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; pmodPmon1I2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; pmodPmon1I2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; pmodPmon1I2c.Init.OwnAddress1 = 0x01; // Set the I2C_TIMINGR register. pmodPmon1I2c.Init.Timing = 0x10563046; HAL_I2C_Init(&pmodPmon1I2c); PmodMON1_ClearAlarm(); uint8_t monCommand = 0x05; HAL_I2C_Master_Transmit(&pmodPmon1I2c, PMODPMON1_MON_ADDRES, &monCommand, 1, 100); uint8_t potCommand[2] = {0x02, 0x01}; HAL_I2C_Master_Transmit(&pmodPmon1I2c, PMODPMON1_POT_ADDRES, potCommand, 2, 100); }
Druga z funkcji konfiguracyjnych – HAL_I2C_MspInit ustawia piny PF0 i PF1 w funkcji alternatywnej AF4 dla interfejsu I2C2. Zgodnie z konwencją biblioteki STM32Cube, jest ona wywoływana wewnątrz funkcji HAL_I2C_Init.
Odczyt i konwersja danych
Kolejną funkcją zaimplementowaną w pliku PmodPMON1.c jest PmodPMON1_GetMeasurements. Odczytuje ona trzy rejestry przechowujące ostatnio zmierzone wartości napięcia i natężenia prądu. Odczyty te są następnie konwertowane według zależności:
VFULLSCALE, IFULLSCALE i Sense Resistor wynoszą odpowiednio 26,52 V, 105,84 mV i 0,1Ω.
Ostatnia funkcja – PmodMON1_ClearAlarm, czyści flagę alarmu w układzie ADM119. Powoduje to zmianę stanu linii ALERT, chyba że próg alarmowy jest w dalszym ciągu przekroczony. Wówczas flaga jest ponownie ustawiania, a linia ALERT pozostaje w stanie aktywnym, czyli niskim.
Plik main.c implementuje dwie funkcje. HAL_GPIO_EXTI_Callback obsługuje przerwania od linii ALERT. Jeżeli alarm jest aktywny (stan niski), to zapalana jest dioda LED1 (PC7) i ustawiana jest programowa flaga alarmFlag. W przeciwnym razie dioda jest gaszona a flaga zerowana. W funkcji main wykonywana jest najpierw konfiguracja modułu PmodPMON1, a następnie w pętli sprawdzana jest flaga alarmFlag – jeżeli została ona ustawiona w przerwaniu, to jest wywoływana opisana wyżej funkcja zerująca alarm. Następnie odczytywane są wartości napięcia i natężenia prądu zmierzone przez układ ADM119 i wysyłane za pośrednictwem portu szeregowego LPUART1, widocznego na komputerze jako wirtualny port szeregowy. Przykładowy układ pomiarowy przedstawiono na fotografii 5.
Fotografia 5. Moduł PmodPMON1 podłączony do zestawu KAmeleon