MPU6050辅助IIC(HMC5883L,STM32F103C8T6)

一,概要

        本项目使用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;	
}

三,硬件

参考示例电路,原理图如下:

如有错误,欢迎指正。

  • 23
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
//*************************************************** void Single_Write_HMC5883(uchar REG_Address,uchar REG_data) { HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf HMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdf HMC5883_Stop(); //发送停止信号 } //********单字节读取内部寄存器************************* uchar Single_Read_HMC5883(uchar REG_Address) { uchar REG_data; HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始 HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=HMC5883_RecvByte(); //读出寄存器数据 HMC5883_SendACK(1); HMC5883_Stop(); //停止信号 return REG_data; } //****************************************************** // //连续读出HMC5883内部角度数据,地址范围0x3~0x5 // //****************************************************** void Multiple_read_HMC5883(void) { uchar i; HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号 HMC5883_SendByte(0x03); //发送存储单元地址,从0x3开始 HMC5883_Start(); //起始信号 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号 for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = HMC5883_RecvByte(); //BUF[0]存储数据 if (i == 5) { HMC5883_SendACK(1); //最后一个数据需要回NOACK } else { HMC5883_SendACK(0); //回应ACK } } HMC5883_Stop(); //停止信号 Delay5ms(); } //初始化HMC5883,根据需要请参考pdf进行修改**** void Init_HMC5883() { Single_Write_HMC5883(0x02,0x00); // }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值