Inglés | 简体中文 | 繁體中文 | 日本語 | alemán | 한국어
El MPU6050 es el primer dispositivo MotionTracking de 6 ejes integrado del mundo que combina un giroscopio de 3 ejes, un acelerómetro de 3 ejes y un Digital Motion Processor™ (DMP), todo en un pequeño paquete de 4x4x0,9 mm. Con su bus de sensor I2C dedicado, acepta directamente entradas de una brújula externa de 3 ejes para proporcionar una salida MotionFusion™ completa de 9 ejes. El dispositivo MPU6050 MotionTracking, con su integración de 6 ejes, MotionFusion™ integrado y firmware de calibración en tiempo de ejecución, permite a los fabricantes eliminar la costosa y compleja selección, calificación e integración a nivel de sistema de dispositivos discretos, garantizando un rendimiento de movimiento óptimo para consumidores. El MPU6050 también está diseñado para interactuar con múltiples sensores digitales no inerciales, como sensores de presión, en su puerto I2C auxiliar. El MPU6050 tiene un tamaño compatible con la familia MPU30X0. El MPU6050 cuenta con tres convertidores analógicos a digitales (ADC) de 16 bits para digitalizar las salidas del giroscopio y tres ADC de 16 bits para digitalizar las salidas del acelerómetro. Para un seguimiento preciso de movimientos rápidos y lentos, las piezas cuentan con un giroscopio de escala completa programable por el usuario de ±250, ±500, ±1000 y ±2000°/seg (dps) y un acelerómetro de escala completa programable por el usuario. rango de ±2g, ±4g, ±8g y ±16g.
LibDriver MPU6050 es el controlador de funciones completas de mpu6050 lanzado por LibDriver. Proporciona lectura de aceleración, lectura de velocidad angular, lectura de ángulo de actitud, lectura de dmp, detección de toque y otras funciones. LibDriver cumple con MISRA.
/src incluye archivos fuente LibDriver MPU6050.
/interface incluye la plantilla independiente de la plataforma IIC LibDriver MPU6050.
/test incluye el código de prueba del controlador LibDriver MPU6050 y este código puede probar la función necesaria del chip de forma sencilla.
/ejemplo incluye código de muestra de LibDriver MPU6050.
/doc incluye el documento fuera de línea LibDriver MPU6050.
/hoja de datos incluye la hoja de datos de MPU6050.
/project incluye el código de muestra común de la placa de desarrollo de MCU y Linux. Todos los proyectos utilizan el script de shell para depurar el controlador y las instrucciones detalladas se pueden encontrar en README.md de cada proyecto.
/misra incluye los resultados del escaneo de códigos LibDriver MISRA.
Consulte la plantilla independiente de la plataforma IIC/interfaz y finalice el controlador IIC de su plataforma.
Agregue el directorio /src, el controlador de interfaz para su plataforma y sus propios controladores a su proyecto; si desea utilizar los controladores de ejemplo predeterminados, agregue el directorio /example a su proyecto.
Puede consultar los ejemplos en el directorio /example para completar su propio controlador. Si desea utilizar los ejemplos de programación predeterminados, aquí le explicamos cómo utilizarlos.
#include "driver_mpu6050_basic.h"
uint8_t res ;
uint32_t i ;
uint32_t times ;
float g [ 3 ];
float dps [ 3 ];
float degrees ;
mpu6050_address_t addr ;
/* init */
addr = MPU6050_ADDRESS_AD0_LOW ;
res = mpu6050_basic_init ( addr );
if ( res != 0 )
{
return 1 ;
}
...
/* read all */
times = 3 ;
for ( i = 0 ; i < times ; i ++ )
{
/* read */
if ( mpu6050_basic_read ( g , dps ) != 0 )
{
( void ) mpu6050_basic_deinit ();
return 1 ;
}
...
if ( mpu6050_basic_read_temperature ( & degrees ) != 0 )
{
( void ) mpu6050_basic_deinit ();
return 1 ;
}
...
/* output */
mpu6050_interface_debug_print ( "mpu6050: %d/%d.n" , i + 1 , times );
mpu6050_interface_debug_print ( "mpu6050: acc x is %0.2fg.n" , g [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc y is %0.2fg.n" , g [ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: acc z is %0.2fg.n" , g [ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro x is %0.2fdps.n" , dps [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro y is %0.2fdps.n" , dps [ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro z is %0.2fdps.n" , dps [ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: temperature %0.2fC.n" , degrees );
...
/* delay 1000 ms */
mpu6050_interface_delay_ms ( 1000 );
...
}
...
/* deinit */
( void ) mpu6050_basic_deinit ();
return 0 ;
#include "driver_mpu6050_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 ];
mpu6050_address_t addr ;
/* gpio init */
if ( gpio_interrupt_init () != 0 )
{
return 1 ;
}
g_gpio_irq = mpu6050_fifo_irq_handler ;
/* init */
addr = MPU6050_ADDRESS_AD0_LOW ;
if ( mpu6050_fifo_init ( addr ) != 0 )
{
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
/* delay 100 ms */
mpu6050_interface_delay_ms ( 100 );
...
times = 3 ;
for ( i = 0 ; i < times ; i ++ )
{
len = 128 ;
/* read */
if ( mpu6050_fifo_read ( gs_accel_raw , gs_accel_g ,
gs_gyro_raw , gs_gyro_dps , & len ) != 0 )
{
( void ) mpu6050_fifo_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
...
/* output */
mpu6050_interface_debug_print ( "mpu6050: %d/%d.n" , i + 1 , times );
mpu6050_interface_debug_print ( "mpu6050: fifo %d.n" , len );
mpu6050_interface_debug_print ( "mpu6050: acc x[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc y[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: acc z[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro x[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro y[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro z[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 2 ]);
...
/* delay 100 ms */
mpu6050_interface_delay_ms ( 100 );
...
}
...
/* deinit */
( void ) mpu6050_fifo_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 0 ;
#include "driver_mpu6050_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 ];
mpu6050_address_t addr ;
static void a_receive_callback ( uint8_t type )
{
switch ( type )
{
case MPU6050_INTERRUPT_MOTION :
{
mpu6050_interface_debug_print ( "mpu6050: irq motion.n" );
break ;
}
case MPU6050_INTERRUPT_FIFO_OVERFLOW :
{
mpu6050_interface_debug_print ( "mpu6050: irq fifo overflow.n" );
break ;
}
case MPU6050_INTERRUPT_I2C_MAST :
{
mpu6050_interface_debug_print ( "mpu6050: irq i2c master.n" );
break ;
}
case MPU6050_INTERRUPT_DMP :
{
mpu6050_interface_debug_print ( "mpu6050: irq dmpn" );
break ;
}
case MPU6050_INTERRUPT_DATA_READY :
{
mpu6050_interface_debug_print ( "mpu6050: irq data readyn" );
break ;
}
default :
{
mpu6050_interface_debug_print ( "mpu6050: irq unknown code.n" );
break ;
}
}
}
static void a_dmp_tap_callback ( uint8_t count , uint8_t direction )
{
switch ( direction )
{
case MPU6050_DMP_TAP_X_UP :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq x up with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_X_DOWN :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq x down with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Y_UP :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq y up with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Y_DOWN :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq y down with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Z_UP :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq z up with %d.n" , count );
break ;
}
case MPU6050_DMP_TAP_Z_DOWN :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq z down with %d.n" , count );
break ;
}
default :
{
mpu6050_interface_debug_print ( "mpu6050: tap irq unknown code.n" );
break ;
}
}
}
static void a_dmp_orient_callback ( uint8_t orientation )
{
switch ( orientation )
{
case MPU6050_DMP_ORIENT_PORTRAIT :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq portrait.n" );
break ;
}
case MPU6050_DMP_ORIENT_LANDSCAPE :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq landscape.n" );
break ;
}
case MPU6050_DMP_ORIENT_REVERSE_PORTRAIT :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq reverse portrait.n" );
break ;
}
case MPU6050_DMP_ORIENT_REVERSE_LANDSCAPE :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq reverse landscape.n" );
break ;
}
default :
{
mpu6050_interface_debug_print ( "mpu6050: orient irq unknown code.n" );
break ;
}
}
}
/* init */
if ( gpio_interrupt_init () != 0 )
{
return 1 ;
}
g_gpio_irq = mpu6050_dmp_irq_handler ;
/* run dmp function */
addr = MPU6050_ADDRESS_AD0_LOW ;
if ( mpu6050_dmp_init ( 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 */
mpu6050_interface_delay_ms ( 500 );
...
times = 3 ;
for ( i = 0 ; i < times ; i ++ )
{
len = 128 ;
/* read */
if ( mpu6050_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 ) mpu6050_dmp_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
/* output */
mpu6050_interface_debug_print ( "mpu6050: %d/%d.n" , i + 1 , times );
mpu6050_interface_debug_print ( "mpu6050: fifo %d.n" , len );
mpu6050_interface_debug_print ( "mpu6050: pitch[0] is %0.2fdeg.n" , gs_pitch [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: roll[0] is %0.2fdeg.n" , gs_roll [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: yaw[0] is %0.2fdeg.n" , gs_yaw [ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc x[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: acc y[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: acc z[0] is %0.2fg.n" , gs_accel_g [ 0 ][ 2 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro x[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 0 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro y[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 1 ]);
mpu6050_interface_debug_print ( "mpu6050: gyro z[0] is %0.2fdps.n" , gs_gyro_dps [ 0 ][ 2 ]);
/* delay 500 ms */
mpu6050_interface_delay_ms ( 500 );
....
/* get the pedometer step count */
res = mpu6050_dmp_get_pedometer_counter ( & cnt );
if ( res != 0 )
{
( void ) mpu6050_dmp_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 1 ;
}
...
}
...
/* deinit */
( void ) mpu6050_dmp_deinit ();
g_gpio_irq = NULL ;
( void ) gpio_interrupt_deinit ();
return 0 ;
Documentos en línea: https://www.libdriver.com/docs/mpu6050/index.html.
Documentos sin conexión: /doc/html/index.html.
Consulte CONTRIBUTING.md.
Copyright (c) 2015 - presente LibDriver Todos los derechos reservados
La licencia MIT (MIT)
Por la presente se concede permiso, sin coste alguno, a cualquier persona que obtenga una copia
de este software y archivos de documentación asociados (el "Software"), para tratar
en el Software sin restricción, incluidos, entre otros, los derechos
utilizar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender
copias del Software y para permitir a las personas a quienes el Software es
proporcionado para ello, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todos
copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O
IMPLÍCITAS, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD,
IDONEIDAD PARA UN FIN PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO EL
LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMACIÓN, DAÑOS U OTROS
RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRA MANERA, QUE SURJA DE,
FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL
SOFTWARE.
Envíe un correo electrónico a [email protected].