# DMP-ICM20948 Knižnica je odvodená z knižnice https://github.com/isouriadakis/Arduino_ICM20948_DMP_Full-Function Vlastnosti - port pre STM32 - Rozhranie I2C, SPI - Obsahuje originál FW pre čip ICM20948 - Výstup sú surové dáta alebo spracované cez DMP ## Opis rozhrania Pre implementáciu na STM32 je potrtebné skontrolovať súbory: - HAL_STM32_Config.h - konštanta USE_SPI definuje rozhranie, ktoré bude použité pre low-level komunikáciu - tento súbor je závislý na konfigurácii hlavnej aplikácie `main.h`, v ktorom sú definované piny pre SPI rozhranie. Pimny musia byť pomenované nasledovne: - SPI_CS - tento súbor je závislý na *hal* konfigurácii `stm32l0xx_hal.h` - HAL_impl.c - obsahuje implementáciu low-level komunikácie cez I2C/SPI ## Vzorový kód ```c // app.cpp #include "app.h" extern SPI_HandleTypeDef hspi1; extern UART_HandleTypeDef huart1; volatile uint8_t tx_ready = 1; void tx_done(UART_HandleTypeDef *h) { tx_ready = 1; } void run_icm20948_quat6_controller(DMP_ICM20948 *icm20948, uint8_t inEuler) { float quat_w, quat_x, quat_y, quat_z; float roll, pitch, yaw; char sensor_string_buff[128]; uint8_t byte_angles[128]; float float_angles[3] = {0,0,0}; if (inEuler) { if (icm20948->euler6DataIsReady()) { if (tx_ready == 1){ icm20948->readEuler6Data(&roll, &pitch, &yaw); float_angles[0] = roll; float_angles[1] = pitch; float_angles[2] = yaw; memcpy(byte_angles, float_angles, sizeof(float_angles)); tx_ready = 0; uint8_t ok = HAL_UART_Transmit_DMA(&huart1, byte_angles, 3*sizeof(float)); if(ok == HAL_OK){ HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin); } } } } else { if (icm20948->quat6DataIsReady()) { icm20948->readQuat6Data(&quat_w, &quat_x, &quat_y, &quat_z); } } } void app() { DMP_ICM20948 icm; DMP_ICM20948Settings icmSettings = { .mode = 1, // 0 = low power mode, 1 = high performance mode .enable_gyroscope = false, // Enables gyroscope output .enable_accelerometer = false, // Enables accelerometer output .enable_magnetometer = false, // Enables magnetometer output // Enables quaternion output .enable_gravity = false, // Enables gravity vector output .enable_linearAcceleration = false, // Enables linear acceleration output .enable_quaternion6 = true, // Enables quaternion 6DOF output .enable_quaternion9 = false, // Enables quaternion 9DOF output .enable_har = false, // Enables activity recognition .enable_steps = false, // Enables step counter .gyroscope_frequency = 225, // Max frequency = 225, min frequency = 1 .accelerometer_frequency = 225, // Max frequency = 225, min frequency = 1 .magnetometer_frequency = 70, // Max frequency = 70, min frequency = 1 .gravity_frequency = 225, // Max frequency = 225, min frequency = 1 .linearAcceleration_frequency = 225, // Max frequency = 225, min frequency = 1 .quaternion6_frequency = 225, // Max frequency = 225, min frequency = 50 .quaternion9_frequency = 50, // Max frequency = 225, min frequency = 50 .har_frequency = 225, // Max frequency = 225, min frequency = 50 .steps_frequency =225 // Max frequency = 225, min frequency = 50 }; icm.init(icmSettings); HAL_UART_RegisterCallback(&huart1, HAL_UART_TX_COMPLETE_CB_ID, tx_done); while(1){ icm.task(); //run_icm20948_accel_controller(); //run_icm20948_gyro_controller(); //run_icm20948_mag_controller(); //run_icm20948_linearAccel_controller(); //run_icm20948_grav_controller(); run_icm20948_quat6_controller(&icm, true); //run_icm20948_quat9_controller(true); //run_icm20948_har_controller(); //run_icm20948_steps_controller(); HAL_Delay(100); // pozor na tento delay } } ```