165 lines
4.3 KiB
C
165 lines
4.3 KiB
C
#include "main.h"
|
|||
|
|
#include <stdbool.h>
|
||
|
|
#include "bmm350.h"
|
||
|
|
#include "bmm350_defs.h"
|
||
|
|
#include "bmm350_oor.h"
|
||
|
|
#include "FreeRTOS.h"
|
||
|
|
#include "cmsis_os2.h"
|
||
|
|
|
||
|
|
|
||
|
|
// I2C Handle
|
||
|
|
extern I2C_HandleTypeDef hi2c1;
|
||
|
|
extern osThreadId_t defaultTaskHandle;
|
||
|
|
extern osThreadId_t xIMU_Task;
|
||
|
|
extern osThreadId_t xMagn_Task;
|
||
|
|
//extern osThreadId_t xData_Task;
|
||
|
|
|
||
|
|
// ICM45686
|
||
|
|
typedef struct {
|
||
|
|
SPI_HandleTypeDef *hspi;
|
||
|
|
GPIO_TypeDef *GPIO_Port;
|
||
|
|
uint16_t GPIO_Pin;
|
||
|
|
|
||
|
|
uint8_t acc_fs;
|
||
|
|
uint8_t gyro_fs;
|
||
|
|
uint8_t odr;
|
||
|
|
float acc_ssf;
|
||
|
|
float gyro_ssf;
|
||
|
|
|
||
|
|
bool calibated;
|
||
|
|
// float accel_bias[3];
|
||
|
|
// float gyro_bias[3];
|
||
|
|
float imu_bias[7];
|
||
|
|
} ICM45686_HandleTypeDef;
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
float processed_imu_data[7];
|
||
|
|
} ICM45686_Data;
|
||
|
|
|
||
|
|
// dataframe for sending quaternions over usb
|
||
|
|
typedef struct __attribute__((packed)) {
|
||
|
|
uint8_t StartByte;
|
||
|
|
uint8_t SensorAddress;
|
||
|
|
float qw;
|
||
|
|
float qx;
|
||
|
|
float qy;
|
||
|
|
float qz;
|
||
|
|
uint8_t EndByte;
|
||
|
|
} QuaternionData;
|
||
|
|
|
||
|
|
// enum to hold the packet dataframe data
|
||
|
|
typedef enum {
|
||
|
|
PACKET_START_BYTE = 0xDE,
|
||
|
|
PACKET_END_BYTE = 0xAD
|
||
|
|
} Packet_Bytes;
|
||
|
|
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
ICM45686_WHO_AM_I = 0x72, // 0x72 = 01110010, dann den wert NIX(???)) einfach nur lesen
|
||
|
|
ICM45686_ACCEL_CONFIG0 = 0x1B,
|
||
|
|
ICM45686_GYRO_CONFIG0 = 0x1C,
|
||
|
|
ICM45686_FIFO_CONFIG0 = 0x1D,
|
||
|
|
ICM45686_PWR_MGMT0 = 0x10,
|
||
|
|
ICM45686_ODR_DECIMATE_CONFIG = 0x40,
|
||
|
|
ICM45686_ACCEL_DATA = 0x00,
|
||
|
|
ICM45686_GYRO_DATA = 0x06,
|
||
|
|
ICM45686_FIFO_COUNT = 0x12,
|
||
|
|
ICM45686_FIFO_DATA = 0x14
|
||
|
|
} ICM45686_registers;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
ICM45686_ACC_FS_32G = 0x00,
|
||
|
|
ICM45686_ACC_FS_16G = 0x10,
|
||
|
|
ICM45686_ACC_FS_8G = 0x20,
|
||
|
|
ICM45686_ACC_FS_4G = 0x30,
|
||
|
|
ICM45686_ACC_FS_2G = 0x40,
|
||
|
|
} ICM45686_ACC_CONF;
|
||
|
|
|
||
|
|
//typedef enum {
|
||
|
|
// ICM45686_ACC_SSF_32G = 16384.0,
|
||
|
|
// ICM45686_ACC_SSF_16G = 8192.0,
|
||
|
|
// ICM45686_ACC_SSF_8G = 4096.0,
|
||
|
|
// ICM45686_ACC_SSF_4G = 2048.0,
|
||
|
|
// ICM45686_ACC_SSF_2G = 1024.0,
|
||
|
|
//} ICM45686_ACC_FACTORS;
|
||
|
|
|
||
|
|
static const float ICM45686_ACC_SSF [5] = {
|
||
|
|
1024.0f, 2048.0f, 4096.0f, 8192.0f, 16384.0f
|
||
|
|
};
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
ICM45686_GYRO_FS_4000DPS = 0x00,
|
||
|
|
ICM45686_GYRO_FS_2000DPS = 0x10,
|
||
|
|
ICM45686_GYRO_FS_1000DPS = 0x20,
|
||
|
|
ICM45686_GYRO_FS_500DPS = 0x30,
|
||
|
|
ICM45686_GYRO_FS_250DPS = 0x40,
|
||
|
|
ICM45686_GYRO_FS_125DPS = 0x50,
|
||
|
|
ICM45686_GYRO_FS_62_5DPS = 0x60,
|
||
|
|
ICM45686_GYRO_FS_31_25DPS = 0x70,
|
||
|
|
ICM45686_GYRO_FS_15_625DPS = 0x80,
|
||
|
|
} ICM45686_GYRO_CONF;
|
||
|
|
|
||
|
|
//typedef enum {
|
||
|
|
// ICM45686_GYRO_SSF_4000DPS = 2097.2,
|
||
|
|
// ICM45686_GYRO_SSF_2000DPS = 1048.6,
|
||
|
|
// ICM45686_GYRO_SSF_1000DPS = 524.3,
|
||
|
|
// ICM45686_GYRO_SSF_500DPS = 262.0,
|
||
|
|
// ICM45686_GYRO_SSF_250DPS = 131.0,
|
||
|
|
// ICM45686_GYRO_SSF_125DPS = 65.8,
|
||
|
|
// ICM45686_GYRO_SSF_62_5DPS = 32.8,
|
||
|
|
// ICM45686_GYRO_SSF_31_25DPS = 16.4,
|
||
|
|
// ICM45686_GYRO_SSF_15_626DPS = 8.2,
|
||
|
|
//} ICM45686_GYRO_FACTORS;
|
||
|
|
|
||
|
|
static const float ICM45686_GYRO_SSF [9] = {
|
||
|
|
8.2f, 16.4f, 32.8f, 65.5f, 131.0f, 262.0f, 524.3f, 1048.6f, 2097.2f
|
||
|
|
};
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
ICM45686_ODR_6_4kHz_LN = 0x03 ,
|
||
|
|
ICM45686_ODR_3_2kHz_LN = 0x04,
|
||
|
|
ICM45686_ODR_1_6kHz_LN = 0x05,
|
||
|
|
ICM45686_ODR_800Hz_LN = 0x06,
|
||
|
|
ICM45686_ODR_400Hz_LNLP = 0x07,
|
||
|
|
ICM45686_ODR_200Hz_LNLP = 0x08,
|
||
|
|
ICM45686_ODR_100Hz_LNLP = 0x09,
|
||
|
|
ICM45686_ODR_50Hz_LNLP = 0x0A,
|
||
|
|
ICM45686_ODR_25Hz_LNLP = 0x0B,
|
||
|
|
ICM45686_ODR_12_5Hz_LNLP = 0x0C,
|
||
|
|
ICM45686_ODR_6_26Hz_LP = 0x0D,
|
||
|
|
ICM45686_ODR_3_125Hz_LP = 0x0E,
|
||
|
|
ICM45686_ODR_1_5625Hz_LP = 0x0F
|
||
|
|
} ICM45686_ODR;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
|
||
|
|
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *I2C_address);
|
||
|
|
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *I2C_address);
|
||
|
|
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
|
||
|
|
|
||
|
|
// ICM45686
|
||
|
|
void init_icm(ICM45686_HandleTypeDef *imu);
|
||
|
|
HAL_StatusTypeDef read_icm (ICM45686_HandleTypeDef *imu, uint8_t tx[], uint8_t rx[]);
|
||
|
|
HAL_StatusTypeDef read_icm_dma (ICM45686_HandleTypeDef *imu, uint8_t tx[], uint8_t rx[]);
|
||
|
|
HAL_StatusTypeDef write_icm (ICM45686_HandleTypeDef *imu, uint8_t tx[]);
|
||
|
|
void calibrate_icm (ICM45686_HandleTypeDef * imu, int samples);
|
||
|
|
|
||
|
|
// BMM350 - Declarations of read/write/delay functions for the BMM350 API
|
||
|
|
void bmm_init_DWT(void);
|
||
|
|
BMM350_INTF_RET_TYPE bmm350_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
|
||
|
|
BMM350_INTF_RET_TYPE bmm350_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
|
||
|
|
void bmm350_delay(uint32_t period_us, void *intf_ptr);
|
||
|
|
int8_t init_bmm(struct bmm350_dev *dev);
|
||
|
|
|
||
|
|
// structs that hold the sensor data
|
||
|
|
typedef struct {
|
||
|
|
uint8_t raw_imu[14];
|
||
|
|
uint8_t raw_magn [9];
|
||
|
|
} raw_sensor_data;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|