Nincs leírás

Juraj Ďuďák 050adec6d6 Merge branch 'MN_API_UPDATE' of irep/DMP-ICM20948 into master 9 hónapja
inc 1bdee9f8df Added API config. methods. 10 hónapja
src 1bdee9f8df Added API config. methods. 10 hónapja
.gitignore ea59ca32a7 Initial commit 11 hónapja
LICENSE ea59ca32a7 Initial commit 11 hónapja
README.md 0dda453a7b doplnok 2 10 hónapja

README.md

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

// 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
	}

}