英语| 简体中文| 繁体中文| 日本语|德意志| 한국어
MPU9250是一个多芯片模块(MCM),该模块由两个模具组成,该模块集成到单个QFN软件包中。一个模具容纳3轴陀螺仪和3轴加速度计。另一个模具容纳了Asahi Kasei Microdevices Corporation的AK8963 3轴磁力计。因此,MPU9250是一种9轴运动跟踪设备,结合了3轴陀螺仪,3轴加速度计,3轴磁力计和数字运动处理器(DMP),所有这些都可以在小型3x3x1mm套件中以PIN型的固定式升级为单位。 9轴MotionFusion™输出。 MPU9250运动跟踪设备,其9轴集成,芯片运动融合™和运行时校准固件,使制造商能够消除离散设备的昂贵且复杂的选择,资格和系统水平集成,并为消费者提供最佳运动性能,以供多个ITS互动的INS互动,以供多个固定的Interial Interformer.mpu9250,以下port.MPU9250具有三个16位类似物对数字转换器(ADC),用于数字化陀螺仪输出,三个16位ADC用于数字化加速度计输出和三个16位ADC,用于数字化磁力计输出。为了精确跟踪快速和缓慢的运动,该部分具有用户可编程的全尺度范围±250,±500,±1000和±2000°/sec(dps),用户可编程的加速度计的全尺度范围为±2G,±4G,±4G,±8G和±8G和±8G和±8G和±8G和±8G和±8G和±8G和一个范围。
Libdriver MPU9250是Libdriver推出的MPU9250的完整功能驱动程序。它提供加速度读数,角速度读数,磁力计读数,态度角度读数,DMP读数,TAP检测和其他功能。 Libdriver符合Misra的规定。
/src包括libdriver mpu9250源文件。
/接口包括Libdriver MPU9250 IIC,SPI平台独立模板。
/测试包括Libdriver MPU9250驱动程序测试代码,此代码可以简单地测试芯片必要的功能。
/示例包括Libdriver MPU9250示例代码。
/DOC包括Libdriver MPU9250离线文档。
/数据表包括MPU9250数据表。
/项目包括通用Linux和MCU开发委员会样本代码。所有项目都使用Shell脚本来调试驱动程序,并且可以在每个项目的readme.md中找到详细说明。
/Misra包括Libdriver Misra代码扫描结果。
参考 /接口IIC,SPI平台独立模板,并完成您的平台IIC,SPI驱动程序。
将 /src目录,平台的接口驱动程序以及您自己的驱动程序添加到项目中,如果您想使用默认示例驱动程序,请在项目中添加 /示例目录。
您可以参考 /示例目录中的示例以完成自己的驱动程序。如果您想使用默认的编程示例,则是如何使用它们的方法。
#include "driver_mpu9250_basic.h"
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 ( & degrees ) != 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 ; #include "driver_mpu9250_fifo.h"
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 ; #include "driver_mpu9250_dmp.h"
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 ];
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 dmpn" );
break ;
}
case MPU9250_INTERRUPT_DATA_READY :
{
mpu9250_interface_debug_print ( "mpu9250: irq data readyn" );
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.2fdeg.n" , gs_pitch [ 0 ]);
mpu9250_interface_debug_print ( "mpu9250: roll[0] is %0.2fdeg.n" , gs_roll [ 0 ]);
mpu9250_interface_debug_print ( "mpu9250: yaw[0] is %0.2fdeg.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)
特此免费授予任何获得副本的人的许可
该软件和相关文档文件(“软件”)
在软件中无限制的软件中,包括无限制的权利
使用,复制,修改,合并,发布,分发,转销和/或出售
软件的副本,并允许软件的人
符合以下条件的规定,可以这样做:
上述版权通知和此许可通知应包含
该软件的副本或大量部分。
该软件是“原样”提供的,没有任何形式的保证,明确或
暗示,包括但不限于适销性保证,
适合特定目的和非侵扰的适合度。在任何情况下都不会
作者或版权持有人应对任何索赔,损害赔偿或其他责任负责
责任,无论是在合同,侵权的诉讼中还是其他责任,是由
与软件或使用或与使用或其他交易有关
软件。
请发送电子邮件至[email protected]。