无人机底层开发-MPU6050六轴传感器+磁力计初始化

  • MPU6050简单初始化步骤如下(仅供参考):
  1. 复位MPU6050。配置电源管理寄存器1(0x6B),复位:将bit7写1实现,复位后,默认值0x40,然后设置0x00-->唤醒MPU6050。
  2. 选择X/Y/Z其中一个轴作为参考坐标。同样也是配置电源管理寄存器1(0x6B)。
  3. 设置陀螺仪的输出频率。配置采样率分频寄存器(0x07),采样频率 = 陀螺仪输出频率/(1+SMPLRT_DIV) 。当DLPF is disable(DLPF_CFG=0 or 7),陀螺仪输出频率=8kHz;当DLPF is enabled(寄存器26),陀螺仪输出频率=1kHz
  4. 设置低通滤波频率。配置寄存器(0x1A),当滤波频率超过90Hz时无明显滤波效果。
  5. 设置陀螺仪最大量程。配置陀螺仪配置寄存器(0x1B)。
  6. 设置加速计最大量程。配置加速度传感器配置寄存器(0x1C);
//MPU6050初始化
//1:复位设备
//2:关闭复位模式,使用Z轴陀螺仪作为参考时钟
//3:设定陀螺仪的输出频率为1KHz
//4:设置低通滤波频率为42
//5:陀螺仪最大量程 +-2000度每秒
//6:加速度计最大量程 +-8G
void MPU6050_Init(void)
{
    MPU6050_Write_Byte(MPU6050_RA_PWR_MGMT_1, 0x80); // 复位MPU6050
    vTaskDelay(100/portTICK_PERIOD_MS);
    MPU6050_Write_Byte(MPU6050_RA_PWR_MGMT_1, MPU6050_CLOCK_PLL_ZGYRO);	// 使用Z轴参考时钟
    //采样频率 = 陀螺仪输出频率/(1+SMPLRT_DIV) 当DLPF is disable(DLPF_CFG=0 or 7)
    //陀螺仪输出频率=8kHz;当DLPF is enabled(寄存器26),陀螺仪输出频率=1kHz
    MPU6050_Write_Byte(MPU6050_RA_SMPLRT_DIV, 1000/(1000) - 1);	
    MPU6050_Write_Byte(MPU6050_RA_CONFIG, MPU6050_DLPF_BW_42);	//设置低通滤波频率,当滤波频率超过90Hz时无明显滤波效果
    MPU6050_Write_Byte(MPU6050_RA_GYRO_CONFIG, MPU6050_GYRO_FS);	//陀螺仪最大量程 + - 2000度每秒
    MPU6050_Write_Byte(MPU6050_RA_ACCEL_CONFIG, MPU6050_ACCEL_AFS); // 加速度计最大量程 +-8G
    MPU6050_Write_Byte(0x19, MPU6050_GYRO_FS); // 唤醒MPU6050
}
  • 从MPU6050寄存器中读取数据:
  1. 这里只读取MPU6050的陀螺仪、加速度计、温度的值。
  2. 加速度计的值分布在6个字节的地址上,分为X轴的高8位和低8位数据,Y轴的高8位和低8位数据,Z轴的高8位和低8位数据,寄存器地址为0x3B ~ 0x40。
  3. 同样陀螺仪的值也分布在6个字节的地址上,分为X轴的高8位和低8位数据,Y轴的高8位和低8位数据,Z轴的高8位和低8位数据,寄存器地址为0x43 ~ 0x48。
  4. 温度的值分为2个字节的地址,也是高八位和低八位。寄存器地址为0x41 ~ 0x42。
//从MPU6050传感器中获取陀螺仪、加速度计的原始值
//acc : 加速度计的值
//gyro: 陀螺仪的值
bool MPU6050_Read(Vector3i* acc, Vector3i* gyro)
{
    bool staue = false;
    uint8_t buf[14] = {0};
    staue = MPU6050_Read_NByte(MPU6050_RA_ACCEL_XOUT_H,buf,14);
    if(staue == true)
    {
	acc->x = (int16_t)buf[0]<<8 | buf[1];
	acc->y = (int16_t)buf[2]<<8 | buf[3];
	acc->z = (int16_t)buf[4]<<8 | buf[5];
		
	gyro->x = (int16_t)buf[8]<<8 | buf[9];
	gyro->y = (int16_t)buf[10]<<8 | buf[11];
	gyro->z = (int16_t)buf[12]<<8 | buf[13];
	return true;
    }
    else
        return false;
}
  • MPU6050寄存器地址宏定义如下:
