前言
文章分为2部分,第一部分是代码讲解和编写思路,第二部分是所有代码的集合,复制即用。
代码分解
include
#include <stdio.h>
#include<driver/i2c.h>
#include<math.h>
变量
accel_scale是加速度系数,用于将获得的加速度寄存器的值映射到所配置的加速度取值范围内
当选择加速度的范围为正负2g时,加速度系数为16384
当选择加速度的范围为正负4g时,加速度系数为8192
当选择加速度的范围为正负8g时,加速度系数为4096
当选择加速度的范围为正负16g时,加速度系数为2048
gyro_scale是角速度系数,用于将获得的陀螺仪寄存器的值映射到所配置的角速度取值范围内
当选择角速度的范围为正负2g时,角速度系数为16384
当选择角速度的范围为正负4g时,角速度系数为8192
当选择角速度的范围为正负8g时,角速度系数为4096
当选择角速度的范围为正负16g时,角速度系数为2048
calibration_array时校正数组,用于对mpu6050产生的数据进行校正,相当于天平的配平。
float accel_scale=16384;
float gyro_scale=131;
float calibration_array[6]={0};
写寄存器函数
void write_register(uint8_t *data){
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, 0x68<<1|0, true);
i2c_master_write(cmd, data, sizeof(data), true);
i2c_master_stop(cmd);
i2c_master_cmd_begin(0, cmd, 1000 / portTICK_PERIOD_MS);
i2c_cmd_link_delete(cmd);
}
读寄存器函数
这里的0x68是mpu6050的I2C地址
uint8_t read_register(uint8_t reg){
uint8_t data;
i2c_master_write_read_device(0,0x68,®,1,&data,1,1000/portTICK_PERIOD_MS);
return data;
}
I2C初始化函数
这里的sda是esp32的GPIO4,scl是esp32的GPIO5,速度为400kHz
void I2C_init(void){
i2c_config_t conf={
.mode=I2C_MODE_MASTER,
.sda_io_num=4,
.scl_io_num=5,
.sda_pullup_en=1,
.scl_pullup_en=1,
.master.clk_speed=400000
};
i2c_param_config(0,&conf);
i2c_driver_install(0,I2C_MODE_MASTER,0,0,0);
}
mpu6050初始化函数
mpu6050通电时是默认处于睡眠状态的,需要唤醒,配置加速度和角速度的范围
GYRO_CONFIG[]={27,0x0} 正负2g GYRO_CONFIG[]={27,0x08} 正负4g
GYRO_CONFIG[]={27,0x10} 正负8g GYRO_CONFIG[]={27,0x18} 正负16g
ACCEL_CONFIG[]={28,0x0} 正负2g ACCEL_CONFIG[]={28,0x08} 正负4g
ACCEL_CONFIG[]={28,0x10} 正负8g ACCEL_CONFIG[]={28,0x18} 正负16g
该函数的作用,配置一些寄存器,根据配置的加速度和角速度取值范围设定相应系数
void MPU6050_init(void){
uint8_t gyroscope_config_register=27;
uint8_t accel_config_register=28;
uint8_t poweron[]={107,0x01};
uint8_t DLPF_CFG[]