一,概要
本项目使用MPU6050辅助IIC接口,挂载HMC5883L形成九轴传感器(加速度计、陀螺仪、磁力计)
资料:zysampof/zysampof-MuDong-MPU6050-Auxiliary-I2-C (github.com)(代码,原理图,制版文件,参考文档)
江协科技:资料下载(江协科技永远的神)
备注:项目暂未测试,欢迎留言交流
二,软件
辅助IIC有两种模式,一种是主模式,用于MPU6050读取外部传感器数据;一种是直通模式,用于系统处理器配置外部传感器
当系统处理器配置完毕时(直通模式),应切换为主模式,这样可以既可以节省IO口,又可以节省MCU的空间(直通模式说明上提及“直通模式下系统处理器也可以访问MPU6050”,不知道这是不是意味着可以用一根总线挂载两个设备)
MPU6050读取的数据储存在EXT_SENS_DATA寄存器
配置顺序为:
1.MPU6050设置直通模式
2.系统处理器配置HMC5883L
3.MPU6050读取HMC5883L
4.MPU6050设置主模式
5.系统处理器读取数据
MPU6050设置直通模式
void MPU6050_PassMode(void)
{
MyI2C_Init();
NineAxis_WriteReg(MPU6050_INT_PIN_CFG, 0x02);
NineAxis_WriteReg(MPU6050_USER_CTRL, 0x00);
}
MPU6050设置主模式
void MPU6050_MasMode(void)
{
MyI2C_Init();
NineAxis_WriteReg(MPU6050_INT_PIN_CFG, 0x00);
NineAxis_WriteReg(MPU6050_USER_CTRL, 0x22);
NineAxis_WriteReg(MPU6050_I2C_MST_CTRL, 0x0D);
}
MPU6050读取HMC5883L
void MPU6050_SlaveRead(void)
{
MyI2C_Init();
NineAxis_WriteReg(MPU6050_I2C_SLV0_ADDR, (HMC5883L_ADDRESS|0X80));
NineAxis_WriteReg(MPU6050_I2C_SLV0_REG, HMC5883L_REG_OUT_X_M);
NineAxis_WriteReg(MPU6050_I2C_SLV0_CTRL, 0x86);
}
MPU6050获取数据
void NineAxis_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ,
int16_t *GaX, int16_t *GaY, int16_t *GaZ)
{
uint8_t DataH, DataL;
DataH = NineAxis_ReadReg(MPU6050_ACCEL_XOUT_H);
DataL = NineAxis_ReadReg(MPU6050_ACCEL_XOUT_L);
*AccX = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_ACCEL_YOUT_H);
DataL = NineAxis_ReadReg(MPU6050_ACCEL_YOUT_L);
*AccY = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_ACCEL_ZOUT_H);
DataL = NineAxis_ReadReg(MPU6050_ACCEL_ZOUT_L);
*AccZ = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_GYRO_XOUT_H);
DataL = NineAxis_ReadReg(MPU6050_GYRO_XOUT_L);
*GyroX = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_GYRO_YOUT_H);
DataL = NineAxis_ReadReg(MPU6050_GYRO_YOUT_L);
*GyroY = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_GYRO_ZOUT_H);
DataL = NineAxis_ReadReg(MPU6050_GYRO_ZOUT_L);
*GyroZ = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_EXT_SENS_DATA_00);
DataL = NineAxis_ReadReg(MPU6050_EXT_SENS_DATA_01);
*GaX = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_EXT_SENS_DATA_02);
DataL = NineAxis_ReadReg(MPU6050_EXT_SENS_DATA_03);
*GaY = (DataH << 8) | DataL;
DataH = NineAxis_ReadReg(MPU6050_EXT_SENS_DATA_04);
DataL = NineAxis_ReadReg(MPU6050_EXT_SENS_DATA_05);
*GaZ = (DataH << 8) | DataL;
}
三,硬件
参考示例电路,原理图如下:
如有错误,欢迎指正。