MPU6050+HMC5883驱动程序 联系客服

发布时间 : 星期四 文章MPU6050+HMC5883驱动程序更新完毕开始阅读aee2a3a8f12d2af90242e6c6

/** Set full-scale gyroscope range.

* @param range New full-scale gyroscope range value * @see getFullScaleRange()

* @see MPU6050_GYRO_FS_250 * @see MPU6050_RA_GYRO_CONFIG * @see MPU6050_GCONFIG_FS_SEL_BIT * @see MPU6050_GCONFIG_FS_SEL_LENGTH */

void MPU6050_setFullScaleGyroRange(uint8_t range) { IICwriteBits(MPU6050_Addr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range); }

/**************************实现函数******************************************** *函数原型: void MPU6050_setFullScaleAccelRange(uint8_t range) *功 能: 设置 MPU6050 加速度计的最大量程

*******************************************************************************/

void MPU6050_setFullScaleAccelRange(uint8_t range) { IICwriteBits(MPU6050_Addr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range); }

/**************************实现函数******************************************** *函数原型: void MPU6050_setSleepEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否进入睡眠模式 enabled =1 睡觉 enabled =0 工作

*******************************************************************************/

void MPU6050_setSleepEnabled(uint8_t enabled) { IICwriteBit(MPU6050_Addr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled); }

/**************************实现函数******************************************** *函数原型: void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否为AUX I2C线的主机

*******************************************************************************/

void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) { IICwriteBit(MPU6050_Addr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled); }

/**************************实现函数******************************************** *函数原型: void MPU6050_setI2CBypassEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否为AUX I2C线的主机

*******************************************************************************/

void MPU6050_setI2CBypassEnabled(uint8_t enabled) { IICwriteBit(MPU6050_Addr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled); }

void MPU6050_setDLPF(uint8_t mode) { IICwriteBits(MPU6050_Addr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode); }

/**************************实现函数******************************************** *函数原型: void MPU6050_initialize(void)

*功 能: 初始化 MPU6050 以进入可用状态。

*******************************************************************************/

void MPU6050_INIT(void) { i2cInit();

MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //设置时钟 0x6b 0x01 delay_ms(2);

MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_500);//陀螺仪最大量程 +-500度每秒 delay_ms(2); MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_4); //加速度度最大量程 +-4G delay_ms(2); MPU6050_setDLPF(MPU6050_DLPF_BW_42); delay_ms(2); MPU6050_setSleepEnabled(0); //进入工作状态 delay_ms(2); MPU6050_setI2CMasterModeEnabled(0); //不让MPU6050 控制AUXI2C delay_ms(2); MPU6050_setI2CBypassEnabled(1); //主控制器的I2C与 MPU6050的AUXI2C 直通。控制器可以直接访问HMC5883L delay_ms(2); // //配置MPU6050 的中断模式 和中断电平模式 // IICwriteBit(MPU6050_Addr, MPU6050_RA_INT_PIN_CFG,

MPU6050_INTCFG_INT_LEVEL_BIT, 0); // IICwriteBit(MPU6050_Addr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, 0); // IICwriteBit(MPU6050_Addr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, 1); // IICwriteBit(MPU6050_Addr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, 1); // //开数据转换完成中断 // IICwriteBit(MPU6050_Addr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, 1); }

void HMC5883_INIT(void) { i2cWrite(HMC5883_Address, HMC5883_ModeReg, 0X00); }

void HMC5883_READ(void) { i2cRead(HMC5883_Address,HMC5883_XOUT_H,6,hmc5883_buffer); }

void GetAngle(void) { HMC5883_READ(); //连续读出数据,存储在BUF中 ax = hmc5883_buffer[0] << 8 | hmc5883_buffer[1]; //Combine MSB and LSB of X Data output register az = hmc5883_buffer[2] << 8 | hmc5883_buffer[3]; //Combine MSB and LSB of Z Data output register ay = hmc5883_buffer[4] << 8 | hmc5883_buffer[5]; //Combine MSB and LSB of Y Data output register

// if(ax >= 0xf000) ax=0; ay=ay+115; HMC5883_Angle_F= atan2((double)ay,(double)ax) * (180 / 3.14159265) + 180; // angle in degrees HMC5883_Angle_D=(u16)HMC5883_Angle_F; }

H文件 #ifndef __MPU6050_H_ #define __MPU6050_H_

#include \

#define true 1 #define false 0

#define MPU6050_READRATE #define MPU6050_READTIME #define EE_6050_ACC_X_OFFSET_ADDR #define EE_6050_ACC_Y_OFFSET_ADDR #define EE_6050_ACC_Z_OFFSET_ADDR #define EE_6050_GYRO_X_OFFSET_ADDR #define EE_6050_GYRO_Y_OFFSET_ADDR #define EE_6050_GYRO_Z_OFFSET_ADDR

#define MPU6050_Addr 0x68

#define MPU6050_ADDRESS_AD0_LOW InvenSense evaluation board

#define MPU6050_ADDRESS_AD0_HIGH #define MPU6050_DEFAULT_ADDRESS

#define MPU6050_RA_XG_OFFS_TC OTP_BNK_VLD

#define MPU6050_RA_YG_OFFS_TC OTP_BNK_VLD

#define MPU6050_RA_ZG_OFFS_TC OTP_BNK_VLD

#define MPU6050_RA_X_FINE_GAIN #define MPU6050_RA_Y_FINE_GAIN #define MPU6050_RA_Z_FINE_GAIN #define MPU6050_RA_XA_OFFS_H #define MPU6050_RA_XA_OFFS_L_TC

1000 //6050读取频率 0.001 //6050读取时间间隔 0 1 2 3 4 5 0x68 // address pin low (GND), default for 0x69 // address pin high (VCC) MPU6050_ADDRESS_AD0_LOW 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] 0x03 //[7:0] X_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN 0x06 //[15:0] XA_OFFS 0x07