OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5119|回复: 1

关于MPU6050读取传感器原始数据问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-10-3
在线时间
3 小时
发表于 2020-10-6 18:02:17 | 显示全部楼层 |阅读模式
5金钱
问题描述有点长,我已经献上我的所有币,希望能有大佬解决,谢谢
目的:使用中国移动的M5311的硬件I2C接口和MPU6050通信,将获得的运动数据发送到串口调试助手
问题:现在问题是:可以读出除了加速度数据寄存器(Accelerometer Measurements)和温度数据寄存器(Temperature Measurement)还有角速度数据寄存器(Gyroscope Measurements)之外的全部寄存器的数据,也就是说,除了这几个寄存器的数据不能通过I2C总线读取,其他的MPU6050寄存器都可以读取,当然也都可以写入,我使用能成功读取其他寄存器数据的函数去读这三个数据寄存器的值,得到的全都是0。下面是我的代码
  1. #include"mpu6050.h"



  2. //下面为移植程序,移植自正点原子的ATK-MPU6050资料



  3. //从串口上传数据给匿名四轴上位机
  4. void uart_niming_report(u8 fun, u8 *data, u8 len)
  5. {
  6.     u8 send_buf[32];
  7.     u8 i;
  8.     if(len>28) return;
  9.     send_buf[len+3] = 0;
  10.     send_buf[0] = 0x88;
  11.     send_buf[1] = fun;
  12.     send_buf[2] = len;
  13.     for(i=0;i<len;i++) send_buf[3+i] = data[i];
  14.     for(i=0;i<len+3;i++) send_buf[len+3] += send_buf[i];
  15.     opencpu_uart_send(HAL_UART_1,send_buf,len+4);
  16. }

  17. //发送加速度和陀螺仪原始数据
  18. void mpu6050_send_data(short aacx, short aacy, short aacz, short gyrox, short gyroy, short gyroz)
  19. {
  20.     u8 tbuf[12];
  21.     tbuf[0] = (aacx>>8)&0xff;
  22.     tbuf[1] = aacx&0xff;
  23.     tbuf[2] = (aacy>>8)&0xff;
  24.     tbuf[3] = aacy&0xff;
  25.     tbuf[4] = (aacz>>8)&0xff;
  26.     tbuf[5] = aacz&0xff;
  27.     tbuf[6] = (gyrox>>8)&0xff;
  28.     tbuf[7] = gyrox&0xff;
  29.     tbuf[8] = (gyroy>>8)&0xff;
  30.     tbuf[9] = gyroy&0xff;
  31.     tbuf[10] = (gyroz>>8)&0xff;
  32.     tbuf[11] = gyroz&0xff;
  33.     // opencpu_printf(tbuf);
  34.     uart_niming_report(0xa1,tbuf,12);
  35. }

  36. u8 mpu_init(void)
  37. {
  38.     u8 res, ack_flag, reg_flag;
  39.     opencpu_i2c_init();
  40.     opencpu_printf("1");
  41.     opencpu_i2c_set_freq(HAL_I2C_FREQUENCY_50K);
  42.     opencpu_printf("2");
  43.     ack_flag = mpu_write_byte(MPU_PWR_MGMT1_REG,0x80);
  44.     opencpu_printf("3");
  45.     vTaskDelay(10);  
  46.     reg_flag = mpu_read_byte(MPU_PWR_MGMT1_REG);
  47.     opencpu_uart_send(HAL_UART_1, &#174;_flag, 1);
  48.     opencpu_uart_send(HAL_UART_1,&ack_flag,1);
  49.     ack_flag = mpu_write_byte(MPU_PWR_MGMT1_REG, 0x00);
  50.     opencpu_uart_send(HAL_UART_1,&ack_flag,1);
  51.     opencpu_printf("4");
  52.     ack_flag = mpu_set_gyro_fsr(3);
  53.     opencpu_uart_send(HAL_UART_1, &ack_flag, 1);
  54.     opencpu_printf("5");
  55.     mpu_set_accel_fsr(1);
  56.     opencpu_printf("6");
  57.     mpu_set_rate(50);
  58.     opencpu_printf("7");
  59.     mpu_write_byte(MPU_INT_EN_REG, 0x00);
  60.     opencpu_printf("8");
  61.     mpu_write_byte(MPU_USER_CTRL_REG, 0x00);
  62.     opencpu_printf("9");
  63.     mpu_write_byte(MPU_FIFO_EN_REG, 0x80);
  64.     reg_flag = mpu_read_byte(MPU_FIFO_EN_REG);
  65.     opencpu_uart_send(HAL_UART_1, &#174;_flag, 1);
  66.     opencpu_printf("10");
  67.     res = mpu_read_byte(MPU_DEVICE_ID_REG);
  68.     opencpu_printf("11");
  69.     if(res == MPU_ADDR)
  70.     {
  71.         opencpu_printf("12");
  72.         opencpu_uart_send(HAL_UART_1, &res, 1);
  73.         mpu_write_byte(MPU_PWR_MGMT1_REG, 0x01);
  74.         reg_flag = mpu_read_byte(MPU_PWR_MGMT1_REG);
  75.         opencpu_uart_send(HAL_UART_1, &#174;_flag, 1);
  76.         mpu_write_byte(MPU_PWR_MGMT2_REG, 0x00);
  77.         mpu_set_rate(50);
  78.     }
  79.     else return 1;
  80.     return 0;
  81. }

  82. u8 mpu_write_byte(u8 reg,u8 data)
  83. {
  84.     // opencpu_i2c_init();
  85.     // reg = (reg << 1)|0;
  86.     u8 buf[2] = {reg,data};
  87.     u8 ack_flag;
  88.     ack_flag = opencpu_i2c_write(MPU_ADDR, buf, 2);
  89.     return ack_flag;

  90. //     int ack_flag;
  91. //     if(ack_flag = opencpu_i2c_write(MPU_ADDR, &#174;, 1))
  92. //     {
  93. //         opencpu_i2c_deinit();
  94. //         return 1;
  95. //     }
  96. //     opencpu
  97. }

  98. u8 mpu_read_byte(u8 reg)
  99. {
  100.     u8 res;
  101.     opencpu_i2c_write_read(MPU_ADDR, reg, &res, 1);
  102.     return res;
  103. }

  104. u8 mpu_read_len(u8 reg, u8 len, u8 *buf)
  105. {
  106.     u8 i;
  107.     for(i=0;i<len;i++)
  108.     {
  109.         *(buf+i) = mpu_read_byte(reg+i);
  110.     }
  111.     return 0;
  112. }

  113. u8 mpu_write_len(u8 addr, u8 reg, u8 len, u8 *buf)
  114. {
  115.     u8 i;
  116.     u8 ack_flag;
  117.     u8 *new_buf;
  118.     new_buf = (u8*)malloc(sizeof(u8)*(len+1));
  119.     for(i=0; i<len; i++)
  120.     {
  121.         new_buf[len-i] = buf[len-1-i];
  122.     }
  123.     new_buf[0] = reg;
  124.     ack_flag = opencpu_i2c_write(addr, new_buf, len+1);
  125.     return ack_flag;
  126. }

  127. u8 mpu_get_accelerometer(short *ax, short *ay, short *az)
  128. {
  129.     u8 buf[6], res;
  130.     res = mpu_read_len(MPU_ACCEL_XOUTH_REG, 6, buf);
  131.     opencpu_printf("a");
  132.     if(res==0)
  133.     {
  134.         opencpu_printf("b");
  135.         *ax = ((u16_t)buf[0]<<8)|buf[1];
  136.         *ay = ((u16_t)buf[2]<<8)|buf[3];
  137.         *az = ((u16_t)buf[4]<<8)|buf[5];
  138.         opencpu_uart_send(HAL_UART_1, ax, 2);
  139.     }
  140.     return res;
  141. }

  142. u8 mpu_get_gyroscope(short *gx,short *gy,short *gz)
  143. {
  144.     u8 buf[6],res;  
  145.         res = mpu_read_len(MPU_GYRO_XOUTH_REG,6,buf);
  146.     opencpu_printf("c");
  147.         if(res==0)
  148.         {
  149.         opencpu_printf("d");
  150.                 *gx=((u16_t)buf[0]<<8)|buf[1];  
  151.                 *gy=((u16_t)buf[2]<<8)|buf[3];  
  152.                 *gz=((u16_t)buf[4]<<8)|buf[5];
  153.         opencpu_uart_send(HAL_UART_1, gx, 2);
  154.         }        
  155.     return res;
  156. }

  157. short mpu_get_temperature(void)
  158. {
  159.     u8 buf[2];
  160.     short raw;
  161.         float temp;
  162.         mpu_read_len(MPU_TEMP_OUTH_REG,2,buf);
  163.     raw=((u16_t)buf[0]<<8)|buf[1];  
  164.     temp=36.53+((double)raw)/340;  
  165.     return temp*100;
  166. }

  167. u8 mpu_set_lpf(u16_t lpf)
  168. {
  169.         u8 data=0;
  170.         if(lpf>=188)data=1;
  171.         else if(lpf>=98)data=2;
  172.         else if(lpf>=42)data=3;
  173.         else if(lpf>=20)data=4;
  174.         else if(lpf>=10)data=5;
  175.         else data=6;
  176.         return mpu_write_byte(MPU_CFG_REG,data);//设置数字低通滤波器
  177. }

  178. u8 mpu_set_rate(u16_t rate)
  179. {
  180.         u8 data, reg_flag;
  181.         if(rate>1000)rate=1000;
  182.         if(rate<4)rate=4;
  183.         data=1000/rate-1;
  184.         data=mpu_write_byte(MPU_SAMPLE_RATE_REG,data);        //设置数字低通滤波器
  185.     reg_flag = mpu_read_byte(MPU_SAMPLE_RATE_REG);
  186.     opencpu_uart_send(HAL_UART_1, &#174;_flag, 1);
  187.         return mpu_set_lpf(rate/2);        //自动设置lpf为采样率的一半
  188. }

  189. u8 mpu_set_accel_fsr(u8 fsr)
  190. {
  191.     u8 reg_flag;
  192.         mpu_write_byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围
  193.     reg_flag = mpu_read_byte(MPU_ACCEL_CFG_REG);
  194.     opencpu_uart_send(HAL_UART_1, reg_flag, 1);
  195.     return 0;
  196. }

  197. u8 mpu_set_gyro_fsr(u8 fsr)
  198. {
  199.     u8 reg_flag;
  200.         mpu_write_byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围
  201.     reg_flag = mpu_read_byte(MPU_GYRO_CFG_REG);
  202.     opencpu_uart_send(HAL_UART_1, &#174;_flag, 1);
  203.     return 0;
  204. }

复制代码
然后是我的main.c 函数
  1. short aacx, aacy, aacz;
  2.         short gyrox, gyroy, gyroz;
  3.         short temp, init_flag;
  4.         custom_uart_init();
  5.         init_flag = mpu_init();
  6.         opencpu_uart_send(HAL_UART_1, &init_flag, 1);
  7.         opencpu_printf("4");
  8.         while(1)
  9.         {
  10.                 opencpu_printf("5");
  11.                 temp = mpu_read_byte(MPU_ACCEL_XOUTH_REG);
  12.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  13.                 temp = mpu_read_byte(MPU_ACCEL_XOUTL_REG);
  14.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  15.                 temp = mpu_read_byte(MPU_ACCEL_YOUTH_REG);
  16.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  17.                 temp = mpu_read_byte(MPU_ACCEL_YOUTL_REG);
  18.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  19.                 temp = mpu_read_byte(MPU_ACCEL_ZOUTH_REG);
  20.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  21.                 temp = mpu_read_byte(MPU_ACCEL_ZOUTL_REG);
  22.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  23.                 temp = mpu_read_byte(MPU_TEMP_OUTH_REG);
  24.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  25.                 temp = mpu_read_byte(MPU_TEMP_OUTL_REG);
  26.                 opencpu_uart_send(HAL_UART_1, &temp, 1);
  27.                 vTaskDelay(200);
  28. }
复制代码
说明:上面的<opencpu_printf>函数和<opencpu_uart_send>函数都是通过串口向上位机传递数据,实际上是我通过串口数据调试我的程序,现在测试的结果如下
  1. [17:22:46.386]收←◆31 32 33
  2. [17:22:46.480]收←◆00 00 00 34 18 00 35 08 36 13 37 38 39 80 31 30 31 31 31 32 68 01 13 00 34 35 00 00 00 00 00 00 00 00
复制代码
上面的输出中31 32 33是调用<mpu_init>函数时opencpu_printf打印的;
然后延时了100ms   <vTaskDelay(10)>
接下来的00 00 00可以不用管,34是打印的"4"
18是调用了<mpu_set_gyro_fsr>时获取的陀螺仪设置寄存器的值,也就是如下所示
  1. u8 mpu_set_gyro_fsr(u8 fsr)
  2. {
  3.     u8 reg_flag;
  4.         mpu_write_byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围
  5.     reg_flag = mpu_read_byte(MPU_GYRO_CFG_REG);
  6.     opencpu_uart_send(HAL_UART_1, &reg_flag, 1);
  7.     return 0;
  8. }
复制代码
通过<mpu_read_byte>读取陀螺仪设置寄存器获取它的值,可以打印出18,证明写入设置和读取是成功的
到这一步其实可以证明我的<mpu_read_byte>函数,和<mpu_write_byte>函数都是没有问题的,可以通过I2C写入和读取
但是
  1. 34 35 00 00 00 00 00 00 00 00
复制代码
到最后这几位,就到了main函数,可以看出,串口先打印了“4”,“5”,然后通过<mpu_read_byte>获取加速度数据寄存器的值,发现全部都为0。
当然,在获取值的时候我在不停让传感器运动,但是输出的全都是00,没有任何变化。
如果我的<mpu_read_byte>可以读取其他寄存器的值,按理来说应该也可以读取加速度数据寄存器的值,但是读不出来,我也很困扰。
设置寄存器的初始化都是移植自正点原子的程序,应该没什么问题。先在不知道问题出在哪。如果能解决,十分感谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2020-10-7 23:23:33 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 10:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表