No Description

Juraj Ďuďák 0dda453a7b doplnok 2 1 month ago
inc 0dda453a7b doplnok 2 1 month ago
src 0dda453a7b doplnok 2 1 month ago
.gitignore ea59ca32a7 Initial commit 1 month ago
LICENSE ea59ca32a7 Initial commit 1 month ago
README.md 0dda453a7b doplnok 2 1 month ago

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
	}

}