English | 简体中文 | 繁體中文 | 日本語 | Deutsch | 한국어
MPU9250是一个多芯片模块(MCM),由集成到单个QFN封装中的两个管芯组成。一个模具容纳3轴陀螺仪和3轴加速度计。另一个管芯装有旭化成微器件公司的AK8963 3轴磁强计。因此,MPU9250是一种9轴运动跟踪设备,它结合了3轴陀螺仪、3轴加速度计、3轴磁力计和数字运动处理器™ (DMP)全部在一个小的3x3x1mm封装中,可作为MPU6515的引脚兼容升级。MPU9250通过其专用的I2C传感器总线直接提供完整的9轴MotionFusion™ 输出MPU9250运动跟踪设备及其9轴集成、片上运动融合™, 和运行时校准固件,使制造商能够消除离散设备的昂贵和复杂的选择、鉴定和系统级集成,确保消费者的最佳运动性能。MPU9250还设计用于在其辅助I2C端口上与多个非惯性数字传感器(如压力传感器)接口。MPU925具有三个用于数字化陀螺仪输出的16位模数转换器(ADC)、三个用于对加速度计输出进行数字化的16位ADC和三个用于将磁力计输出数字化的16位数ADC。对于快速和慢速运动的精确跟踪,该部件具有±250、±500、±1000和±2000°/s(dps)的用户可编程陀螺仪满刻度范围、±2g、±4g、±8g和±16g的用户可编程序加速度计满刻度范围以及±4800μT的磁强计满刻度。
LibDriver MPU9250是LibDriver推出的MPU9250的全功能驱动,该驱动提供加速度读取、角速度读取、磁力计读取、姿态角读取、DMP读取和敲击检测等功能并且它符合MISRA标准。
/src目录包含了LibDriver MPU9250的源文件。
/interface目录包含了LibDriver MPU9250与平台无关的IIC,SPI总线模板。
/test目录包含了LibDriver MPU9250驱动测试程序,该程序可以简单的测试芯片必要功能。
/example目录包含了LibDriver MPU9250编程范例。
/doc目录包含了LibDriver MPU9250离线文档。
/datasheet目录包含了MPU9250数据手册。
/project目录包含了常用Linux与单片机开发板的工程样例。所有工程均采用shell脚本作为调试方法,详细内容可参考每个工程里面的README.md。
参考/interface目录下与平台无关的IIC,SPI总线模板,完成指定平台的IIC,SPI总线驱动。
将/src目录,/interface目录和/example目录加入工程。
uint8_t res;
uint32_t i;
uint32_t times;
float g[3];
float dps[3];
float ut[3];
float degrees;
mpu9250_address_t addr;
/* init */
addr = MPU9250_ADDRESS_AD0_LOW;
res = mpu9250_basic_init(MPU9250_INTERFACE_IIC, addr);
if (res != 0)
{
return 1;
}
...
/* read all */
times = 3;
for (i = 0; i < times; i++)
{
/* read */
if (mpu9250_basic_read(g, dps, ut) != 0)
{
(void)mpu9250_basic_deinit();
return 1;
}
...
if (mpu9250_basic_read_temperature(°rees) != 0)
{
(void)mpu9250_basic_deinit();
return 1;
}
...
/* output */
mpu9250_interface_debug_print("mpu9250: %d/%d.\n", i + 1, times);
mpu9250_interface_debug_print("mpu9250: acc x is %0.2fg.\n", g[0]);
mpu9250_interface_debug_print("mpu9250: acc y is %0.2fg.\n", g[1]);
mpu9250_interface_debug_print("mpu9250: acc z is %0.2fg.\n", g[2]);
mpu9250_interface_debug_print("mpu9250: gyro x is %0.2fdps.\n", dps[0]);
mpu9250_interface_debug_print("mpu9250: gyro y is %0.2fdps.\n", dps[1]);
mpu9250_interface_debug_print("mpu9250: gyro z is %0.2fdps.\n", dps[2]);
mpu9250_interface_debug_print("mpu9250: mag x is %0.2fuT.\n", ut[0]);
mpu9250_interface_debug_print("mpu9250: mag y is %0.2fuT.\n", ut[1]);
mpu9250_interface_debug_print("mpu9250: mag z is %0.2fuT.\n", ut[2]);
mpu9250_interface_debug_print("mpu9250: temperature %0.2fC.\n", degrees);
...
/* delay 1000 ms */
mpu9250_interface_delay_ms(1000);
...
}
...
/* deinit */
(void)mpu9250_basic_deinit();
return 0;
uint32_t i;
uint32_t times;
uint16_t len;
uint8_t (*g_gpio_irq)(void) = NULL;
static int16_t gs_accel_raw[128][3];
static float gs_accel_g[128][3];
static int16_t gs_gyro_raw[128][3];
static float gs_gyro_dps[128][3];
atic int16_t gs_mag_raw[128][3];
static float gs_mag_ut[128][3];
mpu9250_address_t addr;
/* gpio init */
if (gpio_interrupt_init() != 0)
{
return 1;
}
g_gpio_irq = mpu9250_fifo_irq_handler;
/* init */
addr = MPU9250_ADDRESS_AD0_LOW;
if (mpu9250_fifo_init(MPU9250_INTERFACE_IIC, addr) != 0)
{
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 1;
}
/* delay 100 ms */
mpu9250_interface_delay_ms(100);
...
times = 3;
for (i = 0; i < times; i++)
{
len = 128;
/* read */
if (mpu9250_fifo_read(gs_accel_raw, gs_accel_g,
gs_gyro_raw, gs_gyro_dps, gs_mag_raw, gs_mag_ut, &len) != 0)
{
(void)mpu9250_fifo_deinit();
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 1;
}
...
/* output */
mpu9250_interface_debug_print("mpu9250: %d/%d.\n", i + 1, times);
mpu9250_interface_debug_print("mpu9250: fifo %d.\n", len);
mpu9250_interface_debug_print("mpu9250: acc x[0] is %0.2fg.\n", gs_accel_g[0][0]);
mpu9250_interface_debug_print("mpu9250: acc y[0] is %0.2fg.\n", gs_accel_g[0][1]);
mpu9250_interface_debug_print("mpu9250: acc z[0] is %0.2fg.\n", gs_accel_g[0][2]);
mpu9250_interface_debug_print("mpu9250: gyro x[0] is %0.2fdps.\n", gs_gyro_dps[0][0]);
mpu9250_interface_debug_print("mpu9250: gyro y[0] is %0.2fdps.\n", gs_gyro_dps[0][1]);
mpu9250_interface_debug_print("mpu9250: gyro z[0] is %0.2fdps.\n", gs_gyro_dps[0][2]);
mpu9250_interface_debug_print("mpu9250: mag x[0] is %0.2fuT.\n", gs_mag_ut[0][0]);
mpu9250_interface_debug_print("mpu9250: mag y[0] is %0.2fuT.\n", gs_mag_ut[0][1]);
mpu9250_interface_debug_print("mpu9250: mag z[0] is %0.2fuT.\n", gs_mag_ut[0][2]);
...
/* delay 100 ms */
mpu9250_interface_delay_ms(100);
...
}
...
/* deinit */
(void)mpu9250_fifo_deinit();
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 0;
uint32_t i;
uint32_t times;
uint32_t cnt;
uint16_t len;
uint8_t (*g_gpio_irq)(void) = NULL;
static int16_t gs_accel_raw[128][3];
static float gs_accel_g[128][3];
static int16_t gs_gyro_raw[128][3];
static float gs_gyro_dps[128][3];
static int32_t gs_quat[128][4];
static float gs_pitch[128];
static float gs_roll[128];
static float gs_yaw[128];
static int32_t gs_quat[128][4];
static float gs_pitch[128];
static float gs_roll[128];
static float gs_yaw[128];
mpu9250_address_t addr;
static void a_receive_callback(uint8_t type)
{
switch (type)
{
case MPU9250_INTERRUPT_MOTION :
{
mpu9250_interface_debug_print("mpu9250: irq motion.\n");
break;
}
case MPU9250_INTERRUPT_FIFO_OVERFLOW :
{
mpu9250_interface_debug_print("mpu9250: irq fifo overflow.\n");
break;
}
case MPU9250_INTERRUPT_FSYNC_INT :
{
mpu9250_interface_debug_print("mpu9250: irq fsync int.\n");
break;
}
case MPU9250_INTERRUPT_DMP :
{
mpu9250_interface_debug_print("mpu9250: irq dmp\n");
break;
}
case MPU9250_INTERRUPT_DATA_READY :
{
mpu9250_interface_debug_print("mpu9250: irq data ready\n");
break;
}
default :
{
mpu9250_interface_debug_print("mpu9250: irq unknown code.\n");
break;
}
}
}
static void a_dmp_tap_callback(uint8_t count, uint8_t direction)
{
switch (direction)
{
case MPU9250_DMP_TAP_X_UP :
{
mpu9250_interface_debug_print("mpu9250: tap irq x up with %d.\n", count);
break;
}
case MPU9250_DMP_TAP_X_DOWN :
{
mpu9250_interface_debug_print("mpu9250: tap irq x down with %d.\n", count);
break;
}
case MPU9250_DMP_TAP_Y_UP :
{
mpu9250_interface_debug_print("mpu9250: tap irq y up with %d.\n", count);
break;
}
case MPU9250_DMP_TAP_Y_DOWN :
{
mpu9250_interface_debug_print("mpu9250: tap irq y down with %d.\n", count);
break;
}
case MPU9250_DMP_TAP_Z_UP :
{
mpu9250_interface_debug_print("mpu9250: tap irq z up with %d.\n", count);
break;
}
case MPU9250_DMP_TAP_Z_DOWN :
{
mpu9250_interface_debug_print("mpu9250: tap irq z down with %d.\n", count);
break;
}
default :
{
mpu9250_interface_debug_print("mpu9250: tap irq unknown code.\n");
break;
}
}
}
static void a_dmp_orient_callback(uint8_t orientation)
{
switch (orientation)
{
case MPU9250_DMP_ORIENT_PORTRAIT :
{
mpu9250_interface_debug_print("mpu9250: orient irq portrait.\n");
break;
}
case MPU9250_DMP_ORIENT_LANDSCAPE :
{
mpu9250_interface_debug_print("mpu9250: orient irq landscape.\n");
break;
}
case MPU9250_DMP_ORIENT_REVERSE_PORTRAIT :
{
mpu9250_interface_debug_print("mpu9250: orient irq reverse portrait.\n");
break;
}
case MPU9250_DMP_ORIENT_REVERSE_LANDSCAPE :
{
mpu9250_interface_debug_print("mpu9250: orient irq reverse landscape.\n");
break;
}
default :
{
mpu9250_interface_debug_print("mpu9250: orient irq unknown code.\n");
break;
}
}
}
/* init */
if (gpio_interrupt_init() != 0)
{
return 1;
}
g_gpio_irq = mpu9250_dmp_irq_handler;
/* init */
addr = MPU9250_ADDRESS_AD0_LOW;
if (mpu9250_dmp_init(MPU9250_INTERFACE_IIC, addr, a_receive_callback,
a_dmp_tap_callback, a_dmp_orient_callback) != 0)
{
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 1;
}
/* delay 500 ms */
mpu9250_interface_delay_ms(500);
...
times = 3;
for (i = 0; i < times; i++)
{
len = 128;
/* read */
if (mpu9250_dmp_read_all(gs_accel_raw, gs_accel_g,
gs_gyro_raw, gs_gyro_dps,
gs_quat,
gs_pitch, gs_roll, gs_yaw,
&len) != 0)
{
(void)mpu9250_dmp_deinit();
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 1;
}
/* output */
mpu9250_interface_debug_print("mpu9250: %d/%d.\n", i + 1, times);
mpu9250_interface_debug_print("mpu9250: fifo %d.\n", len);
mpu9250_interface_debug_print("mpu9250: pitch[0] is %0.2fdps.\n", gs_pitch[0]);
mpu9250_interface_debug_print("mpu9250: roll[0] is %0.2fdps.\n", gs_roll[0]);
mpu9250_interface_debug_print("mpu9250: yaw[0] is %0.2fdps.\n", gs_yaw[0]);
mpu9250_interface_debug_print("mpu9250: acc x[0] is %0.2fg.\n", gs_accel_g[0][0]);
mpu9250_interface_debug_print("mpu9250: acc y[0] is %0.2fg.\n", gs_accel_g[0][1]);
mpu9250_interface_debug_print("mpu9250: acc z[0] is %0.2fg.\n", gs_accel_g[0][2]);
mpu9250_interface_debug_print("mpu9250: gyro x[0] is %0.2fdps.\n", gs_gyro_dps[0][0]);
mpu9250_interface_debug_print("mpu9250: gyro y[0] is %0.2fdps.\n", gs_gyro_dps[0][1]);
mpu9250_interface_debug_print("mpu9250: gyro z[0] is %0.2fdps.\n", gs_gyro_dps[0][2]);
/* delay 500 ms */
mpu9250_interface_delay_ms(500);
....
/* get the pedometer step count */
res = mpu9250_dmp_get_pedometer_counter(&cnt);
if (res != 0)
{
(void)mpu9250_dmp_deinit();
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 1;
}
...
}
...
/* deinit */
(void)mpu9250_dmp_deinit();
g_gpio_irq = NULL;
(void)gpio_interrupt_deinit();
return 0;
在线文档: https://www.libdriver.com/docs/mpu9250/index.html
离线文档: /doc/html/index.html
版权 (c) 2015 - 现在 LibDriver 版权所有
MIT 许可证(MIT)
特此免费授予任何获得本软件副本和相关文档文件(下称“软件”)的人不受限制地处置该软件的权利,包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本,以及再授权被配发了本软件的人如上的权利,须在下列条件下:
上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
本软件是“如此”提供的,没有任何形式的明示或暗示的保证,包括但不限于对适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人都不对任何索赔、损害或其他责任负责,无论这些追责来自合同、侵权或其它行为中,还是产生于、源于或有关于本软件以及本软件的使用或其它处置。