当前位置: 首页 > news >正文

白之家 低成本做网站世界咨询公司排名前十名

白之家 低成本做网站,世界咨询公司排名前十名,wordpress 远程数据库,中国网络营销平台STM32F407硬件I2C实现MPU6050通讯 文章目录 STM32F407硬件I2C实现MPU6050通讯cubeide设置写操作与读操作函数实现复位#xff0c;读取温度#xff0c;角度等函数封装mpu6050.cmpu6050.h代码分析 DMP移植1.修改头文件路径为自己的头文件路径2.修改I2C读写函数为自己mcu平台的读…STM32F407硬件I2C实现MPU6050通讯 文章目录 STM32F407硬件I2C实现MPU6050通讯cubeide设置写操作与读操作函数实现复位读取温度角度等函数封装mpu6050.cmpu6050.h代码分析 DMP移植1.修改头文件路径为自己的头文件路径2.修改I2C读写函数为自己mcu平台的读写函数3.修改延时函数为自己平台的延时函数4.修改MPU6050的地址 使用举例 工程代码 https://download.csdn.net/download/weixin_52849254/87886714 cubeide设置 I2C1通道可选择三种不同的通讯协议I2C、SMBus-Alert-mode、SMBus-two-wire-Interface。 SMBus (System Management Bus,系统管理总线) 为系统和电源管理这样的任务提供了一条控制总线SMBus与I2C总线之间在时序特性上存在一些差别 修改速度为50000 写操作与读操作函数实现 /*** brief Manages error callback by re-initializing I2C.* param Addr: I2C Address* retval None*/ static void I2Cx_Error(uint8_t Addr) {/* 恢复I2C寄存器为默认值 */HAL_I2C_DeInit(hi2c1);/* 重新初始化I2C外设 */MX_I2C1_Init(); } /*** brief 写寄存器这是提供给上层的接口* param slave_addr: 从机地址* param reg_addr:寄存器地址* param len写入的长度* param data_ptr:指向要写入的数据* retval 正常为0不正常为非0*/ int Sensors_I2C_WriteRegister(uint8_t slave_addr,uint8_t reg_addr,uint8_t len,uint8_t *data_ptr) {HAL_StatusTypeDef status HAL_OK;status HAL_I2C_Mem_Write(hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT,data_ptr, len,I2Cx_FLAG_TIMEOUT);/* 检查通讯状态 */if(status ! HAL_OK){/* 总线出错处理 */I2Cx_Error(slave_addr);}while (HAL_I2C_GetState(hi2c1) ! HAL_I2C_STATE_READY){}/* 检查SENSOR是否就绪进行下一次读写操作 */while (HAL_I2C_IsDeviceReady(hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) HAL_TIMEOUT);/* 等待传输结束 */while (HAL_I2C_GetState(hi2c1) ! HAL_I2C_STATE_READY){}return status; }/*** brief 读寄存器这是提供给上层的接口* param slave_addr: 从机地址* param reg_addr:寄存器地址* param len要读取的长度* param data_ptr:指向要存储数据的指针* retval 正常为0不正常为非0*/ int Sensors_I2C_ReadRegister(uint8_t slave_addr,uint8_t reg_addr,uint8_t len,uint8_t *data_ptr) {HAL_StatusTypeDef status HAL_OK;status HAL_I2C_Mem_Read(hi2c1,slave_addr,reg_addr,I2C_MEMADD_SIZE_8BIT,data_ptr,len,I2Cx_FLAG_TIMEOUT);/* 检查通讯状态 */if(status ! HAL_OK){/* 总线出错处理 */I2Cx_Error(slave_addr);}while (HAL_I2C_GetState(hi2c1) ! HAL_I2C_STATE_READY){}/* 检查SENSOR是否就绪进行下一次读写操作 */while (HAL_I2C_IsDeviceReady(hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) HAL_TIMEOUT);/* 等待传输结束 */while (HAL_I2C_GetState(hi2c1) ! HAL_I2C_STATE_READY){}return status; }这段代码是关于使用I2C进行寄存器读写的函数实现。 首先代码中定义了一个静态函数I2Cx_Error用于处理I2C出错的情况。在函数中首先通过调用HAL_I2C_DeInit函数将I2C寄存器恢复为默认值然后调用MX_I2C1_Init函数重新初始化I2C外设。 接下来代码包含了两个函数Sensors_I2C_WriteRegister和Sensors_I2C_ReadRegister分别用于写寄存器和读寄存器操作。 Sensors_I2C_WriteRegister函数用于向从设备写入数据。它接受从设备地址(slave_addr)、寄存器地址(reg_addr)、要写入的数据长度(len)和指向要写入数据的指针(data_ptr)作为参数。在函数中通过调用HAL_I2C_Mem_Write函数进行I2C的内存写操作。如果通信状态不正常即status不等于HAL_OK则调用I2Cx_Error函数进行错误处理。然后通过循环等待I2C传输完成并检查SENSOR是否就绪进行下一次读写操作。 Sensors_I2C_ReadRegister函数用于从从设备读取数据。它接受从设备地址(slave_addr)、寄存器地址(reg_addr)、要读取的数据长度(len)和指向存储数据的指针(data_ptr)作为参数。在函数中通过调用HAL_I2C_Mem_Read函数进行I2C的内存读操作。如果通信状态不正常即status不等于HAL_OK则调用I2Cx_Error函数进行错误处理。然后通过循环等待I2C传输完成并检查SENSOR是否就绪进行下一次读写操作。 最后函数返回status表示操作的状态。 综上所述这段代码实现了使用I2C进行寄存器读写的功能并在通信出错时进行了错误处理。 复位读取温度角度等函数封装 mpu6050.c #include mpu6050.h #include usart.h #include i2c.h #include main.h#define MPU_ERROR I2C_ERROR #define MPU_INFO I2C_INFO/*** brief 写数据到MPU6050寄存器* param reg_add:寄存器地址* param reg_data:要写入的数据* retval */ void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat) {Sensors_I2C_WriteRegister(MPU6050_ADDRESS,reg_add,1,reg_dat); }/*** brief 从MPU6050寄存器读取数据* param reg_add:寄存器地址* param Read存储数据的缓冲区* param num要读取的数据量* retval */ void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num) {Sensors_I2C_ReadRegister(MPU6050_ADDRESS,reg_add,num,Read); }/*** brief 往MPU6050的指定寄存器写入一字节数据* param addr: MPU6050的IIC通讯地址* reg : MPU6050寄存器地址* dat : 写入的数据* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat) {return Sensors_I2C_WriteRegister(addr, reg, 1, dat); } /*** brief 读取MPU6050指定寄存器的值* param addr: MPU6050的IIC通讯地址* reg : MPU6050寄存器地址* dat: 读取到的寄存器的值* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat) {return Sensors_I2C_ReadRegister(addr, reg, 1, dat); }/*** brief 初始化MPU6050芯片* param * retval */ void MPU6050_Init(void) {//在初始化之前要延时一段时间若没有延时则断电后再上电数据可能会出错Delay(100);MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //解除休眠状态MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); //陀螺仪采样率MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06); MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x01); //配置加速度传感器工作在4G模式MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18); //陀螺仪自检及测量范围典型值0x18(不自检2000deg/s)Delay(200); }/*** brief 读取MPU6050的ID* param * retval 正常返回1异常返回0*/ uint8_t MPU6050ReadID(void) {unsigned char Re 0;MPU6050_ReadData(MPU6050_RA_WHO_AM_I,Re,1); //读器件地址printf(Re %x\r\n,Re);if(Re ! 0x68){MPU_ERROR(MPU6050 dectected error!\r\n检测不到MPU6050模块请检查模块与开发板的接线);return 0;}else{MPU_INFO(MPU6050 ID %d\r\n,Re);return 1;}}/*** brief 读取MPU6050的加速度数据* param * retval */ void MPU6050ReadAcc(short *accData) {uint8_t buf[6];MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);accData[0] (buf[0] 8) | buf[1];accData[1] (buf[2] 8) | buf[3];accData[2] (buf[4] 8) | buf[5]; }/*** brief 读取MPU6050的角加速度数据* param * retval */ void MPU6050ReadGyro(short *gyroData) {uint8_t buf[6];MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);gyroData[0] (buf[0] 8) | buf[1];gyroData[1] (buf[2] 8) | buf[3];gyroData[2] (buf[4] 8) | buf[5]; }/*** brief 读取MPU6050的原始温度数据* param * retval */ void MPU6050ReadTemp(short *tempData) {uint8_t buf[2];MPU6050_ReadData(MPU6050_RA_GYRO_XOUT_H,buf,2); //读取温度值*tempData (buf[0] 8) | buf[1]; }/*** brief 读取MPU6050的温度数据转化成摄氏度* param * retval */ void MPU6050_ReturnTemp(float *Temperature) {short temp3;uint8_t buf[2];MPU6050_ReadData(MPU6050_RA_GYRO_XOUT_H,buf,2); //读取温度值temp3 (buf[0] 8) | buf[1]; *Temperature((double) temp3/340.0)36.53;}/*** brief MPU6050软件复位* param 无* retval 无*/ void mpu6050_sw_reset(void) {mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x80);HAL_Delay(100);mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x00); }/*** brief MPU6050设置陀螺仪传感器量程范围* param frs: 0 -- ±250dps* 1 -- ±500dps* 2 -- ±1000dps* 3 -- ±2000dps* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_set_gyro_fsr(uint8_t fsr) {return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_GYRO_CONFIG, fsr 3); }/*** brief MPU6050设置加速度传感器量程范围* param frs: 0 -- ±2g* 1 -- ±4g* 2 -- ±8g* 3 -- ±16g* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_set_accel_fsr(uint8_t fsr) {return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_ACCEL_CONFIG, fsr 3); }/*** brief MPU6050设置数字低通滤波器频率* param lpf: 数字低通滤波器的频率Hz* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_set_lpf(uint16_t lpf) {uint8_t dat;if (lpf 188){dat 1;}else if (lpf 98){dat 2;}else if (lpf 42){dat 3;}else if (lpf 20){dat 4;}else if (lpf 10){dat 5;}else{dat 6;}return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_CONFIG, dat); }/*** brief MPU6050设置采样率* param rate: 采样率4~1000Hz* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_set_rate(uint16_t rate) {uint8_t ret;uint8_t dat;if (rate 1000){rate 1000;}if (rate 4){rate 4;}dat 1000 / rate - 1;ret mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_SMPLRT_DIV, dat);if (ret ! MPU6050_EOK){return ret;}ret mpu6050_set_lpf(rate 1);if (ret ! MPU6050_EOK){return ret;}return MPU6050_EOK; }/*** brief MPU6050获取温度值* param temperature: 获取到的温度值扩大了100倍* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_get_temperature(int16_t *temp) {uint8_t dat[2];uint8_t ret;int16_t raw 0;ret Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_TEMP_OUT_H, 2, dat);if (ret MPU6050_EOK){raw ((uint16_t)dat[0] 8) | dat[1];*temp (int16_t)((36.53f ((float)raw / 340)) * 100);}return ret; }/*** brief MPU6050获取陀螺仪值* param gxgygz: 陀螺仪x、y、z轴的原始度数带符号* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz) {uint8_t dat[6];uint8_t ret;ret Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_GYRO_XOUT_H, 6, dat);if (ret MPU6050_EOK){*gx ((uint16_t)dat[0] 8) | dat[1];*gy ((uint16_t)dat[2] 8) | dat[3];*gz ((uint16_t)dat[4] 8) | dat[5];}return ret; }/*** brief MPU6050获取加速度值* param axayaz: 加速度x、y、z轴的原始度数带符号* retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误函数执行失败*/ uint8_t mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az) {uint8_t dat[6];uint8_t ret;ret Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, 6, dat);if (ret MPU6050_EOK){*ax ((uint16_t)dat[0] 8) | dat[1];*ay ((uint16_t)dat[2] 8) | dat[3];*az ((uint16_t)dat[4] 8) | dat[5];}return ret; }/*** brief MPU6050初始化* param 无* retval MPU6050_EOK: 函数执行成功* MPU6050_EID: 获取ID错误函数执行失败*/ uint8_t mpu6050_init(void) {uint8_t id;// mpu6050_hw_init(); /* MPU6050硬件初始化 */ // mpu6050_iic_init(); /* 初始化IIC接口 */mpu6050_sw_reset(); /* MPU6050软件复位 */mpu6050_set_gyro_fsr(3); /* 陀螺仪传感器±2000dps */mpu6050_set_accel_fsr(0); /* 加速度传感器±2g */mpu6050_set_rate(50); /* 采样率50Hz */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_INT_ENABLE, 0X00); /* 关闭所有中断 */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_USER_CTRL, 0X00); /* 关闭IIC主模式 */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_FIFO_EN, 0X00); /* 关闭FIFO */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_INT_PIN_CFG, 0X80); /* INT引脚低电平有效 */mpu6050_read_byte(MPU6050_ADDRESS, MPU6050_WHO_AM_I, id); /* 读取设备ID */printf(id %d\r\n,id);if (id ! 0x68){return MPU6050_EID;}mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x01); /* 设置CLKSELPLL X轴为参考 */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_2, 0x00); /* 加速度与陀螺仪都工作 */mpu6050_set_rate(50); /* 采样率50Hz */return MPU6050_EOK; }mpu6050.h #ifndef __MPU6050_H #define __MPU6050_H #include main.h// MPU6050, Standard address 0x68 #define MPU6050_ADDRESS 0xD0 // #define MPU6050_WHO_AM_I 0x75 #define MPU6050_SMPLRT_DIV 0 //8000Hz #define MPU6050_DLPF_CFG 0 #define MPU6050_GYRO_OUT 0x43 //MPU6050陀螺仪数据寄存器地址 #define MPU6050_ACC_OUT 0x3B //MPU6050加速度数据寄存器地址#define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD #define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD #define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD #define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN #define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN #define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN #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_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 // FIFO使能寄存器 #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 // 加速度值,X轴高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 // 温度值高八位寄存器 #define MPU6050_RA_TEMP_OUT_L 0x42 #define MPU6050_RA_GYRO_XOUT_H 0x43 // 陀螺仪值,X轴高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_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 // 电源管理寄存器1 #define MPU6050_RA_PWR_MGMT_2 0x6C // 电源管理寄存器2 #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 // 器件ID寄存器#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 7 #define MPU6050_ACONFIG_YA_ST_BIT 6 #define MPU6050_ACONFIG_ZA_ST_BIT 5 #define MPU6050_ACONFIG_AFS_SEL_BIT 4 #define MPU6050_ACONFIG_AFS_SEL_LENGTH 2 #define MPU6050_ACONFIG_ACCEL_HPF_BIT 2 #define MPU6050_ACONFIG_ACCEL_HPF_LENGTH 3#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#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#define MPU6050_DMP_MEMORY_BANKS 8 #define MPU6050_DMP_MEMORY_BANK_SIZE 256 #define MPU6050_DMP_MEMORY_CHUNK_SIZE 16void MPU6050ReadTemp(short *tempData); void MPU6050ReadGyro(short *gyroData); void MPU6050ReadAcc(short *accData); void MPU6050_ReturnTemp(float*Temperature); void MPU6050_Init(void); uint8_t MPU6050ReadID(void); void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat); void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num);void MPU6050_PWR_MGMT_1_INIT(void);/* 操作函数 */ uint8_t mpu6050_write(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat); /* 往ATK-MS6050的指定寄存器连续写入指定数据 */ uint8_t mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat); /* 往ATK-MS6050的指定寄存器写入一字节数据 */ uint8_t mpu6050_read(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat); /* 连续读取ATK-MS6050指定寄存器的值 */ uint8_t mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat); /* 读取ATK-MS6050指定寄存器的值 */ void mpu6050_sw_reset(void); /* ATK-MS6050软件复位 */ uint8_t mpu6050_set_gyro_fsr(uint8_t fsr); /* ATK-MS6050设置陀螺仪传感器量程范围 */ uint8_t mpu6050_set_accel_fsr(uint8_t fsr); /* ATK-MS6050设置加速度传感器量程范围 */ uint8_t mpu6050_set_lpf(uint16_t lpf); /* ATK-MS6050设置数字低通滤波器频率 */ uint8_t mpu6050_set_rate(uint16_t rate); /* ATK-MS6050设置采样率 */ uint8_t mpu6050_get_temperature(int16_t *temp); /* ATK-MS6050获取温度值 */ uint8_t mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz); /* ATK-MS6050获取陀螺仪值 */ uint8_t mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az); /* ATK-MS6050获取加速度值 */ uint8_t mpu6050_init(void);/* 函数错误代码 */ #define MPU6050_EOK 0 /* 没有错误 */ #define MPU6050_EID 1 /* ID错误 */ #define MPU6050_EACK 2 /* IIC通讯ACK错误 */#endif /*__MPU6050*/代码分析 主要涉及与MPU6050传感器通信和配置相关的函数。以下是对每个函数的简要说明 MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat): 将数据写入MPU6050寄存器的函数。 MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num): 从MPU6050寄存器读取数据的函数。 mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat): 向MPU6050指定寄存器写入一字节数据的函数。 mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat): 读取MPU6050指定寄存器的值的函数。 MPU6050_Init(void): 初始化MPU6050芯片的函数包括解除休眠状态和配置传感器参数等。 MPU6050ReadID(void): 读取MPU6050的ID并检查是否能够正确识别MPU6050模块。 MPU6050ReadAcc(short *accData): 读取MPU6050的加速度数据。 MPU6050ReadGyro(short *gyroData): 读取MPU6050的角加速度数据。 MPU6050ReadTemp(short *tempData): 读取MPU6050的原始温度数据。 MPU6050_ReturnTemp(float *Temperature): 将读取到的温度数据转化为摄氏度。 mpu6050_sw_reset(void): 执行MPU6050的软件复位操作。 mpu6050_set_gyro_fsr(uint8_t fsr): 设置MPU6050陀螺仪传感器的量程范围。 mpu6050_set_accel_fsr(uint8_t fsr): 设置MPU6050加速度传感器的量程范围。 mpu6050_set_lpf(uint16_t lpf): 设置MPU6050的数字低通滤波器频率。 mpu6050_set_rate(uint16_t rate): 设置MPU6050的采样率。 mpu6050_get_temperature(int16_t *temp): 获取MPU6050的温度值。 mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz): 获取MPU6050的陀螺仪值。 mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az): 获取MPU6050的加速度值。 mpu6050_init(void): 对MPU6050进行初始化的函数。 这些函数可以用于控制和读取MPU6050传感器的数据。请确保正确连接MPU6050模块并在代码中适当调用这些函数来实现您的应用逻 DMP移植 先获取到移植所需的文件我使用的文件来自正点原子陀螺仪资料,见文件添加进工程再进行自己mcu的适配修改 1.修改头文件路径为自己的头文件路径 inv_mpu.c 修改 inv_mpu_dmp_motion_driver.c 修改 2.修改I2C读写函数为自己mcu平台的读写函数 inv_mpu.c 修改为 3.修改延时函数为自己平台的延时函数 inv_mpu.c 修改为 inv_mpu_dmp_motion_driver.c 修改 4.修改MPU6050的地址 mpu6050.h 修改MPU6050地址为0XD0 inv_mpu.c 修改MPU6050地址为0XD0 软件I2C读取时不需要修改这个地址 使用举例 /* 初始化MPU6050 */PRINT_LOG(File:%s Line:%d Function:%s\r\n , __FILE__, __LINE__, __FUNCTION__);int ret 0;float pit, rol, yaw;int16_t acc_x, acc_y, acc_z;int16_t gyr_x, gyr_y, gyr_z;int16_t temp;ret 1;ret mpu6050_init();if (ret ! 0){PRINT_LOG(File:%s Line:%d Function:%s\r\n , __FILE__, __LINE__, __FUNCTION__);printf(MPU6050 init failed!\r\n);}ret 1;while(ret){/* 初始化MPU6050 DMP */ret mpu6050_dmp_init();if (ret ! 0){printf(MPU6050 DMP init failed!\r\n);}}while (1){/* 获取MPU6050 DMP处理后的数据 */ret mpu6050_dmp_get_data(pit, rol, yaw);/* 获取MPU6050加速度值 */ret mpu6050_get_accelerometer(acc_x, acc_y, acc_z);/* 获取MPU6050陀螺仪值 */ret mpu6050_get_gyroscope(gyr_x, gyr_y, gyr_z);/* 获取MPU6050温度值 */ret mpu6050_get_temperature(temp);/* 上传相关数据信息至串口调试助手 */printf(pit: %.2f, rol: %.2f, yaw: %.2f,\r\n , pit, rol, yaw);printf(acc_x: %d, acc_y: %d, acc_z: %d, \r\n, acc_x, acc_y, acc_z);printf(gyr_x: %d, gyr_y: %d, gyr_z: %d, \r\n, gyr_x, gyr_y, gyr_z);printf(temp: %d\r\n, temp);ret mpu6050_dmp_get_data(pit, rol, yaw);printf(pit: %.2f, rol: %.2f, yaw: %.2f,\r\n , pit, rol, yaw);HAL_Delay(5000); // mpu6050_init(); // mpu6050_dmp_init();}这段代码初始化了MPU6050传感器并使用DMP数字运动处理模块获取传感器的姿态数据俯仰、横滚和偏航加速度数据陀螺仪数据和温度数据。然后它通过串口调试助手打印这些数据。在主循环中代码等待5秒钟后重复获取和打印数据。 请注意上述代码可能需要根据您的具体硬件配置和要求进行修改和适应。确保正确连接MPU6050模块并根据您的需求进行必要的初始化和配置。 如果文章对您有帮助点赞支持感谢
http://www.w-s-a.com/news/348543/

