الإنجليزية | 简体中文 | 繁體中文 | 日本語 | الألمانية | شكرا
يعد MPU6050 أول جهاز متكامل لتتبع الحركة سداسي المحاور في العالم يجمع بين جيروسكوب ثلاثي المحاور ومقياس تسارع ثلاثي المحاور ومعالج الحركة الرقمي™ (DMP) كل ذلك في حزمة صغيرة بحجم 4 × 4 × 0.9 ملم. بفضل ناقل مستشعر I2C المخصص، فإنه يقبل المدخلات مباشرة من بوصلة خارجية ثلاثية المحاور لتوفير مخرجات MotionFusion™ كاملة ذات 9 محاور. جهاز MPU6050 MotionTracking، مع تكامله سداسي المحاور، وMotionFusion™ المدمج، والبرامج الثابتة لمعايرة وقت التشغيل، يمكّن المصنعين من التخلص من التحديد المكلف والمعقد، والتأهيل، والتكامل على مستوى النظام للأجهزة المنفصلة، مما يضمن أداء الحركة الأمثل للأجهزة المنفصلة. المستهلكين. تم تصميم MPU6050 أيضًا للتفاعل مع أجهزة استشعار رقمية متعددة غير قصورية، مثل أجهزة استشعار الضغط، على منفذ I2C المساعد. MPU6050 متوافق مع عائلة MPU30X0. يتميز MPU6050 بثلاثة محولات تناظرية إلى رقمية (ADCs) 16 بت لرقمنة مخرجات الجيروسكوب وثلاثة محولات ADC 16 بت لرقمنة مخرجات مقياس التسارع. من أجل التتبع الدقيق لكل من الحركات السريعة والبطيئة، تتميز الأجزاء بنطاق جيروسكوب كامل النطاق قابل للبرمجة بواسطة المستخدم يبلغ ±250، ±500، ±1000، و±2000 درجة/ثانية (dps) ومقياس تسارع كامل النطاق قابل للبرمجة بواسطة المستخدم نطاق ±2 جرام، ±4 جرام، ±8 جرام، و±16 جرام.
LibDriver MPU6050 هو برنامج التشغيل كامل الوظائف لـ mpu6050 الذي أطلقه LibDriver. يوفر قراءة التسارع، وقراءة السرعة الزاوية، وقراءة زاوية الموقف، وقراءة DMP، واكتشاف الصنبور ووظائف أخرى. LibDriver متوافق مع MISRA.
يتضمن /src ملفات مصدر LibDriver MPU6050.
/ تتضمن الواجهة قالبًا مستقلاً لمنصة LibDriver MPU6050 IIC.
/ يتضمن الاختبار رمز اختبار برنامج التشغيل LibDriver MPU6050 ويمكن لهذا الرمز اختبار الوظيفة الضرورية للرقاقة ببساطة.
/example يتضمن نموذج التعليمات البرمجية LibDriver MPU6050.
يتضمن /doc مستند LibDriver MPU6050 غير المتصل بالإنترنت.
/ ورقة البيانات تتضمن ورقة بيانات MPU6050.
/project يتضمن نموذج التعليمات البرمجية المشترك للوحة تطوير Linux وMCU. تستخدم كافة المشاريع برنامج Shell النصي لتصحيح أخطاء برنامج التشغيل ويمكن العثور على التعليمات التفصيلية في ملف README.md الخاص بكل مشروع.
يتضمن /misra نتائج مسح كود LibDriver MISRA.
مرجع / قالب مستقل لمنصة IIC وقم بإنهاء برنامج تشغيل النظام الأساسي IIC الخاص بك.
أضف الدليل /src، وبرنامج تشغيل الواجهة للنظام الأساسي الخاص بك، وبرامج التشغيل الخاصة بك إلى مشروعك، إذا كنت تريد استخدام نماذج برامج التشغيل الافتراضية، فأضف الدليل /example إلى مشروعك.
يمكنك الرجوع إلى الأمثلة الموجودة في الدليل /example لإكمال برنامج التشغيل الخاص بك. إذا كنت تريد استخدام أمثلة البرمجة الافتراضية، فإليك كيفية استخدامها.
#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 ;
المستندات عبر الإنترنت: https://www.libdriver.com/docs/mpu6050/index.html.
المستندات غير المتصلة بالإنترنت: /doc/html/index.html.
يرجى الرجوع إلى CONTRIBUTING.md.
حقوق الطبع والنشر (ج) 2015 - حتى الآن LibDriver جميع الحقوق محفوظة
رخصة معهد ماساتشوستس للتكنولوجيا (MIT)
ويُمنح الإذن مجانًا لأي شخص يحصل على نسخة
لهذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج")، للتعامل
في البرنامج دون قيود، بما في ذلك على سبيل المثال لا الحصر الحقوق
للاستخدام والنسخ والتعديل والدمج والنشر والتوزيع والترخيص من الباطن و/أو البيع
نسخ من البرنامج، والسماح للأشخاص الذين يملكون البرنامج
مفروشة للقيام بذلك، مع مراعاة الشروط التالية:
يجب أن يتم تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في الكل
نسخ أو أجزاء كبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون ضمان من أي نوع، صريح أو
ضمنيًا، بما في ذلك على سبيل المثال لا الحصر، ضمانات القابلية للتسويق،
الملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال يجب أن
المؤلفون أو أصحاب حقوق الطبع والنشر مسؤولون عن أي مطالبة أو أضرار أو غيرها
المسؤولية، سواء في دعوى العقد أو الضرر أو غير ذلك، الناشئة عن،
خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في
برمجة.
يرجى إرسال بريد إلكتروني إلى [email protected].