[DemoCode下载] 使用 Nano130控制MPU9250传感器

[复制链接]
 楼主| xixi2017 发表于 2023-2-10 11:36 | 显示全部楼层 |阅读模式
EC_Nano130_Control_MPU9250_Sensor_V1.00.zip (8.22 MB, 下载次数: 2)
本范例介绍如何使用 NANO130 与运动传感器 MPU9250 通讯以获取设备的运动轨迹和方向。
首先,Nano130 通过 I2C 接口对 MPU9250 进行初始化,设定模式为 Measurement Mode,取样频率为 125Hz,频宽为 5Hz,加速度测量范围±2g,角速度测量范围±2000 dps。
然后,通过 I2C 总线发出指令获取 MPU9250 测量到的九个数值,我们可以拿这些数值来做一些有趣的应用,比如,用加速度及角速度值记录移动轨迹,用磁力数值判断移动方向。
首先初始化 MPU9250:
  1. // Init MPU9250
  2. void Init_MPU9250(void)
  3. {

  4.     I2C0_Write(GYRO_ADDRESS, PWR_MGMT_1, 0x00);
  5.     I2C0_Write(GYRO_ADDRESS, SMPLRT_DIV, 0x07);
  6.     I2C0_Write(GYRO_ADDRESS, CONFIG, 0x06);
  7.     I2C0_Write(GYRO_ADDRESS, GYRO_CONFIG, 0x18);
  8.     I2C0_Write(GYRO_ADDRESS, ACCEL_CONFIG, 0x01);
  9. }
MCU 通过 I2C 获取 MPU9250 传感器测量到的加速度值,角速度值和磁力计值:
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]      Obtaining Accelerometer values (RAW Data)        
  3.         * @param                  none
  4.   * [url=home.php?mod=space&uid=266161]@return[/url]     none
  5.   *
  6.   * [url=home.php?mod=space&uid=1543424]@Details[/url]    Obtaining Accelerometer values
  7.   */       
  8. void READ_MPU9250_ACCEL(void)
  9. {
  10.     BUF[0] = I2C0_Read(ACCEL_ADDRESS, ACCEL_XOUT_L);
  11.     BUF[1] = I2C0_Read(ACCEL_ADDRESS, ACCEL_XOUT_H);
  12.     T_X =   (BUF[1] << 8) | BUF[0];
  13.     T_X /= 164;

  14.     BUF[2] = I2C0_Read(ACCEL_ADDRESS, ACCEL_YOUT_L);
  15.     BUF[3] = I2C0_Read(ACCEL_ADDRESS, ACCEL_YOUT_H);
  16.     T_Y =   (BUF[3] << 8) | BUF[2];
  17.     T_Y /= 164;
  18.     BUF[4] = I2C0_Read(ACCEL_ADDRESS, ACCEL_ZOUT_L);
  19.     BUF[5] = I2C0_Read(ACCEL_ADDRESS, ACCEL_ZOUT_H);
  20.     T_Z =   (BUF[5] << 8) | BUF[4];
  21.     T_Z /= 164;

  22. }

  23. /**
  24.   * @brief      Obtaining gyroscope values (RAW Data)        
  25.         * @param                  none
  26.   * @return     none
  27.   *
  28.   * @details    Obtaining gyroscope values
  29.   */       
  30. void READ_MPU9250_GYRO(void)
  31. {

  32.     BUF[0] = I2C0_Read(GYRO_ADDRESS, GYRO_XOUT_L);
  33.     BUF[1] = I2C0_Read(GYRO_ADDRESS, GYRO_XOUT_H);
  34.     T_X =   (BUF[1] << 8) | BUF[0];
  35.     T_X /= 16.4;

  36.     BUF[2] = I2C0_Read(GYRO_ADDRESS, GYRO_YOUT_L);
  37.     BUF[3] = I2C0_Read(GYRO_ADDRESS, GYRO_YOUT_H);
  38.     T_Y =   (BUF[3] << 8) | BUF[2];
  39.     T_Y /= 16.4;

  40.     BUF[4] = I2C0_Read(GYRO_ADDRESS, GYRO_ZOUT_L);
  41.     BUF[5] = I2C0_Read(GYRO_ADDRESS, GYRO_ZOUT_H);
  42.     T_Z =   (BUF[5] << 8) | BUF[4];
  43.     T_Z /= 16.4;

  44. }

  45. /**
  46.   * @brief      Obtaining Magnetomet values (RAW Data)        
  47.         * @param                  none
  48.   * @return     none
  49.   *
  50.   * @details    Obtaining Magnetomet values
  51.   */       
  52. void READ_MPU9250_MAG(void)
  53. {
  54.     I2C0_Write(GYRO_ADDRESS, 0x37, 0x02); //turn on Bypass Mode
  55.     CLK_SysTickDelay(10000);
  56.     I2C0_Write(MAG_ADDRESS, 0x0A, 0x01);
  57.     CLK_SysTickDelay(10000);
  58.     BUF[0] = I2C0_Read(MAG_ADDRESS, MAG_XOUT_L);
  59.     BUF[1] = I2C0_Read(MAG_ADDRESS, MAG_XOUT_H);
  60.     T_X = (BUF[1] << 8) | BUF[0];

  61.     BUF[2] = I2C0_Read(MAG_ADDRESS, MAG_YOUT_L);
  62.     BUF[3] = I2C0_Read(MAG_ADDRESS, MAG_YOUT_H);
  63.     T_Y =   (BUF[3] << 8) | BUF[2];

  64.     BUF[4] = I2C0_Read(MAG_ADDRESS, MAG_ZOUT_L);
  65.     BUF[5] = I2C0_Read(MAG_ADDRESS, MAG_ZOUT_H);
  66.     T_Z =   (BUF[5] << 8) | BUF[4];
  67. }
