Files
99_7018_lmx/apps/common/device/gSensor/mpu6050.c
2025-10-29 13:10:02 +08:00

135 lines
3.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "gSensor/mpu6050.h"
#include "gSensor/gSensor_manage.h"
#include "app_config.h"
#include "imuSensor_manage.h"
#if TCFG_MPU6050_EN
int gsensorlen = 32;
OS_MUTEX SENSOR_IIC_MUTEX;
spinlock_t sensor_iic;
u8 sensor_iic_init_status = 0;
#define ACCEL_ONLY_LOW_POWER 0
u8 mpu6050_register_read(u8 addr, u8 *data)
{
_gravity_sensor_get_ndata(I2C_ADDR_MPU6050_R, addr, data, 1);
return 0;
}
u8 mpu6050_register_write(u8 addr, u8 data)
{
gravity_sensor_command(I2C_ADDR_MPU6050_W, addr, data);
return 0;
}
u8 mpu6050_read_nbyte_data(u8 addr, u8 *data, u8 len)
{
return _gravity_sensor_get_ndata(I2C_ADDR_MPU6050_R, addr, data, len);
}
u8 mpu6050_get_xyz_data(u8 addr, void *xyz_data)
{
u8 buf[6], read_len;
axis_info_t *data = (axis_info_t *)xyz_data;
read_len = mpu6050_read_nbyte_data(addr, buf, 6);
if (read_len == 6) {
data->x = ((u16)buf[0] << 8) | buf[1];
data->y = ((u16)buf[2] << 8) | buf[3];
data->z = ((u16)buf[4] << 8) | buf[5];
data->x = 2 * ACCEL_OF_GRAVITY * ACCEL_DATA_GAIN * data->x / 32768;
data->y = 2 * ACCEL_OF_GRAVITY * ACCEL_DATA_GAIN * data->y / 32768;
data->z = 2 * ACCEL_OF_GRAVITY * ACCEL_DATA_GAIN * data->z / 32768;
}
return read_len;
}
extern void step_cal_init();
extern int step_cal();
u8 mpu6050_init()
{
u8 res = 0;
u8 data;
res = mpu6050_register_read(MPU6050_RA_WHO_AM_I, &data); //读ID
if (data == MPU_ADDR) {
g_printf("read MPU6050 ID suss");
} else {
g_printf("read MPU6050 ID err");
return -1;
}
data = 0x80;
mpu6050_register_write(MPU6050_RA_PWR_MGMT_1, data); //复位
os_time_dly(10);
data = 0x00;
data |= BIT(3); //关闭温度传感器
#if ACCEL_ONLY_LOW_POWER
data |= BIT(5); //设置accel-only低功耗模式
#endif
mpu6050_register_write(MPU6050_RA_PWR_MGMT_1, data); //退出休眠
data = 0x00;
data |= (BIT(0) | BIT(1) | BIT(2)); //关闭陀螺仪
#if ACCEL_ONLY_LOW_POWER
data |= (3 << 6); //accel-only低功耗模式下唤醒频率为40Hz
#endif
/*mpu6050_register_write(MPU6050_RA_PWR_MGMT_2, data);*/
data = ACCEL_RANGE_2G << 3;
mpu6050_register_write(MPU6050_RA_ACCEL_CONFIG, data); //加速度计量程
#if (!ACCEL_ONLY_LOW_POWER)
data = 0x06;
mpu6050_register_write(MPU6050_RA_CONFIG, data); //设置陀螺仪输出速率
data = MPU6050_GYRO_OUT_RATE / MPU6050_SAMPLE_RATE - 1;
mpu6050_register_write(MPU6050_RA_SMPLRT_DIV, data); //设置采样率, 采样率=陀螺仪输出速率/(1+SMPLRT_DIV)
data = 0x00;
mpu6050_register_write(MPU6050_RA_INT_ENABLE, data); //关闭中断
data = 0x00;
mpu6050_register_write(MPU6050_RA_USER_CTRL, data); //关闭主机IIC
#endif
/*step_cal_init();*/
/*sys_timer_add(NULL, step_cal, 50);*/
return 0;
}
void mpu6050_ctl(u8 cmd, void *arg)
{
switch (cmd) {
case GET_ACCEL_DATA:
case IMU_GET_ACCEL_DATA:
mpu6050_get_xyz_data(MPU6050_RA_ACCEL_XOUT_H, arg);
break;
case IMU_GET_GYRO_DATA:
mpu6050_get_xyz_data(MPU6050_RA_GYRO_XOUT_H, arg);
break;
case READ_GSENSOR_DATA:
break;
}
}
REGISTER_GRAVITY_SENSOR(gSensor) = {
.logo = "mpu6050",
.gravity_sensor_init = mpu6050_init,
.gravity_sensor_check = NULL,
.gravity_sensor_ctl = mpu6050_ctl,
};
//未合到imu: init:gravity_sensor_init(&motion_sensor_data);
REGISTER_IMU_SENSOR(mpu6050_sensor) = {
.logo = "mpu6050",
.imu_sensor_init = mpu6050_init,
.imu_sensor_check = NULL,
.imu_sensor_ctl = mpu6050_ctl,
};
#endif //TCFG_MPU6050_EN