#define MPU6050_ADDRESS_AD0_LOW 0xD0 // address pin low (GND), default for InvenSense evaluation board
#define MPU6050_ADDRESS_AD0_HIGH 0xD2 // address pin high (VCC)

#define MPU6050_DEFAULT_ADDRESS MPU6050_ADDRESS_AD0_HIGH
#define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWRMODE, [6:1] XGOFFS_TC, [0] OTPBNKVLD
#define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWRMODE, [6:1] YGOFFS_TC, [0] OTPBNKVLD
#define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWRMODE, [6:1] ZGOFFS_TC, [0] OTPBNKVLD
#define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] XFINEGAIN
#define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] YFINEGAIN
#define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] ZFINEGAIN
#define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS
#define MPU6050_RA_XA_OFFS_L_TC 0x07
#define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS
#define MPU6050_RA_YA_OFFS_L_TC 0x09
#define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS
#define MPU6050_RA_ZA_OFFS_L_TC 0x0B
#define MPU6050_RA_PRODUCT_ID	0x0C
#define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XGOFFSUSR
#define MPU6050_RA_XG_OFFS_USRL 0x14
#define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YGOFFSUSR
#define MPU6050_RA_YG_OFFS_USRL 0x16
#define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZGOFFSUSR
#define MPU6050_RA_ZG_OFFS_USRL 0x18
#define MPU6050_RA_SMPLRT_DIV 0x19  //采样率分频寄存器:0x07(125Hz)
#define MPU6050_RA_CONFIG 0x1A	 //配置寄存器:0x06(5Hz)
#define MPU6050_RA_GYRO_CONFIG 0x1B  //陀螺仪配置寄存器
#define MPU6050_RA_ACCEL_CONFIG 0x1C //加速度传感器配置寄存器
#define MPU6050_RA_FF_THR 0x1D
#define MPU6050_RA_FF_DUR 0x1E
#define MPU6050_RA_MOT_THR 0x1F	//运动检测阀值设置寄存器
#define MPU6050_RA_MOT_DUR 0x20
#define MPU6050_RA_ZRMOT_THR 0x21
#define MPU6050_RA_ZRMOT_DUR 0x22
#define MPU6050_RA_FIFO_EN 0x23	 // FIFO使能寄存器
#define MPU6050_RA_I2C_MST_CTRL 0x24 // IIC主机控制寄存器
#define MPU6050_RA_I2C_SLV0_ADDR 0x25 // IIC从机0器件地址寄存器
#define MPU6050_RA_I2C_SLV0_REG 0x26 // IIC从机0数据地址寄存器
#define MPU6050_RA_I2C_SLV0_CTRL 0x27 // IIC从机0控制寄存器
#define MPU6050_RA_I2C_SLV1_ADDR 0x28 // IIC从机1器件地址寄存器
#define MPU6050_RA_I2C_SLV1_REG 0x29 // IIC从机1数据地址寄存器
#define MPU6050_RA_I2C_SLV1_CTRL 0x2A // IIC从机1控制寄存器
#define MPU6050_RA_I2C_SLV2_ADDR 0x2B // IIC从机2器件地址寄存器
#define MPU6050_RA_I2C_SLV2_REG 0x2C // IIC从机2数据地址寄存器
#define MPU6050_RA_I2C_SLV2_CTRL 0x2D // IIC从机2控制寄存器
#define MPU6050_RA_I2C_SLV3_ADDR 0x2E // IIC从机3器件地址寄存器
#define MPU6050_RA_I2C_SLV3_REG 0x2F // IIC从机3数据地址寄存器
#define MPU6050_RA_I2C_SLV3_CTRL 0x30 // IIC从机3控制寄存器
#define MPU6050_RA_I2C_SLV4_ADDR 0x31 // IIC从机4器件地址寄存器
#define MPU6050_RA_I2C_SLV4_REG 0x32 // IIC从机4数据地址寄存器
#define MPU6050_RA_I2C_SLV4_DO 0x33 // IIC从机4写数据地址寄存器
#define MPU6050_RA_I2C_SLV4_CTRL 0x34 // IIC从机4控制寄存器
#define MPU6050_RA_I2C_SLV4_DI 0x35 // IIC从机4读数寄存器
#define MPU6050_RA_I2C_MST_STATUS 0x36 // IIC主机状态寄存器
#define MPU6050_RA_INTPINCFG 0x37 // 中断/旁路设置寄存器
#define MPU6050_RA_INT_ENABLE 0x38 // 中断使能寄存器
#define MPU6050_RA_DMP_INT_STATUS 0x39
#define MPU6050_RA_INT_STATUS 0x3A // 中断状态寄存器
#define MPU6050_RA_ACCEL_XOUT_H 0x3B //0x3B~0x40 加速度传感器数据输出寄存器  H高8位 L低8位
#define MPU6050_RA_ACCEL_XOUT_L 0x3C
#define MPU6050_RA_ACCEL_YOUT_H 0x3D
#define MPU6050_RA_ACCEL_YOUT_L 0x3E
#define MPU6050_RA_ACCEL_ZOUT_H 0x3F
#define MPU6050_RA_ACCEL_ZOUT_L 0x40
#define MPU6050_RA_TEMP_OUT_H 0x41 // 温度传感器的值  H高8位  L低8位
#define MPU6050_RA_TEMP_OUT_L 0x42
#define MPU6050_RA_GYRO_XOUT_H 0x43 // 0x43~0x48 陀螺仪数据输出寄存器 H高8位  L低8位
#define MPU6050_RA_GYRO_XOUT_L 0x44
#define MPU6050_RA_GYRO_YOUT_H 0x45
#define MPU6050_RA_GYRO_YOUT_L 0x46
#define MPU6050_RA_GYRO_ZOUT_H 0x47
#define MPU6050_RA_GYRO_ZOUT_L 0x48
#define MPU6050_RA_I2C_SLV0_DO 0x63 // IIC从机0数据寄存器
#define MPU6050_RA_I2C_SLV1_DO 0x64 // IIC从机1数据寄存器
#define MPU6050_RA_I2C_SLV2_DO 0x65 // IIC从机2数据寄存器
#define MPU6050_RA_I2C_SLV3_DO 0x66 // IIC从机3数据寄存器
#define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67 // IIC主机延时管理寄存器
#define MPU6050_RA_SIGNAL_PATH_RESET 0x68 // 信号通道复位寄存器
#define MPU6050_RA_MOT_DETECT_CTRL 0x69	// 运动检测控制寄存器
#define MPU6050_RA_USER_CTRL 0x6A // 用户控制寄存器
#define MPU6050_RA_PWR_MGMT_1 0x6B  // 电源管理寄存器1,复位:将bit7写1实现,复位后,默认值0x40,然后设置0x00-->唤醒MPU6050
#define MPU6050_RA_PWR_MGMT_2 0x6C // 电源管理寄存器2

