|
|
1 month ago | |
|---|---|---|
| inc | 1 month ago | |
| src | 1 month ago | |
| .gitignore | 1 month ago | |
| LICENSE | 1 month ago | |
| README.md | 1 month ago |
Knižnica je odvodená z knižnice https://github.com/isouriadakis/Arduino_ICM20948_DMP_Full-Function
Vlastnosti
Pre implementáciu na STM32 je potrtebné skontrolovať súbory:
main.h, v ktorom sú definované piny pre SPI rozhranie. Pimny musia byť pomenované nasledovne:stm32l0xx_hal.h// 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
}
}