Digilent Pmod i STM32 (cz. 8) – PmodMTDS, PmodRTCC i PmodCMPS2
PmodCMPS2
Ostatnim z prezentowanych w tej części modułów jest PmodCMPS2 z układem Memsic MMC34160PJ. Jest to 3-osiowy czujnik pola magnetycznego o zakresie ±16G, a także konfigurowanej rozdzielczości 12, 14 lub 16 bitów. Do obsługi modułu udostępniono bibliotekę przygotowaną na platformę Arduino. Kod biblioteki może być pobrany bezpośrednio ze strony firmy Digilent: https://reference.digilentinc.com/reference/pmod/pmodcmps2/start
W jej skład wchodzi pojedyncza klasa – CMPS2 służąca do konfiguracji i komunikacji z modułem PmodCMPS2. Oprócz podstawowych funkcji do odczytu pomiarów zawiera ona także metodę readHeading, umożliwiającą odczyt kierunku kompasowego, jednak ze względu na brak kompensacji pochylenia układu daje ona poprawne wyniki wyłącznie podczas pracy na płaszczyźnie XY.
Połączenie z zestawem KAmeleon
Moduł PmodCMPS2 wyposażono w 6-pinowe złącze interfejsu I2C z dwoma nieużywanymi pinami. W przykładzie zostało ono podłączone do magistrali I2C wyprowadzonej na złącze ARDUINO CONNECTOR na płytce KAmeleon, tak jak na fotografii 8. Opis połączeń znajduje się w tabeli 6.
Tabela 6. Sposób podłączenia modułu PmodCMPS2 do złącza ARDUINO CONNECTOR zestawu KAmeleon
Sygnał | Numer pinu PmodCMPS2 | Numer pinu KAmeleon ARDUINO CONNECTOR | Pin mikrokontrolera |
SCL | 3 (J1) | D15 | PF14 |
SDA | 4 (J1) | D14 | PF15 |
Kod przykładu
Za konfigurację interfejsu I2C odpowiada metoda init klasy CMPS2, przedstawiona na listingu 8. Zmodyfikowano ją tak, aby współpracowała z mikrokontrolerem STM32L496ZGT6. Konfiguracja I2C4 jest analogiczna do tej z poprzedniego przykładu, jednak tym razem konfigurowane są także rejestry Internal Control 0 (0x07) i Internal Control 1 (0x08) – pojedynczy pomiar z rozdzielczością 16 bitów i czasem trwania 7,92 ms.
Listing 8. Inicjalizacja interfejsu I2C dla modułu PmodCMPS2
void CMPS2::init() { __HAL_RCC_I2C4_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C4; GPIO_InitStruct.Pin = GPIO_PIN_14 | GPIO_PIN_15; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); this->i2cHandle.Instance = I2C4; this->i2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; this->i2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; this->i2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; this->i2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; this->i2cHandle.Init.OwnAddress1 = 0x01; this->i2cHandle.Init.Timing = 0x10563046; HAL_I2C_Init(&this->i2cHandle); this->writeReg(intConReg0, 0x20); HAL_Delay(10); this->writeReg(intConReg1, 0x00); }
Komunikacja z układem MMC34160PJ
Do komunikacji z układem MMC34160PJ służą funkcje readReg i writeReg przedstawione na listingu 9. Tym razem do ich realizacji użyto funkcji bibliotecznych HAL_I2C_Mem_Read i HAL_I2C_Mem_Write umożliwiających dostęp do określonego adresu w ramach jednego urządzenia.
Listing 9. Funkcje do zapisu i odczytu rejestrów układu MMC34160PJ
uint8_t CMPS2::readReg(uint8_t addr) { uint8_t data; HAL_I2C_Mem_Read(&this->i2cHandle, this->deviceID, addr, 1, &data, 1, 100); return data; } void CMPS2::writeReg(uint8_t addr, uint8_t data) { HAL_I2C_Mem_Write(&this->i2cHandle, this->deviceID, addr, 1, &data, 1, 100); }
Funkcja main
Kod głównej funkcji programu znajduje się na listingu 10. Znajduje się w nim inicjalizacja modułu PmodCMPS2 (myCMPS.init), a także cykliczny odczyt kierunku do 10 ms (myCMPS.readHeading). Dodatkowo, jeżeli kierunek kompasowy znajduje się przedziale od -10 (350) do 10 stopni, to zapala się dioda LED1 podłączona do linii PC7, co sygnalizuje wykrycie północy.
Listing 10. Funkcja main przykładowej aplikacji dla PmodCMPS2
int main(void) { HAL_Init(); SystemClock_Config(); Led_Config(); CMPS2 myCMPS; myCMPS.init(); while(1) { HAL_Delay(10); int degree = myCMPS.readHeading( ); if(degree < 10 || degree > 350) Led_TurnOn(LED1); else Led_TurnOff(LED1); } }