#define MPU6050_CLOCK_INTERNAL 0x00 	// 内部8M晶振
#define MPU6050_CLOCK_PLL_XGYRO 0x01 	// 参考X轴陀螺仪
#define MPU6050_CLOCK_PLL_YGYRO 0x02  // 参考y轴陀螺仪
#define MPU6050_CLOCK_PLL_ZGYRO 0x03 	// 参考z轴陀螺仪
#define MPU6050_CLOCK_PLL_EXT32K 0x04 	// 外部32.768KHz
#define MPU6050_CLOCK_PLL_EXT19M 0x05 	// 外部19.2MHz
#define MPU6050_CLOCK_KEEP_RESET 0x07
// Register 26 ?Configuration
#define MPU6050_CFG_DLPF_CFG
#define MPU6050_DLPF_BW_256 0x00 // 当陀螺仪频率=8kHz时有效,

#define MPU6050_GYRO_YG_ST 0x40
#define MPU6050_GYRO_ZG_ST 0x20
#define MPU6050_GYRO_FS_250 0x00 // +-250°/s
#define MPU6050_GYRO_FS_500 0x08 // +-500°/s
#define MPU6050_GYRO_FS_1000 0x10 // +-1000°/s
#define MPU6050_GYRO_FS_2000 0x18 // +-2000°/s
// Register 28 - Accelerometer Configuration
#define MPU6050_GYRO_XA_ST 0x80 // Self-test response = Sensor output with self-test enabled - Sensor output without self-test enabled
#define MPU6050_GYRO_YA_ST 0x40
#define MPU6050_GYRO_ZA_ST 0x20
#define MPU6050_ACCEL_AFS_2 0x00 // +-2g
#define MPU6050_ACCEL_AFS_4 0x08 // +-4g
#define MPU6050_ACCEL_AFS_8 0x10 // +-8g
#define MPU6050_ACCEL_AFS_16 0x18 // +-16g
  • HMC5883L磁力计初始化步骤如下(仅供参考):
  1. 设置采样平均数,输出速率,模式。配置寄存器A(地址0)。
  2. 设置周围磁场强度及高斯增益(地磁场强度大约0.5~0.6高斯)。配置寄存器B(地址1)。
  3. 设置测量模式。配置模式寄存器(地址2)。