通过串口 1 将获取的数值打印出来:
  1. READ_MPU9250_ACCEL();  // Gravity acceleration 0.01g
  2.         printf("ACCEL:  X: %4d  Y: %4d  Z: %4d   /0.01 g\n", T_X, T_Y, T_Z);

  3.         READ_MPU9250_GYRO();      //angular velocity 1dps
  4.         printf("GYRO :  X: %4d  Y: %4d  Z: %4d   /1 dps\n", T_X, T_Y, T_Z);

  5.         READ_MPU9250_MAG();       //Magnetometer
  6.         printf("MAG  :  X: %4d  Y: %4d  Z: %4d   /0.6 uT\n\n\n", T_X, T_Y, T_Z);






幸福小强 发表于 2023-2-10 13:39 | 显示全部楼层
与6050的接口和命令是一样的吧
微信15323794243 发表于 2023-2-10 16:45 | 显示全部楼层
感谢分享
tpgf 发表于 2023-3-2 14:45 | 显示全部楼层
Nano130控制MPU9250是通过什么方式控制的饿呢
qcliu 发表于 2023-3-2 15:12 | 显示全部楼层
应该是通过iic通讯接口进行的控制 通讯内容应该是已经定义好了的
drer 发表于 2023-3-2 15:23 | 显示全部楼层
MPU9250回传的数据是原始数据,还得需要辅助算法得到位置
coshi 发表于 2023-3-2 16:39 | 显示全部楼层
返回的数值是模拟量还是数字量呀  还需要处理吗
kxsi 发表于 2023-3-2 17:09 | 显示全部楼层
感觉这些微型传感器的接口绝大部分都是iic接口的
Jacquetry 发表于 2023-3-2 18:52 | 显示全部楼层
需要算法计算位置吧
wiba 发表于 2023-3-3 08:00 | 显示全部楼层
一般来说 我们用一条iic总线外挂很多设备 是不是尽量要求这些设备的协议是一样的才比较方便操作呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

2006

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部