MPU6050用的君悦模块。
在串口模式下,用上位机接收数据,每组数据包括三轴加速度、三轴角速度、欧拉角、温度和时间戳也才50ms/每组。
而我切换成I2C模式后,用STC89C52RC的IO口模拟I2C接口读取MPU6050的数据,发现数据量少得可怜。于是我用
单片机内的定时器记录了一下每次发送的时间,居然每次Read都要100ms左右,用Printf发送串口数据也要个3,40ms。这还只是一轴的数据而已啊!!一组六轴的数据,用了将近680ms,这根本没法用啊……只有20分了,急求各位帮忙看看!
单片机的晶振是11.0592Mhz,波特率9600。MPU6050没用DMP,读的是原始数据。
这是MPU6050的初始化代码:
- void InitMPU6050()
- {
- SetBit(PWR_MGMT_1,7,1);//复位
- Write(PWR_MGMT_1,0x00);//唤醒
- Write(INT_ENABLE, 0x00);//禁用中断
- SetBit(USER_CTRL,5,0);//禁用AUXI2C
- Write(0x23,0x00);//禁用FIFO
- Write(CONFIG,0x08);//禁用低通滤波器
- Write(SMPLRT_DIV, 0x27);//采样率39+1=40
- Write(GYRO_CONFIG,0x00);//陀螺仪正负250
- Write(ACCEL_CONFIG, 0x00);//加速度正负2
- SetBit(PWR_MGMT_1,0,1);//使用陀螺仪x轴做时钟
- //使能三轴加速度和角速度
- SetBit(0x6C,0,1);
- SetBit(0x6C,1,1);
- SetBit(0x6C,2,1);
- SetBit(0x6C,3,1);
- SetBit(0x6C,4,1);
- SetBit(0x6C,5,1);
- }
这是读取代码:
- uchar Read(uchar REG_Address)
- {
- uchar REG_data;
- I2C_Start();
- I2C_Send(SlaveAddress);
- I2C_Send(REG_Address);
- I2C_Start();
- I2C_Send(SlaveAddress+1);
- REG_data=I2C_Recv();
- I2C_SendACK(1);
- I2C_Stop();
- return REG_data;
- }
- int16 Getdata(uchar REG_Address)
- {
- uchar H,L;
- H=Read(REG_Address);
- L=Read(REG_Address+1);
- return (H<<8)+L;
- }