added code handling IMU and started writing stabilization code

This commit is contained in:
2025-08-09 00:54:26 +02:00
parent f24948bc09
commit 5d86bcfe26
220 changed files with 155202 additions and 0 deletions

120
Core/Inc/MPU6000.h Normal file
View File

@@ -0,0 +1,120 @@
/*
* MPU6000.h
*
* Created on: Nov 24, 2021
* Author: angoosh
*/
#ifndef INC_MPU6000_H_
#define INC_MPU6000_H_
#include "stm32g0xx_hal.h"
#define MPU6000_ADDRESS 0x68//0x68
#define ACCEL_RANGE 0 //2048 LSB/g
#define GYRO_RANGE 0 //32.8 LSB/deg/s
#define PERFORM_SELFTEST 0
//register description https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf
typedef enum {
GYRO_CONFIG = 0x1B,// register 27
ACCEL_CONFIG = 0x1C,// register 28
FIFO_EN = 0x23,
ACCEL_XOUT_H = 0x3B,
ACCEL_XOUT_L = 0x3C,
ACCEL_YOUT_H = 0x3D,
ACCEL_YOUT_L = 0x3E,
ACCEL_ZOUT_H = 0x3F,
ACCEL_ZOUT_L = 0x40,//sampl rate = reg 25 ; scale in reg 28
TEMP_OUT_H = 0x41,
TEMP_OUT_L = 0x42,
GYRO_XOUT_H = 0x43,
GYRO_XOUT_L = 0x44,
GYRO_YOUT_H = 0x45,
GYRO_YOUT_L = 0x46,
GYRO_ZOUT_H = 0x47,
GYRO_ZOUT_L = 0x48,// register 27 full scale setup
SENSOR_RESET = 0x68,
PWR_MGMT_1 = 0x6B,
PWR_MGMT_2 = 0x6C,
SMPLRT_DIV = 0x19,//register 25
WHO_AM_I = 0x75
} MPU6000_REG;
typedef enum {
ACCEL_16384_LSB_g = 0,
ACCEL_8192_LSB_g = 1,
ACCEL_4096_LSB_g = 2,
ACCEL_2048_LSB_g = 3,
GYRO_131_LSB_deg_s = 0,
GYRO_65_5_LSB_deg_s = 1,
GYRO_32_8_LSB_deg_s = 2,
GYRO_16_4_LSB_deg_s = 3,
} MPU6000_SCALE;
typedef struct{
float g_x;
float g_y;
float g_z;
float a_x;
float a_y;
float a_z;
int16_t cal_g_x;
int16_t cal_g_y;
int16_t cal_g_z;
int16_t cal_a_x;
int16_t cal_a_y;
int16_t cal_a_z;
float pitch;
float roll;
float yaw;
uint8_t gyro_data[6];
uint8_t accel_data[6];
uint8_t all_data[14];
float gyro_LSB;
float accel_LSB;
uint32_t pedo_steps;
float float_pedo_steps;
float pedo_threshold;
float pedo_work_vector[100];
float pedo_vector[100];
float pedo_a_x[100];
float pedo_a_y[100];
float pedo_a_z[100];
float pedo_avg_a_x;
float pedo_avg_a_y;
float pedo_avg_a_z;
uint8_t pedo_index;
uint8_t pedo_flag;
float pedo_vector_max;
float pedo_vector_avg;
uint32_t pedo_vector_samples;
uint32_t pedo_last_step_timestamp;
uint8_t rx_expected_flag;
I2C_HandleTypeDef *peripheral;
uint32_t timeout;
uint8_t dataReady;
} MPU6000_Typedef;
extern MPU6000_Typedef IMU;
void MPU6000_readGyro();
void MPU6000_readAccel();
int MPU6000_Init(I2C_HandleTypeDef *hi2c, uint32_t timeout);
uint8_t MPU6000_readRegister(uint8_t reg);
void MPU6000_Calibrate();
void MPU6000_Gyro();
void MPU6000_Raw_Data_Convert();
void MPU6000_readAll();
void MPU6000_Pedometer_Init();
void MPU6000_Pedometer();
void MPU6000_I2C_CallbackFunc(I2C_HandleTypeDef *hi2c);
void IMU_Check_State();
#endif /* INC_MPU6000_H_ */