123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #include "MPU6050.h"
- #include "IIC.h"
- /**
- * @brief 写数据到MPU6050寄存器
- * @param
- * @retval
- */
- void MPU6050_WriteReg(u8 reg_add,u8 reg_dat)
- {
- IIC_start();
- IIC_send_byte(MPU6050_WriteAddr);
- IIC_wait_ack();
- IIC_send_byte(reg_add);
- IIC_wait_ack();
- IIC_send_byte(reg_dat);
- IIC_wait_ack();
- IIC_stop();
- }
- /**
- * @brief 从MPU6050寄存器读取数据
- * @param
- * @retval
- */
- void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num)
- {
- unsigned char i;
-
- IIC_start();
- IIC_send_byte(MPU6050_WriteAddr);
- IIC_wait_ack();
- IIC_send_byte(reg_add);
- IIC_wait_ack();
-
- IIC_start();
- IIC_send_byte(MPU6050_ReadAddr);
- IIC_wait_ack();
-
- for(i=0;i<(num-1);i++){
- *Read=IIC_read_byte(1);
- Read++;
- }
- *Read=IIC_read_byte(0);
- IIC_stop();
- }
- /**
- * @brief 初始化MPU6050芯片
- * @param
- * @retval
- */
- void MPU6050_Init(void)
- {
- IIC_init();
- //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
- DELAYClass.DelayMs(1000);
- MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //解除休眠状态
- MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); //陀螺仪采样率,1KHz
- MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06); //低通滤波器的设置,截止频率是1K,带宽是5K
- MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00); //配置加速度传感器工作在2G模式,不自检
- MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18); //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
- MPU6050ReadID();
- }
- /**
- * @brief 读取MPU6050的ID
- * @param
- * @retval
- */
- uint8_t MPU6050ReadID(void)
- {
- unsigned char Re = 0;
- MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1); //读器件地址
- if(Re != 0x68)
- {
- printf("MPU6050 dectected error!\n");
- return 0;
- }
- else
- {
- printf("MPU6050 ID = 0x%02X\n",Re);
- return 1;
- }
-
- }
- /**
- * @brief 读取MPU6050的加速度数据
- * @param
- * @retval
- */
- void MPU6050ReadAcc(short *accData)
- {
- u8 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)
- {
- u8 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)
- {
- u8 buf[2];
- MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //读取温度值
- *tempData = (buf[0] << 8) | buf[1];
- }
- /**
- * @brief 读取MPU6050的温度数据,转化成摄氏度
- * @param
- * @retval
- */
- void MPU6050_ReturnTemp(float *Temperature)
- {
- short temp3;
- u8 buf[2];
-
- MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //读取温度值
- temp3= (buf[0] << 8) | buf[1];
- *Temperature=((double) temp3/340.0)+36.53;
- }
|