//函数功能 : 磁力计初始化程序,初始化步骤为:
//1.设置采样平均数为0 , 输出速率为75Hz,正常模式
//2.设置周围磁场强度+-4.3Ga,高斯增益1090 (地磁场强度大约0.5~0.6高斯)
//3.设置为连续测量模式
void HMC5883L_Init(void)
{
    HMC5883L_Write_Byte(HMC58X3_R_CONFA, 0x78);	// 采样平均数默认,频率75Hz,正常模式
	
    HMC5883L_Write_Byte(HMC58X3_R_CONFB,0x20); // 设置周围磁场强度+-4.3Ga,高斯增益1090 (地磁场强度大约0.5~0.6高斯)
    HMC5883L_Write_Byte(HMC58X3_R_MODE,0x00); // 设置为连续测量模式
}
  •  
  • 从HMC5883L中读取数据:
  1. 磁力计的原始数据分布在6个字节的地址上,分为分为X轴的高8位和低8位数据,Y轴的高8位和低8位数据,Z轴的高8位和低8位数据,寄存器地址为3 ~8。(其中 7和8地址为Y轴的高八位和低八位)
bool statt = false;
//函数名称 : HMC5883L_Read
//函数输入 : 
//1.mag : 读取到的三轴磁力计数据
//函数返回 : bool : 成功 返回true 失败 返回false
//函数功能 : 读取三轴磁力计的原始数据
bool HMC5883L_Read(Vector3i* mag)
{
    uint8_t buf[6] = {0};
    statt = HMC5883L_Read_NByte(HMC58X3_R_XM, buf, 6);
    if(statt == true)
    {
	mag->x = (int16_t)buf[0] << 8 | buf[1];
	mag->y = (int16_t)buf[4] << 8 | buf[5];
	mag->z = (int16_t)buf[2] << 8 | buf[3];
	return true;
    }
    else
	return false;
}

磁力计寄存器地址如下:

#define HMC58X3_R_CONFA	0
#define HMC58X3_R_CONFB 1
#define HMC58X3_R_MODE 2
#define HMC58X3_R_XM 3
#define HMC58X3_R_XL 4
#define HMC58X3_R_YM 7 //!< Register address for YM.
#define HMC58X3_R_YL 8 //!< Register address for YL.
#define HMC58X3_R_ZM 5 //!< Register address for ZM.
#define HMC58X3_R_ZL 6 //!< Register address for ZL.
#define HMC58X3_R_STATUS 9
#define HMC58X3_R_IDA 10
#define HMC58X3_R_IDB 11
#define HMC58X3_R_IDC 12
#define HMC5583l_ADDR 0x3C
#define CALIBRATING_MAG_CYCLES 3000 // n*20ms
#define HMC5583l_GAIN	1090	// 高斯增益

 

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
外接磁力计是将MPU6050磁力计模块结合使用,以实现九轴传感器的功能。在外接磁力计的教程中,你可以按照以下步骤进行操作: 1. 确保你已经准备好了MPU6050磁力计模块,并且连接正确。 2. 在代码中,你需要包含相关的文件和目录结构,这些文件包括inv_mpu.h、inv_mpu_dmp_motion_driver.h、inv_mpu.c和inv_mpu_dmp_motion_driver.c等。这些文件提供了MPU6050的基本使用函数和DMP相关函数。 3. 针对不同的开发板进行底层配置。这包括时钟配置和IO初始化。你需要提供具体的实现,包括延时函数、IO读写实现和IIC函数的具体实现。 4. 进行MPU6050初始化设置。这样你就可以读取原始的加速度和角速度数据。你可以参考相关的文档和代码来完成初始化设置。 5. 在指定的位置读取寄存器,获取外挂模块的数据。这些数据可以显示在屏幕上,包括加速度传感器和陀螺仪传感器的输出数据。 总结来说,外接磁力计的教程主要包括准备硬件设备、配置底层初始化设置。通过这些步骤,你可以实现MPU6050磁力计模块的结合,以获取更多的传感器数据。 #### 引用[.reference_title] - *1* *2* [外设使用1:mpu6050](https://blog.csdn.net/qq_35702489/article/details/131043643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [20、江科大stm32学习笔记——I2C通信协议原理和MPU6050](https://blog.csdn.net/weixin_45981798/article/details/129369903)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值