#include \#include \#include \
u8 mpu6050_buffer[14]; u8 hmc5883_buffer[6]; float HMC5883_Angle_F; u16 HMC5883_Angle_D; int16_t ax,ay,az;
S_INT16_XYZ GYRO_OFFSET,ACC_OFFSET; uint8_t GYRO_OFFSET_OK = 1; uint8_t ACC_OFFSET_OK = 1;
S_INT16_XYZ MPU6050_ACC_LAST,MPU6050_GYRO_LAST;
/**************************实现函数******************************************** //将iic读取到得数据分拆,放入相应寄存器
*******************************************************************************/
void MPU6050_Dataanl(void) { MPU6050_ACC_LAST.X=((((int16_t)mpu6050_buffer[0]) << 8) | mpu6050_buffer[1])- 510; //ACC_OFFSET.X; MPU6050_ACC_LAST.Y=((((int16_t)mpu6050_buffer[2]) << 8) | mpu6050_buffer[3])- 42;//ACC_OFFSET.Y; MPU6050_ACC_LAST.Z=((((int16_t)mpu6050_buffer[4]) << 8) | mpu6050_buffer[5]);//- 16950;//ACC_OFFSET.Z; //跳过温度ADC MPU6050_GYRO_LAST.X=((((int16_t)mpu6050_buffer[8]) << 8) | mpu6050_buffer[9])-227;// - GYRO_OFFSET.X; MPU6050_GYRO_LAST.Y=((((int16_t)mpu6050_buffer[10]) << 8) | mpu6050_buffer[11])-18;// - GYRO_OFFSET.Y; MPU6050_GYRO_LAST.Z=((((int16_t)mpu6050_buffer[12]) << 8) | mpu6050_buffer[13])+110;//+26; //- GYRO_OFFSET.Z; VIEW_16_1=(int16_t)MPU6050_ACC_LAST.X; VIEW_16_2=(int16_t)MPU6050_ACC_LAST.Y; VIEW_16_3=(int16_t)MPU6050_ACC_LAST.Z; VIEW_16_4=(int16_t)MPU6050_GYRO_LAST.X; VIEW_16_5=(int16_t)MPU6050_GYRO_LAST.Y; VIEW_16_6=(int16_t)MPU6050_GYRO_LAST.Z; //////////////////////////////////////////////////////////////////////////////////////////////////// if(!GYRO_OFFSET_OK)//开机时候得到陀螺仪的偏移值
{ static int32_t tempgx=0,tempgy=0,tempgz=0; static uint8_t cnt_g=0; //LED1_ON; if(cnt_g==0) { GYRO_OFFSET.X=0; GYRO_OFFSET.Y=0; GYRO_OFFSET.Z=0; tempgx = 0; tempgy = 0; tempgz = 0; cnt_g = 1; return; } tempgx+= MPU6050_GYRO_LAST.X; tempgy+= MPU6050_GYRO_LAST.Y; tempgz+= MPU6050_GYRO_LAST.Z; if(cnt_g==200) { GYRO_OFFSET.X=tempgx/cnt_g; GYRO_OFFSET.Y=tempgy/cnt_g; GYRO_OFFSET.Z=tempgz/cnt_g; cnt_g = 0; GYRO_OFFSET_OK = 1; return; } cnt_g++; }
if(!ACC_OFFSET_OK)//开机时候得到加速度计的偏移值 { static int32_t tempax=0,tempay=0,tempaz=0; static uint8_t cnt_a=0; //LED1_ON; if(cnt_a==0) { ACC_OFFSET.X = 0; ACC_OFFSET.Y = 0; ACC_OFFSET.Z = 0; tempax = 0; tempay = 0; tempaz = 0;
cnt_a = 1; return; } tempax+= MPU6050_ACC_LAST.X; tempay+= MPU6050_ACC_LAST.Y; tempaz+= MPU6050_ACC_LAST.Z; if(cnt_a==200) { ACC_OFFSET.X=tempax/cnt_a; ACC_OFFSET.Y=tempay/cnt_a; ACC_OFFSET.Z=tempaz/cnt_a; cnt_a = 0; ACC_OFFSET_OK = 1; return; } cnt_a++; } }
/**************************实现函数******************************************** //将iic读取到得数据分拆,放入相应寄存器,更新MPU6050_Last
*******************************************************************************/
void MPU6050_READ(void) { i2cRead(MPU6050_Addr,MPU6050_RA_ACCEL_XOUT_H,14,mpu6050_buffer); }
/**************************实现函数******************************************** *函数原型: u8 IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data)
*功 能: 读 修改 写 指定设备 指定寄存器一个字节 中的1个位 输入 dev 目标设备地址 reg 寄存器地址
bitNum 要修改目标字节的bitNum位
data 为0 时,目标位将被清0 否则将被置位 返回 成功 为1 失败为0
*******************************************************************************/
void IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data){ u8 b; i2cRead(dev, reg, 1, &b); b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); i2cWrite(dev, reg, b); }
/**************************实现函数******************************************** *函数原型: u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data) *功 能: 读 修改 写 指定设备 指定寄存器一个字节 中的多个位 输入 dev 目标设备地址 reg 寄存器地址
bitStart 目标字节的起始位 length 位长度
data 存放改变目标字节位的值 返回 成功 为1 失败为0
*******************************************************************************/
void IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data) { u8 b,mask; i2cRead(dev, reg, 1, &b); mask = (0xFF << (bitStart + 1)) | 0xFF >> ((8 - bitStart) + length - 1); data <<= (8 - length); data >>= (7 - bitStart); b &= mask; b |= data; i2cWrite(dev, reg, b); }
/**************************实现函数******************************************** *函数原型: void MPU6050_setClockSource(uint8_t source) *功 能: 设置 MPU6050 的时钟源 * CLK_SEL | Clock Source
* --------+-------------------------------------- * 0 | Internal oscillator
* 1 | PLL with X Gyro reference * 2 | PLL with Y Gyro reference * 3 | PLL with Z Gyro reference
* 4 | PLL with external 32.768kHz reference * 5 | PLL with external 19.2MHz reference * 6 | Reserved
* 7 | Stops the clock and keeps the timing generator in reset
*******************************************************************************/
void MPU6050_setClockSource(uint8_t source){ IICwriteBits(MPU6050_Addr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source); }
/** 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
#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_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR #define MPU6050_RA_XG_OFFS_USRL 0x14
#define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR #define MPU6050_RA_YG_OFFS_USRL 0x16
#define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR #define MPU6050_RA_ZG_OFFS_USRL 0x18 #define MPU6050_RA_SMPLRT_DIV 0x19 #define MPU6050_RA_CONFIG 0x1A #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 #define MPU6050_RA_I2C_MST_CTRL 0x24 #define MPU6050_RA_I2C_SLV0_ADDR 0x25 #define MPU6050_RA_I2C_SLV0_REG 0x26 #define MPU6050_RA_I2C_SLV0_CTRL 0x27 #define MPU6050_RA_I2C_SLV1_ADDR 0x28 #define MPU6050_RA_I2C_SLV1_REG 0x29 #define MPU6050_RA_I2C_SLV1_CTRL 0x2A #define MPU6050_RA_I2C_SLV2_ADDR 0x2B #define MPU6050_RA_I2C_SLV2_REG 0x2C #define MPU6050_RA_I2C_SLV2_CTRL 0x2D #define MPU6050_RA_I2C_SLV3_ADDR 0x2E #define MPU6050_RA_I2C_SLV3_REG 0x2F #define MPU6050_RA_I2C_SLV3_CTRL 0x30 #define MPU6050_RA_I2C_SLV4_ADDR 0x31 #define MPU6050_RA_I2C_SLV4_REG 0x32 #define MPU6050_RA_I2C_SLV4_DO 0x33 #define MPU6050_RA_I2C_SLV4_CTRL 0x34 #define MPU6050_RA_I2C_SLV4_DI 0x35 #define MPU6050_RA_I2C_MST_STATUS 0x36 #define MPU6050_RA_INT_PIN_CFG 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 #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 #define MPU6050_RA_TEMP_OUT_L 0x42 #define MPU6050_RA_GYRO_XOUT_H 0x43 #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_EXT_SENS_DATA_00 0x49 #define MPU6050_RA_EXT_SENS_DATA_01 0x4A #define MPU6050_RA_EXT_SENS_DATA_02 0x4B #define MPU6050_RA_EXT_SENS_DATA_03 0x4C #define MPU6050_RA_EXT_SENS_DATA_04 0x4D #define MPU6050_RA_EXT_SENS_DATA_05 0x4E #define MPU6050_RA_EXT_SENS_DATA_06 0x4F #define MPU6050_RA_EXT_SENS_DATA_07 0x50 #define MPU6050_RA_EXT_SENS_DATA_08 0x51 #define MPU6050_RA_EXT_SENS_DATA_09 0x52 #define MPU6050_RA_EXT_SENS_DATA_10 0x53 #define MPU6050_RA_EXT_SENS_DATA_11 0x54 #define MPU6050_RA_EXT_SENS_DATA_12 0x55 #define MPU6050_RA_EXT_SENS_DATA_13 0x56 #define MPU6050_RA_EXT_SENS_DATA_14 0x57 #define MPU6050_RA_EXT_SENS_DATA_15 0x58 #define MPU6050_RA_EXT_SENS_DATA_16 0x59 #define MPU6050_RA_EXT_SENS_DATA_17 0x5A #define MPU6050_RA_EXT_SENS_DATA_18 0x5B #define MPU6050_RA_EXT_SENS_DATA_19 0x5C #define MPU6050_RA_EXT_SENS_DATA_20 0x5D #define MPU6050_RA_EXT_SENS_DATA_21 0x5E #define MPU6050_RA_EXT_SENS_DATA_22 0x5F #define MPU6050_RA_EXT_SENS_DATA_23 0x60
#define MPU6050_RA_MOT_DETECT_STATUS 0x61 #define MPU6050_RA_I2C_SLV0_DO 0x63 #define MPU6050_RA_I2C_SLV1_DO 0x64 #define MPU6050_RA_I2C_SLV2_DO 0x65 #define MPU6050_RA_I2C_SLV3_DO 0x66
#define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67
#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 #define MPU6050_RA_PWR_MGMT_2 0x6C #define MPU6050_RA_BANK_SEL 0x6D #define MPU6050_RA_MEM_START_ADDR 0x6E #define MPU6050_RA_MEM_R_W 0x6F #define MPU6050_RA_DMP_CFG_1 0x70 #define MPU6050_RA_DMP_CFG_2 0x71 #define MPU6050_RA_FIFO_COUNTH 0x72 #define MPU6050_RA_FIFO_COUNTL 0x73 #define MPU6050_RA_FIFO_R_W 0x74 #define MPU6050_RA_WHO_AM_I 0x75
#define MPU6050_TC_PWR_MODE_BIT 7 #define MPU6050_TC_OFFSET_BIT 6 #define MPU6050_TC_OFFSET_LENGTH 6 #define MPU6050_TC_OTP_BNK_VLD_BIT 0
#define MPU6050_VDDIO_LEVEL_VLOGIC 0 #define MPU6050_VDDIO_LEVEL_VDD 1
#define MPU6050_CFG_EXT_SYNC_SET_BIT 5 #define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3 #define MPU6050_CFG_DLPF_CFG_BIT 2 #define MPU6050_CFG_DLPF_CFG_LENGTH 3
#define MPU6050_EXT_SYNC_DISABLED 0x0 #define MPU6050_EXT_SYNC_TEMP_OUT_L 0x1 #define MPU6050_EXT_SYNC_GYRO_XOUT_L 0x2 #define MPU6050_EXT_SYNC_GYRO_YOUT_L 0x3 #define MPU6050_EXT_SYNC_GYRO_ZOUT_L 0x4 #define MPU6050_EXT_SYNC_ACCEL_XOUT_L 0x5 #define MPU6050_EXT_SYNC_ACCEL_YOUT_L 0x6 #define MPU6050_EXT_SYNC_ACCEL_ZOUT_L 0x7
#define MPU6050_DLPF_BW_256 0x00 #define MPU6050_DLPF_BW_188 0x01 #define MPU6050_DLPF_BW_98 0x02 #define MPU6050_DLPF_BW_42 0x03 #define MPU6050_DLPF_BW_20 0x04 #define MPU6050_DLPF_BW_10 0x05 #define MPU6050_DLPF_BW_5 0x06
#define MPU6050_GCONFIG_FS_SEL_BIT 4 #define MPU6050_GCONFIG_FS_SEL_LENGTH 2
#define MPU6050_GYRO_FS_250 0x00 #define MPU6050_GYRO_FS_500 0x01 #define MPU6050_GYRO_FS_1000 0x02 #define MPU6050_GYRO_FS_2000 0x03
#define MPU6050_ACONFIG_XA_ST_BIT #define MPU6050_ACONFIG_YA_ST_BIT #define MPU6050_ACONFIG_ZA_ST_BIT #define MPU6050_ACONFIG_AFS_SEL_BIT #define MPU6050_ACONFIG_AFS_SEL_LENGTH #define MPU6050_ACONFIG_ACCEL_HPF_BIT #define MPU6050_ACONFIG_ACCEL_HPF_LENGTH
#define MPU6050_ACCEL_FS_2 0x00 #define MPU6050_ACCEL_FS_4 0x01 #define MPU6050_ACCEL_FS_8 0x02 #define MPU6050_ACCEL_FS_16 0x03
#define MPU6050_DHPF_RESET 0x00 #define MPU6050_DHPF_5 0x01 #define MPU6050_DHPF_2P5 0x02 #define MPU6050_DHPF_1P25 0x03 #define MPU6050_DHPF_0P63 0x04 #define MPU6050_DHPF_HOLD 0x07
#define MPU6050_TEMP_FIFO_EN_BIT 7 #define MPU6050_XG_FIFO_EN_BIT 6 #define MPU6050_YG_FIFO_EN_BIT 5 #define MPU6050_ZG_FIFO_EN_BIT 4 #define MPU6050_ACCEL_FIFO_EN_BIT 3 #define MPU6050_SLV2_FIFO_EN_BIT 2 #define MPU6050_SLV1_FIFO_EN_BIT 1 #define MPU6050_SLV0_FIFO_EN_BIT 0
#define MPU6050_MULT_MST_EN_BIT 7 #define MPU6050_WAIT_FOR_ES_BIT 6 #define MPU6050_SLV_3_FIFO_EN_BIT 5 #define MPU6050_I2C_MST_P_NSR_BIT 4 #define MPU6050_I2C_MST_CLK_BIT 3 #define MPU6050_I2C_MST_CLK_LENGTH 4
7 6 5 4 2 2 3
#define MPU6050_CLOCK_DIV_348 0x0 #define MPU6050_CLOCK_DIV_333 0x1 #define MPU6050_CLOCK_DIV_320 0x2 #define MPU6050_CLOCK_DIV_308 0x3 #define MPU6050_CLOCK_DIV_296 0x4 #define MPU6050_CLOCK_DIV_286 0x5 #define MPU6050_CLOCK_DIV_276 0x6 #define MPU6050_CLOCK_DIV_267 0x7 #define MPU6050_CLOCK_DIV_258 0x8 #define MPU6050_CLOCK_DIV_500 0x9 #define MPU6050_CLOCK_DIV_471 0xA #define MPU6050_CLOCK_DIV_444 0xB #define MPU6050_CLOCK_DIV_421 0xC #define MPU6050_CLOCK_DIV_400 0xD #define MPU6050_CLOCK_DIV_381 0xE #define MPU6050_CLOCK_DIV_364 0xF
#define MPU6050_I2C_SLV_RW_BIT 7 #define MPU6050_I2C_SLV_ADDR_BIT 6 #define MPU6050_I2C_SLV_ADDR_LENGTH 7 #define MPU6050_I2C_SLV_EN_BIT 7 #define MPU6050_I2C_SLV_BYTE_SW_BIT 6 #define MPU6050_I2C_SLV_REG_DIS_BIT 5 #define MPU6050_I2C_SLV_GRP_BIT 4 #define MPU6050_I2C_SLV_LEN_BIT 3 #define MPU6050_I2C_SLV_LEN_LENGTH 4
#define MPU6050_I2C_SLV4_RW_BIT 7 #define MPU6050_I2C_SLV4_ADDR_BIT 6 #define MPU6050_I2C_SLV4_ADDR_LENGTH 7 #define MPU6050_I2C_SLV4_EN_BIT 7 #define MPU6050_I2C_SLV4_INT_EN_BIT 6 #define MPU6050_I2C_SLV4_REG_DIS_BIT 5 #define MPU6050_I2C_SLV4_MST_DLY_BIT 4 #define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
#define MPU6050_MST_PASS_THROUGH_BIT 7 #define MPU6050_MST_I2C_SLV4_DONE_BIT 6 #define MPU6050_MST_I2C_LOST_ARB_BIT 5 #define MPU6050_MST_I2C_SLV4_NACK_BIT 4 #define MPU6050_MST_I2C_SLV3_NACK_BIT 3 #define MPU6050_MST_I2C_SLV2_NACK_BIT 2 #define MPU6050_MST_I2C_SLV1_NACK_BIT 1
#define MPU6050_MST_I2C_SLV0_NACK_BIT 0
#define MPU6050_INTCFG_INT_LEVEL_BIT 7 #define MPU6050_INTCFG_INT_OPEN_BIT 6 #define MPU6050_INTCFG_LATCH_INT_EN_BIT 5 #define MPU6050_INTCFG_INT_RD_CLEAR_BIT 4 #define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT 3 #define MPU6050_INTCFG_FSYNC_INT_EN_BIT 2 #define MPU6050_INTCFG_I2C_BYPASS_EN_BIT 1 #define MPU6050_INTCFG_CLKOUT_EN_BIT 0
#define MPU6050_INTMODE_ACTIVEHIGH 0x00 #define MPU6050_INTMODE_ACTIVELOW 0x01
#define MPU6050_INTDRV_PUSHPULL 0x00 #define MPU6050_INTDRV_OPENDRAIN 0x01
#define MPU6050_INTLATCH_50USPULSE 0x00 #define MPU6050_INTLATCH_WAITCLEAR 0x01
#define MPU6050_INTCLEAR_STATUSREAD 0x00 #define MPU6050_INTCLEAR_ANYREAD 0x01
#define MPU6050_INTERRUPT_FF_BIT 7 #define MPU6050_INTERRUPT_MOT_BIT 6 #define MPU6050_INTERRUPT_ZMOT_BIT 5 #define MPU6050_INTERRUPT_FIFO_OFLOW_BIT 4 #define MPU6050_INTERRUPT_I2C_MST_INT_BIT 3 #define MPU6050_INTERRUPT_PLL_RDY_INT_BIT 2 #define MPU6050_INTERRUPT_DMP_INT_BIT 1 #define MPU6050_INTERRUPT_DATA_RDY_BIT 0
// TODO: figure out what these actually do // UMPL source code is not very obivous
#define MPU6050_DMPINT_5_BIT 5 #define MPU6050_DMPINT_4_BIT 4 #define MPU6050_DMPINT_3_BIT 3 #define MPU6050_DMPINT_2_BIT 2 #define MPU6050_DMPINT_1_BIT 1 #define MPU6050_DMPINT_0_BIT 0
#define MPU6050_MOTION_MOT_XNEG_BIT 7 #define MPU6050_MOTION_MOT_XPOS_BIT 6 #define MPU6050_MOTION_MOT_YNEG_BIT 5
#define MPU6050_MOTION_MOT_YPOS_BIT 4 #define MPU6050_MOTION_MOT_ZNEG_BIT 3 #define MPU6050_MOTION_MOT_ZPOS_BIT 2 #define MPU6050_MOTION_MOT_ZRMOT_BIT 0
#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT 7 #define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4 #define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3 #define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2 #define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1 #define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0
#define MPU6050_PATHRESET_GYRO_RESET_BIT 2 #define MPU6050_PATHRESET_ACCEL_RESET_BIT 1 #define MPU6050_PATHRESET_TEMP_RESET_BIT 0
#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT 5 #define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH 2 #define MPU6050_DETECT_FF_COUNT_BIT 3 #define MPU6050_DETECT_FF_COUNT_LENGTH 2 #define MPU6050_DETECT_MOT_COUNT_BIT 1 #define MPU6050_DETECT_MOT_COUNT_LENGTH 2
#define MPU6050_DETECT_DECREMENT_RESET 0x0 #define MPU6050_DETECT_DECREMENT_1 0x1 #define MPU6050_DETECT_DECREMENT_2 0x2 #define MPU6050_DETECT_DECREMENT_4 0x3
#define MPU6050_USERCTRL_DMP_EN_BIT 7 #define MPU6050_USERCTRL_FIFO_EN_BIT 6 #define MPU6050_USERCTRL_I2C_MST_EN_BIT 5 #define MPU6050_USERCTRL_I2C_IF_DIS_BIT 4 #define MPU6050_USERCTRL_DMP_RESET_BIT 3 #define MPU6050_USERCTRL_FIFO_RESET_BIT 2 #define MPU6050_USERCTRL_I2C_MST_RESET_BIT 1 #define MPU6050_USERCTRL_SIG_COND_RESET_BIT 0
#define MPU6050_PWR1_DEVICE_RESET_BIT 7 #define MPU6050_PWR1_SLEEP_BIT 6 #define MPU6050_PWR1_CYCLE_BIT 5 #define MPU6050_PWR1_TEMP_DIS_BIT 3 #define MPU6050_PWR1_CLKSEL_BIT 2 #define MPU6050_PWR1_CLKSEL_LENGTH 3
#define MPU6050_CLOCK_INTERNAL 0x00 #define MPU6050_CLOCK_PLL_XGYRO 0x01 #define MPU6050_CLOCK_PLL_YGYRO 0x02 #define MPU6050_CLOCK_PLL_ZGYRO 0x03 #define MPU6050_CLOCK_PLL_EXT32K 0x04 #define MPU6050_CLOCK_PLL_EXT19M 0x05 #define MPU6050_CLOCK_KEEP_RESET 0x07
#define MPU6050_PWR2_LP_WAKE_CTRL_BIT 7 #define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH 2 #define MPU6050_PWR2_STBY_XA_BIT 5 #define MPU6050_PWR2_STBY_YA_BIT 4 #define MPU6050_PWR2_STBY_ZA_BIT 3 #define MPU6050_PWR2_STBY_XG_BIT 2 #define MPU6050_PWR2_STBY_YG_BIT 1 #define MPU6050_PWR2_STBY_ZG_BIT 0
#define MPU6050_WAKE_FREQ_1P25 0x0 #define MPU6050_WAKE_FREQ_2P5 0x1 #define MPU6050_WAKE_FREQ_5 0x2 #define MPU6050_WAKE_FREQ_10 0x3
#define MPU6050_BANKSEL_PRFTCH_EN_BIT 6 #define MPU6050_BANKSEL_CFG_USER_BANK_BIT 5 #define MPU6050_BANKSEL_MEM_SEL_BIT 4 #define MPU6050_BANKSEL_MEM_SEL_LENGTH 5
#define MPU6050_WHO_AM_I_BIT 6 #define MPU6050_WHO_AM_I_LENGTH 6
/********************HMC5883********************************************/
#define HMC5883_Address IIC总线的地址
#define HMC5883_Register_A #define HMC5883_Register_B #define HMC5883_ModeReg #define HMC5883_XOUT_H #define HMC5883_XOUT_L #define HMC5883_ZOUT_H #define HMC5883_ZOUT_L #define HMC5883_YOUT_H #define HMC5883_YOUT_L
0x1e //0x1e<<1==0x3C //定义器件在
0x00 0x01
0x02
0x03 0x04 0x05 0x06 0x07 0x08
#define HMC5883_StatusReg #define HMC5883_IdentificationReg_A 0x0A #define HMC5883_IdentificationReg_B 0x0B #define HMC5883_IdentificationReg_C 0x0C
extern float HMC5883_Angle_F; extern u16 HMC5883_Angle_D; extern u8 hmc5883_buffer[6]; extern int16_t ax,ay,az;
void MPU6050_INIT(void); void MPU6050_READ(void); void MPU6050_Dataanl(void);
void HMC5883_INIT(void); void HMC5883_READ(void); void GetAngle(void); #endif
0x09