相关文章:

  • 网站建设找谁做seo基础知识培训
  • 微网站怎么做的好建设网站不会写代码
  • 广州外贸网站制作wordpress信息搜索插件
  • 福建高端网站建设个人公众号怎么制作教程
  • 企业网站有哪些举几个例子wordpress ie兼容插件
  • 高端的深圳网站页面设计福清市建设局官方网站
  • 安装网站到服务器合肥建设干部学校网站
  • 影视网站如何做销售案例网站
  • 建设网站对比方案龙岗网站开发公司
  • 网站开发标准网站建设公司兴田德润可信赖
  • 如何建设一个公众号电影网站自动seo优化
  • 个人网站能备案吗酱香拿铁采取了哪些网络营销方式
  • 网站建设及推广好做吗自己做的网站加入购物车价格
  • 涡阳在北京做网站的名人注册一个免费的网站
  • 三门峡建设环境局网站公司注册网上核名通道
  • 叶县建设局网站要看网海外域名是多少
  • 网站运行环境配置Wordpress支付时效
  • logo设计网站知乎港北网站建设
  • 北京市保障性住房建设投资中心官方网站有限责任公司的特点
  • 做网站卖互联网营销怎么做
  • 晋州市建设局网站建站网站系统
  • 专业网站优化方案广东微信网站制作报价表
  • 北京网站建设公司分形科技简述营销网站建设策略
  • 汉中网站建设有限公司vue网站开发
  • 网站备案背景幕布阳江东莞网站建设
  • 北京网站建设要多少钱html网站标签
  • 做兼职做网站的是什么公司网站怎么修改
  • 舆情监控都有哪些内容西安seo网站公司
  • 网站有域名没备案天津网络营销
  • 哈巴狗模式网站开发电子商务平台建设与运营技术