单片机/MCU论坛
直播中

阿斯顿

6年用户 14经验值
擅长:接口/总线/驱动 RF/无线
私信 关注
[问答]

为什么我用C52通过I2C读取MPU6050一轴的数据,需要100ms这么久?

MPU6050用的君悦模块。
在串口模式下,用上位机接收数据,每组数据包括三轴加速度、三轴角速度、欧拉角、温度和时间戳也才50ms/每组。
而我切换成I2C模式后,用STC89C52RC的IO口模拟I2C接口读取MPU6050的数据,发现数据量少得可怜。于是我用单片机内的定时器记录了一下每次发送的时间,居然每次Read都要100ms左右,用Printf发送串口数据也要个3,40ms。这还只是一轴的数据而已啊!!一组六轴的数据,用了将近680ms,这根本没法用啊……只有20分了,急求各位帮忙看看!

单片机的晶振是11.0592Mhz,波特率9600。MPU6050没用DMP,读的是原始数据。
这是MPU6050的初始化代码:
  1. void InitMPU6050()
  2. {
  3.         SetBit(PWR_MGMT_1,7,1);//复位
  4.         Write(PWR_MGMT_1,0x00);//唤醒
  5.         Write(INT_ENABLE, 0x00);//禁用中断
  6.         SetBit(USER_CTRL,5,0);//禁用AUXI2C
  7.         Write(0x23,0x00);//禁用FIFO
  8.         Write(CONFIG,0x08);//禁用低通滤波器
  9.         Write(SMPLRT_DIV, 0x27);//采样率39+1=40
  10.         Write(GYRO_CONFIG,0x00);//陀螺仪正负250
  11.         Write(ACCEL_CONFIG, 0x00);//加速度正负2
  12.         SetBit(PWR_MGMT_1,0,1);//使用陀螺仪x轴做时钟
  13.         //使能三轴加速度和角速度
  14.         SetBit(0x6C,0,1);
  15.         SetBit(0x6C,1,1);
  16.         SetBit(0x6C,2,1);
  17.         SetBit(0x6C,3,1);
  18.         SetBit(0x6C,4,1);
  19.         SetBit(0x6C,5,1);
  20. }
这是读取代码:
  1. uchar Read(uchar REG_Address)
  2. {
  3.         uchar REG_data;
  4.         I2C_Start();
  5.         I2C_Send(SlaveAddress);
  6.         I2C_Send(REG_Address);
  7.         I2C_Start();
  8.         I2C_Send(SlaveAddress+1);
  9.         REG_data=I2C_Recv();
  10.         I2C_SendACK(1);   
  11.         I2C_Stop();
  12.         return REG_data;
  13. }
  14. int16 Getdata(uchar REG_Address)
  15. {
  16.         uchar H,L;
  17.         H=Read(REG_Address);
  18.         L=Read(REG_Address+1);
  19.         return (H<<8)+L;
  20. }


已退回20积分

回帖(1)

richthoffen

2019-7-19 16:51:44
用stm32吧  野火的资料上有源码  上位机资料也全
举报

更多回帖

发帖
×
20
完善资料,
赚取积分