PDA

View Full Version : خواندن اعضای یک استراکچر



soodi1100
پنج شنبه 21 آذر 1392, 12:21 عصر
سلام

ببخشید
من یه تابع استراکچر دارم به صورت زیر ، این تابع به صورت اتوماتیک آپدیت میشه و ورودی های تابع هم قبلا تایین و مقدار دهی شده است
فقط میخام ببینم که مقادیر Roll و Pitch و Yaw که توی این تابع تولید میشه رو چطوری میتونم هر کدوم رو توی یک متغیر جدا داشته باشم؟؟؟

منتظر پاسختون هستم ، بسیار تشکر و ممون

void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}

rahnema1
پنج شنبه 21 آذر 1392, 22:36 عصر
اینجوری


void IMU_Poll(float &outroll,float &outpitch,float &outyaw)
{/*...................*/
float roll,pitch,yaw;
outroll=roll;
/*...................*/
outpitch=pitch;
/*...................*/
outyaw=yaw;
}
int main()
{
float outroll, outpitch, outyaw;
IMU_Poll(outroll, outpitch, outyaw);
}

Ananas
پنج شنبه 21 آذر 1392, 22:55 عصر
سلام.
متوجه نشدم مشکلتون چیه؟
منظورتون اینه؟:


void IMU_Poll(float * p_Roll, float * p_Yaw, float * p_Pitch)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
*p_Pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
*p_Roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
*p_Yaw=yaw;
};

ali chegini
جمعه 22 آذر 1392, 00:27 صبح
سلام
شما از 9 dof razor imu شرکت sparkfun استفاده کردی ؟
آیا می تونی قطب نماش رو کالیبره کنی بدون استفاده از جایرو.
ممنون

soodi1100
یک شنبه 24 آذر 1392, 17:17 عصر
سلام

خیر
این سنسور MPU6050 هست که خیلی هم دقیقه و عالی
من خروجیش رو به صورت جدا دریافت کردم (خروجی سنسور جایرو و شتابسنج) به صورت جدا ولی این تابع IMU_Poll همونطور که مشخصه یکسری فیلترینگ انجام میده روی داده ها
اگر سوالی بود در خدمتم

soodi1100
جمعه 29 آذر 1392, 14:11 عصر
سلام دوستان

آقا این مشکل من هنوز مرتفع نشده
این برنامه کامل من هست
اون قسمت هایی دورشون خط قرمز کشیدم رو بلدم و هیچ مشکلی داخلشون نیست و خودم برنامه رو نوشتم و بقیه خطوط و برنامه هم هیچ مشکلی داخلش نیست
فقط اون فلشی که اول برنامه زدم ، اون کتابخانه ای هست که اون تابع استراکچر داخلش هست و من میخام مقادیر داخل اون استراکچر رو بخونم ، اون برنامه ای هم که لطف کردید و دادید ارور داد
الان من توی اون قسمتی که با سبز نشون دادم ، دارم مقدار MPU6050_ReadSensorData رو میخونم و روی LCD نشون میدم
میخام که اون مقادیر استراکچر رو هم به همین صورت توی برنامه داشته باشم و به صورت جدا Roll و Pitch و Yaw رو روی LCD نشون بدم


114179

rahnema1
جمعه 29 آذر 1392, 19:38 عصر
معلوم نشد چه طوریه این لینک رو ببینید یه نمونه کار با همین سنسور هست شاید مفید باشه http://ihanwu.com/thread-138-1-1.html

soodi1100
پنج شنبه 26 دی 1392, 14:05 عصر
سلام

ببخشید
آقای rahnema1 تشکر این دقیقا همون کتابخانه ای هست که من ازش استفاده میکنم ولی توی لینکی که گزاشتید ، اومده و مقدار MPU6050_ReadAllSensorData(); رو خونده در صورتی که من مقدار تابع void IMU_Poll(IMU_DATA *data) رو میخام
من هنوز نتونستم اعضای این استراکچر رو توی برنامم بخونم
این یه تابع استراکچر
من میخام اون data ها که آخر هر پاراکراف به عنوان roll و pitch و yaw تولید میشه رو توی Main برنامم به صورت جدا هر کدوم رو داشته باشم
این هم تابع استراکچرم که توی یه کتابخانه هست این تابع و اول برنامه کابخانه رو اضافه کردم و از بقیه توابع داخل کتابخانه تونستم استفاده کنم غیر از این تابع استراکچر
خیلی خیلی تشکر میکنم راهنماییم کنید


void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}

Ananas
پنج شنبه 26 دی 1392, 15:28 عصر
این تابعی که شما نوشتید ساختار MPU6050Data رو استاتیک تعریف کرده و اصلا تغییری هم نمیکنه! این تابعی که نوشتید اشتباهه! بهتره از بیرون تابع این ساختار رو تعریف کنید و مقدار بدید و با ازسال "اشاره گری به این ساختار" به تابع، اطلاعات yaw pitch roll رو داخل تابع از روش بسازید و اون ها رو هم داخل تابع استاتیک تعریف نکنید! بیرون تابع تعریف کنید و با ارسال اشاره گر برای تابع، مقادیر رو داخل متغیرها بنویسید.

soodi1100
پنج شنبه 26 دی 1392, 17:52 عصر
این مقدار MPU6050Data قبلا در کتابخانه تعریف شده و آپدیت میشه
من فقط میخام اون roll و pitch و yaw که آخر هر پاراگراف هست رو توی main برنامم به صورت جدا هر کدوم رو داشته باشم
خیلی تشکر میکنم راهنمایی کنید
سپاس

soodi1100
پنج شنبه 26 دی 1392, 23:20 عصر
سلام دوستان

خیلی به این تابع نیاز داریم
اصلا اگر نمیشه از روی این تابع مقادیر رو خوند راهنمایی کنید تا کلا تابع رو تغییر بدم
خیلی ممنون میشوم اساتید برنامه نویس یه راهنمایی بکنن که چطوری این 3 تا متغیر رو من داشته باشم
به خدا کلافه شدم با این تابع

rahnema1
پنج شنبه 26 دی 1392, 23:41 عصر
این را امتحان کنید ببینید جواب میده یا نه



void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;
MPU_Data=MPU6050_ReadAllSensorData();
pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}
int main()
{
IMU_DATA data;
IMU_Poll(IMU_DATA &data);
printf("pitch=%f,roll=%f,yaw=%f",data.pitch,data.roll,data.raw);
}

soodi1100
جمعه 27 دی 1392, 10:00 صبح
اینجوری


void IMU_Poll(float &outroll,float &outpitch,float &outyaw)
{/*...................*/
float roll,pitch,yaw;
outroll=roll;
/*...................*/
outpitch=pitch;
/*...................*/
outyaw=yaw;
}
int main()
{
float outroll, outpitch, outyaw;
IMU_Poll(outroll, outpitch, outyaw);
}


سلام
الان برنامه بالا رو میزارم ولی ارور های زیر رو میگیره :


Rebuild target 'Target 1'
assembling startup_LPC17xx.s...
compiling Program.c...
Program.c(67): error: #18: expected a ")"
void IMU_Poll(float &outroll,float &outpitch,float &outyaw)
Program.c(67): error: #247: function "IMU_Poll" has already been defined
void IMU_Poll(float &outroll,float &outpitch,float &outyaw)
Program.c(67): error: #141-D: unnamed prototyped parameters not allowed when body is present
void IMU_Poll(float &outroll,float &outpitch,float &outyaw)
Program.c(151): error: #167: argument of type "float" is incompatible with parameter of type "IMU_DATA *"
IMU_Poll(outroll, outpitch, outyaw);
Program.c(151): error: #140: too many arguments in function call
IMU_Poll(outroll, outpitch, outyaw);
Program.c: 0 warnings, 5 errors
compiling system_LPC17xx.c...
".\Test.axf" - 5 Error(s), 0 Warning(s).
Target not created

soodi1100
جمعه 27 دی 1392, 10:05 صبح
این را امتحان کنید ببینید جواب میده یا نه



void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;
MPU_Data=MPU6050_ReadAllSensorData();
pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}
int main()
{
IMU_DATA data;
IMU_Poll(IMU_DATA &data);
printf("pitch=%f,roll=%f,yaw=%f",data.pitch,data.roll,data.raw);
}

سلام

به برنامه بالا هم خطا های زیر رو میگیره
بیشتر به *data خطا گرفته :


Rebuild target 'Target 1'
assembling startup_LPC17xx.s...
compiling Program.c...
Program.c(67): error: #247: function "IMU_Poll" has already been defined
void IMU_Poll(IMU_DATA *data)
Program.c(168): error: #268: declaration may not appear after executable statement in block
IMU_DATA data;
Program.c(169): error: #254: type name is not allowed
IMU_Poll(IMU_DATA &data);
Program.c(169): error: #31: expression must have integral type
IMU_Poll(IMU_DATA &data);
Program.c: 0 warnings, 4 errors
compiling system_LPC17xx.c...
".\Test.axf" - 4 Error(s), 0 Warning(s).
Target not created

soodi1100
جمعه 27 دی 1392, 10:31 صبح
سلام.
متوجه نشدم مشکلتون چیه؟
منظورتون اینه؟:


void IMU_Poll(float * p_Roll, float * p_Yaw, float * p_Pitch)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
*p_Pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
*p_Roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
*p_Yaw=yaw;
};

سلام

آقا من این برنامه بالا رو گزاشتم قبل از main و تابع IMU_Poll رو از کتابخانه اصلی حذف کردم
الان دیگه ارور نمیده
بعدش داخل main برنامم نوشتم
float p_Roll,p_Yaw,p_Pitch;
و بعدش هم نوشتم
IMU_Poll(p_Roll, p_Pitch, p_Yaw);
درسته ؟؟؟

Ananas
جمعه 27 دی 1392, 13:02 عصر
سلام

آقا من این برنامه بالا رو گزاشتم قبل از main و تابع IMU_Poll رو از کتابخانه اصلی حذف کردم
الان دیگه ارور نمیده
بعدش داخل main برنامم نوشتم
float p_Roll,p_Yaw,p_Pitch;
و بعدش هم نوشتم
IMU_Poll(p_Roll, p_Pitch, p_Yaw);
درسته ؟؟؟
سلام.
نه عزیزم اشتباهه! اینطور باید استفاده کنید:
- تابعی که بنده نوشتم رو به همون شکل بگذارید باشه.
- در تابع main این سه متغیر رو تعریف کنید:
float Yaw, Pitch, Roll;
- بعد تابع رو به این شکل فراخوانی کنید:
IMU_Poll(&Roll, &Pitch, &Yaw);

Ananas
جمعه 27 دی 1392, 13:24 عصر
اگر بخواید با ساختار هم کار کنید به این شکل اول اون رو تعریف میکنید و تابع رو هم اینطور مینویسید:
#pragma pack(push, 1)
struct YAWPITCHROLL_DATA
{
float yaw, pitch, roll;
};
#pragma pack(pop)

void IMU_Poll(YAWPITCHROLL_DATA * p_YPR)
{
//...
p_YPR->yaw = ... ;
//...
p_YPR->pitch = ... ;
//...
p_YPR->roll = ... ;
};

بعد در تابع main می نویسید:

YAWPITCHROLL_DATA ypr;
IMU_Poll(&ypr);
cout << "Yaw = " << ypr.yaw << endl <<
"Pitch = " << ypr.pitch << endl <<
"Roll = " << ypr.roll << endl <<
"----------------------" << endl;

rahnema1
جمعه 27 دی 1392, 23:26 عصر
بالاخره درست شد؟

soodi1100
یک شنبه 29 دی 1392, 10:21 صبح
خیلی خیلی ممنون از همه ی دوستان به خصوص آقای Ananas (http://barnamenevis.org/member.php?233990-Ananas) و آقای rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) بسیار ممنون
بله تونستم از اون آرایه مقادیر رو بخونم
ولی فکر کنم یه جای کتابخانه ای که دارم اشکال داره ، چون به طور معمول الان همه ی خروجی های roll و pith و yaw صفر هستند ولی وقتی طبق گفته آقای rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) این خط MPU_Data=MPU6050_ReadAllSensorData(); رو به تابع اضافه میکنم ، خروجی ها یکسری اعداد عجیب و غریب میدن بیرون !!!

Ananas
یک شنبه 29 دی 1392, 14:04 عصر
متشکر.
این خط رو در تابع نوشتید:
static MPU6050Data MPU_Data;
ولی این متتغیر از این ساختار رو هیچ کجا مقدار ندادید! فقط از روش میخونید! خب کدوم بخش از برنامه، کدوم تابع مسئول پر کردن و بروزرسانیه این ساختاره؟! در حال حاضر در کد شما هیچ تابعی! پس باید یک تابع مثلا MPU6050_ReadAllSensorData رو فراخوانی کنید.

خروجی ها یکسری اعداد عجیب و غریب میدن بیرون !!!
شاید باید با ماتریس کار بشه، لطفا تعریف این ساختار رو بنویسید.

soodi1100
یک شنبه 29 دی 1392, 14:26 عصر
سلام

این کتابخانه و سورس کتابخانه ای که ازش استفاده میکنم :
که توی کد دومی که گزاشتم که مربوط به mpu6050.h هست من خودم قسمت زیر رو طبق تابع به اینصورت تغییر دادم :

typedef struct{
float p_Pitch;
float p_Yaw;
float p_Roll;
} IMU_DATA;
و قسمت زیر رو هم طبق تابع به اینصورت تغییر دادم :

void IMU_Poll(float * p_Roll, float * p_Yaw, float * p_Pitch);

ولی بقیه دست نخورده هست




/************************************************** ***********************//**
*
* @file mpu6050.c
* @brief Implementation of Cox based I2C Driver for Invensense MPU-6050
* @version 1.1
* @date 03/13/2013
* @author Amo Xu amo@amoxu.com
* @copyright Copyright (c) 2012, Amo Xu All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <ORGANIZATION> nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
************************************************** **************************/
#include "hard_com.c"
#include "mpu6050.h"
#include "hw_mpu6050.h"
#include <math.h>

#if CALIBRATE_AFTER_INIT
static long GYRO_X_SMPL_SUM;
static long GYRO_Y_SMPL_SUM;
static long GYRO_Z_SMPL_SUM;
#endif
/**
* @brief Write 1 Byte of data into to specified register of sensor
* @param rgAdd the register address of the sensor
* @param rgData the data which will be write to sensor
*/
void MPU6050_WriteData(unsigned char rgAdd, unsigned char rgData) {
MPU_Write(MPU_Addr,rgAdd,rgData, MPU_I2C);
}

#if CALIBRATE_AFTER_INIT
/**
* @brief Calibrate the sensor by collecting specified times data and get the
* average data.
*/
void MPU6050_Calibrate(void) {
int x = 0;
for (x = 0; x < CALIBRATE_SAMPLES; x++) {
GYRO_X_SMPL_SUM += MPU6050_ReadSensorData(GYRO_X);
GYRO_Y_SMPL_SUM += MPU6050_ReadSensorData(GYRO_Y);
GYRO_Z_SMPL_SUM += MPU6050_ReadSensorData(GYRO_Z);
}

GYRO_X_OFFSET = GYRO_X_SMPL_SUM / CALIBRATE_SAMPLES;
GYRO_Y_OFFSET = GYRO_Y_SMPL_SUM / CALIBRATE_SAMPLES;
GYRO_Z_OFFSET = GYRO_Z_SMPL_SUM / CALIBRATE_SAMPLES;
}
#endif

/**
* @brief Write the configured settings into sensor and let it start to work
*/
void MPU6050_Config_Register(void) {
MPU6050_WriteData(SMPLRT_DIV, MPU6050_SAMPLE_RATE_DIV);
MPU6050_WriteData(CONFIG, 0x07 & MPU6050_DLPF_CONFIG);
MPU6050_WriteData(GYRO_CONFIG, 0x18 & MPU6050_GYRO_FULL_SCALE);
MPU6050_WriteData(ACCEL_CONFIG, 0x18 & MPU6050_ACCEL_FULL_SCALE);
MPU6050_WriteData(PWR_MGMT_1, 0);
}

/**
* @brief Configure the I2C Bus
*/
void MPU6050_Config_Peripherals(void) {
I2C_Init(MPU_I2C_Clock_Rate,MPU_I2C);
}

/**
* @brief Initialize the MPU-6050 Device.
*
* @note MPU6050_Calibrate is switched by @ref CALIBRATE_AFTER_INIT Macro
*
*/
void MPU6050_Init(void) {
MPU6050_Config_Peripherals();
MPU6050_Config_Register();

#if CALIBRATE_AFTER_INIT
MPU6050_Calibrate();
#endif

}

/**
* @brief Read 2 Bytes Data from specified Register Address of sensor
* @param rgAdd is the address of register which need to be read
* @return 16bit signed data
*/
short MPU6050_ReadSensorData(unsigned char rgAdd) {
unsigned char ucBuffer[2];
MPU_Read(MPU_Addr,rgAdd,2 ,ucBuffer,MPU_I2C );
return (ucBuffer[0] << 8) | ucBuffer[1];
}

/**
* @brief Read All Sensor Data and put them into a strutted data.
* @return @ref MPU6050Data
*/
MPU6050Data MPU6050_ReadAllSensorData(void) {
MPU6050Data gyroData;

gyroData.Gyro_X = MPU6050_ReadSensorData(GYRO_X) - GYRO_X_OFFSET;
gyroData.Gyro_Y = MPU6050_ReadSensorData(GYRO_Y) - GYRO_Y_OFFSET;
gyroData.Gyro_Z = MPU6050_ReadSensorData(GYRO_Z) - GYRO_Z_OFFSET;
gyroData.Accel_X = MPU6050_ReadSensorData(ACCEL_X);
gyroData.Accel_Y = MPU6050_ReadSensorData(ACCEL_Y);
gyroData.Accel_Z = MPU6050_ReadSensorData(ACCEL_Z);
gyroData.Temp = MPU6050_ReadSensorData(TEMP);

return gyroData;
}
/*
void IMU_Poll(IMU_DATA *data)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
data->pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
data->roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
data->yaw=yaw;
}
*/
void IMU_Poll(float * p_Roll, float * p_Yaw, float * p_Pitch)
{
static float pitch_n , pitch,pitch_w;
static float yaw_n , yaw,yaw_w;
static float roll_n , roll,roll_w;
static MPU6050Data MPU_Data;
MPU_Data=MPU6050_ReadAllSensorData();

pitch_n=(acos((float)MPU_Data.Accel_Z/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
pitch_w=( ((float)(MPU_Data.Gyro_Y)) / 131.07 ); // angular speed calculation
pitch=0.98*(pitch+pitch_w*0.01)+0.02*pitch_n ; // complementry filter
*p_Pitch=pitch;

roll_n=(acos((float)MPU_Data.Accel_Y/sqrt(MPU_Data.Accel_Y*MPU_Data.Accel_Y+MPU_Data.Ac cel_Z*MPU_Data.Accel_Z))-1.58925 )*57.297469;// Accelerator degree
roll_w=( ((float)(MPU_Data.Gyro_X)) / 131.07 ); // angular speed calculation
roll=0.98*(pitch+roll_w*0.01)+0.02*roll_n ; // complementry filter
*p_Roll=roll;

yaw_n=(acos((float)MPU_Data.Accel_X/sqrt(MPU_Data.Accel_X*MPU_Data.Accel_X+MPU_Data.Ac cel_Y*MPU_Data.Accel_Y))-1.58925 )*57.297469;// Accelerator degree
yaw_w=( ((float)(MPU_Data.Gyro_Z)) / 131.07 ); // angular speed calculation
yaw=0.98*(yaw+yaw_w*0.01)+0.02*yaw_n ; // complementry filter
*p_Yaw=yaw;
};



/************************************************** ***********************//**
*
* @file mpu6050.h
* @brief Header File of Cox based I2C Driver for Invensense MPU-6050
* @version 1.1
* @date 03/13/2013
* @author Amo Xu amo@amoxu.com
* @copyright Copyright (c) 2012, Amo Xu All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <ORGANIZATION> nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
************************************************** **************************/

#ifndef __MPU_6050_H
#define __MPU_6050_H

/**
* If building with a C++ compiler, make all of the definitions in this header
* have a C binding.
*/
typedef struct{
float p_Pitch;
float p_Yaw;
float p_Roll;
} IMU_DATA;
typedef struct {
int Gyro_X;
int Gyro_Y;
int Gyro_Z;
int Accel_X;
int Accel_Y;
int Accel_Z;
int Temp;
} MPU6050Data;

//! @addtogroup USER_CONF User Configurations
//! @brief Sensor parameters(scale, sample rate) configuration
//! @{

/**
* Here indicate whether need to automatic calibration after initialize.
* please set to 0 if you don't need automatic calibration
*/
#define CALIBRATE_AFTER_INIT 1

#if CALIBRATE_AFTER_INIT

/**
* The quantity of samples which will be collected to be used for calibration after init
*/
#define CALIBRATE_SAMPLES 100
#endif


/**
* @brief Configure the Sample Rate Divider
* @param value from 0x00 to 0xff
*
* This register specifies the divider from the gyroscope output rate used to
* generate the Sample Rate for the MPU-60X0.
*
* The sensor register output, FIFO output, DMP sampling and Motion detection are
* all based on the Sample Rate.
*
* The Sample Rate is generated by dividing the gyroscope output rate by SMPLRT_DIV:
* > Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)
*
* where Gyroscope Output Rate = 8kHz when the DLPF is disabled (DLPF_CFG = 0 or 7), and 1kHz
* when the DLPF is enabled (see Register 26).
*
* @note The accelerometer output rate is 1kHz. This means that for a Sample Rate greater
* than 1kHz, the same accelerometer sample may be output to the FIFO, DMP, and sensor
* registers more than once.
*/
#define MPU6050_SAMPLE_RATE_DIV 0x00

/**
* @brief Configure the full scale range of accelerometer outputs
*
* Select the full scale range of accelerometer outputs according to the following table.
* AFS_SEL | Full Scale Range
* :--: | :--:
* @b 0 | +-2 g
* @b 1 | +-4 g
* @b 2 | +-8 g
* @b 3 | +-16 g
*
* returned result is a 16bit signed integer, so if you want to get the gravity (g).
* the result need to be divided by 65536/full scale range.\n
* for example:
* > MPU6050_ACCEL_FULL_SCALE set to 2 (+-8 g)\n
* > 65536/16.0 = 4096.0 \n
* > the read Accel_X result is 3863\n
* > which means the angle velocity is 3863/4096.0 ≈ 0.943 g
*/
#define MPU6050_ACCEL_FULL_SCALE 0

/**
* @brief Configure the full scale range of the gyroscope outputs
*
* Select the full scale range of gyroscope outputs according to the following table.
* FS_SEL | Full Scale Range
* :--: | :--:
* @b 0 | +-250 degree/s
* @b 1 | +-500 degree/s
* @b 2 | +-1000 degree/s
* @b 3 | +-2000 degree/s
*
* returned result is a 16bit signed integer, so if you want to get the actual gyroscope angle velocity(degree/s).
* the result need to be divided by 65536/full scale range.\n
* for example:
* > MPU6050_GYRO_FULL_SCALE set to 1 (+-500 degree/s)\n
* > 65536/1000 ≈ 66\n
* > the read Gyro_X result is 3863\n
* > which means the angle velocity is 3863/66 ≈ 59 degree/s
*/
#define MPU6050_GYRO_FULL_SCALE 1

/**
* @brief The Digital Low Pass Filter configuration
*
* For configuration value selection, please refer to below table:
* DLPF_CFG | Accel Bandwidth\n(Hz) | Accel Delay\n(ms) | Gyro Bandwidth\n(Hz) | Gyro Delay\n(ms) | Fs(kHz)
* :--: | :--: | :--: | :--: | :--: | :--:
* @b 0 | 260 | 0 | 256 | 0.98 | 8
* @b 1 | 184 | 2.0 | 188 | 1.9 | 1
* @b 2 | 94 | 3.0 | 98 | 2.8 | 1
* @b 3 | 44 | 4.9 | 42 | 4.8 | 1
* @b 4 | 21 | 8.5 | 20 | 8.3 | 1
* @b 5 | 10 | 13.8 | 10 | 13.4 | 1
* @b 6 | 5 | 19.0 | 5 | 18.6 | 1
* @b 7 | RESERVED | RESERVED | RESERVED | RESERVED | 8
*
*/
#define MPU6050_DLPF_CONFIG 3


/**
* @brief Slave Address of the device
* The Slave Address of MPU-60X0 is 0b110100X which is 7 bits long,
* THe LSB bit of the 7 bit address is determined by the logic level on pin AD0.
* this allows 2 MPU-60X0 to be connected to the same I2C bus.
*
* Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
* :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
* 0 | 1 | 1 | 0 | 1 | 0 | 0 | AD0 level |
*/
#define MPU6050_ADDRESS 0x68
//! @}

/**
* @addtogroup CALI Calibration offset
* @brief Data of calibration offset
* @{
*/

//! @brief Calibrated X axis offset of Gyroscope
int GYRO_X_OFFSET;

//! @brief Calibrated Y axis offset of Gyroscope
int GYRO_Y_OFFSET;

//! @brief Calibrated Z axis offset of Gyroscope
int GYRO_Z_OFFSET;
/**
* @}
*/

/**
* @addtogroup APIs
* @brief the functions and MACROs which will be used in application
* @{
*/

//! @brief The register address of X axis of Accelerometer
#define ACCEL_X ACCEL_XOUT_H

//! @brief The register address of Y axis of Accelerometer
#define ACCEL_Y ACCEL_YOUT_H

//! @brief The register address of Z axis of Accelerometer
#define ACCEL_Z ACCEL_ZOUT_H

//! @brief The register address of Temperature
#define TEMP TEMP_OUT_H

//! @brief The register address of X axis of Gyroscope
#define GYRO_X GYRO_XOUT_H

//! @brief The register address of Y axis of Gyroscope
#define GYRO_Y GYRO_YOUT_H

//! @brief The register address of Z axis of Gyroscope
#define GYRO_Z GYRO_ZOUT_H

void MPU6050_Init(void);
short MPU6050_ReadSensorData(unsigned char regAddress);
MPU6050Data MPU6050_ReadAllSensorData(void);
void IMU_Poll(float * p_Roll, float * p_Yaw, float * p_Pitch);
/**
* @}
*/


#endif
//! end of __MPU_6050_H

Ananas
دوشنبه 30 دی 1392, 00:21 صبح
ه توی کد دومی که گزاشتم که مربوط به mpu6050.h هست من خودم قسمت زیر رو طبق تابع به اینصورت تغییر دادم :
اضافه کردید یا خودش بوده و شما تغییر دادید؟
بعد هم اینکه من از حرف p_ اول اسمهای Yaw Pitch Roll استفاده کردم منظورم pointer بوده! که در ورودی های تابع به شکل اشاره گر تعریف شدن. ولی خود struct که متغیرهاش float هستن دیگه لازم نیست که از p_ اول اسم استفاده بشه. (هر چند که اسمگذاری در نتیجه ی نهایی تاثیری نداره).
و نکته ی دیگه اینکه اسامی ای که تو ورودی های تابع تعریف شدن موضعی هستن و داخل تابع استفاده میشن و نیازی نیست که متغیر های struct با اونها همنام باشن. بلکه بهتره که اسمشون فرق کنه که احیانا اشتباه نشه!!
من struct رو به این صورت تغییر دادم:
typedef struct
{
float Pitch;
float Yaw;
float Roll;
} IMU_DATA;

و تابع رو هم به این شکل:
void IMU_Poll(IMU_DATA * pData)
{
static float pitch_n, pitch, pitch_w;
static float yaw_n, yaw, yaw_w;
static float roll_n, roll, roll_w;
static MPU6050Data MPU_Data;
MPU_Data = MPU6050_ReadAllSensorData();

pitch_n = (acos((float)MPU_Data.Accel_Z / sqrt(MPU_Data.Accel_X * MPU_Data.Accel_X + MPU_Data.Ac cel_Z * MPU_Data.Accel_Z)) - 1.58925) * 57.297469; // Accelerator degree
pitch_w = (((float)(MPU_Data.Gyro_Y)) / 131.07); // angular speed calculation
pitch = 0.98 * (pitch + pitch_w * 0.01) + 0.02 * pitch_n; // complementry filter
pData->Pitch = pitch;

roll_n = (acos((float)MPU_Data.Accel_Y / sqrt(MPU_Data.Accel_Y * MPU_Data.Accel_Y + MPU_Data.Ac cel_Z * MPU_Data.Accel_Z)) - 1.58925) * 57.297469; // Accelerator degree
roll_w = (((float)(MPU_Data.Gyro_X)) / 131.07); // angular speed calculation
roll = 0.98 * (pitch + roll_w * 0.01) + 0.02 * roll_n; // complementry filter
pData->Roll = roll;

yaw_n = (acos((float)MPU_Data.Accel_X / sqrt(MPU_Data.Accel_X * MPU_Data.Accel_X + MPU_Data.Ac cel_Y * MPU_Data.Accel_Y)) - 1.58925) * 57.297469; // Accelerator degree
yaw_w = (((float)(MPU_Data.Gyro_Z)) / 131.07); // angular speed calculation
yaw = 0.98 * (yaw + yaw_w * 0.01) + 0.02 * yaw_n; // complementry filter
pData->Yaw = yaw;
};
حالا امتحان کنید.
MPU6050_ReadAllSensorData رو هم خوبه که اینجا گذاشتید ولی میتونید بیرون از تابع هم باشه و فقط از طریق اشاره گر به ساختار، اطلاعات رو به تابع بدید. مثلا:

void IMU_Poll(IMU_DATA * pData, const MPU6050Data * pMPU_Data)
{
static float pitch_n, pitch, pitch_w;
static float yaw_n, yaw, yaw_w;
static float roll_n, roll, roll_w;
// static MPU6050Data MPU_Data;
// MPU_Data = MPU6050_ReadAllSensorData();

pitch_n = (acos((float)pMPU_Data->Accel_Z / sqrt(pMPU_Data->Accel_X * pMPU_Data->Accel_X + pMPU_Data->Accel_Z * pMPU_Data->Accel_Z)) - 1.58925) * 57.297469;// Accelerator degree
pitch_w = (((float)(pMPU_Data->Gyro_Y)) / 131.07); // angular speed calculation
pitch = 0.98 * (pitch + pitch_w * 0.01) + 0.02 * pitch_n;// complementry filter
pData->Pitch = pitch;

roll_n = (acos((float)pMPU_Data->Accel_Y / sqrt(pMPU_Data->Accel_Y * pMPU_Data->Accel_Y + pMPU_Data->Accel_Z * pMPU_Data->Accel_Z)) - 1.58925) * 57.297469; // Accelerator degree
roll_w = (((float)(pMPU_Data->Gyro_X)) / 131.07); // angular speed calculation
roll = 0.98 * (pitch + roll_w * 0.01) + 0.02 * roll_n; // complementry filter
pData->Roll = roll;

yaw_n = (acos((float)pMPU_Data->Accel_X / sqrt(pMPU_Data->Accel_X * pMPU_Data->Accel_X + pMPU_Data->Accel_Y * pMPU_Data->Accel_Y)) - 1.58925) * 57.297469; // Accelerator degree
yaw_w = (((float)(pMPU_Data->Gyro_Z)) / 131.07); // angular speed calculation
yaw = 0.98 * (yaw + yaw_w * 0.01) + 0.02 * yaw_n; // complementry filter
pData->Yaw = yaw;
};

soodi1100
دوشنبه 30 دی 1392, 17:43 عصر
سلام

خیلی ممنون
بله کاملا درسته ، متوجه شدم ، و این مقادیر قبلا بود که من به اینصورت که گفتم تغییرشون دادم ولی الان طبق فرموده شما درستشون کردم
تابع رو هم به صورت زیر تغییر دادم
حالا توی برنامه چطوری تابع رو بخونم و فراخوانی کنم ؟ چون الان دیگه اشاره گر نداره !!!


void IMU_Poll(IMU_DATA * pData)
{
static float pitch_n, pitch, pitch_w;
static float yaw_n, yaw, yaw_w;
static float roll_n, roll, roll_w;
static MPU6050Data MPU_Data;
MPU_Data = MPU6050_ReadAllSensorData();

pitch_n = (acos((float)MPU_Data.Accel_Z / sqrt(MPU_Data.Accel_X * MPU_Data.Accel_X + MPU_Data.Ac cel_Z * MPU_Data.Accel_Z)) - 1.58925) * 57.297469; // Accelerator degree
pitch_w = (((float)(MPU_Data.Gyro_Y)) / 131.07); // angular speed calculation
pitch = 0.98 * (pitch + pitch_w * 0.01) + 0.02 * pitch_n; // complementry filter
pData->Pitch = pitch;

roll_n = (acos((float)MPU_Data.Accel_Y / sqrt(MPU_Data.Accel_Y * MPU_Data.Accel_Y + MPU_Data.Ac cel_Z * MPU_Data.Accel_Z)) - 1.58925) * 57.297469; // Accelerator degree
roll_w = (((float)(MPU_Data.Gyro_X)) / 131.07); // angular speed calculation
roll = 0.98 * (pitch + roll_w * 0.01) + 0.02 * roll_n; // complementry filter
pData->Roll = roll;

yaw_n = (acos((float)MPU_Data.Accel_X / sqrt(MPU_Data.Accel_X * MPU_Data.Accel_X + MPU_Data.Ac cel_Y * MPU_Data.Accel_Y)) - 1.58925) * 57.297469; // Accelerator degree
yaw_w = (((float)(MPU_Data.Gyro_Z)) / 131.07); // angular speed calculation
yaw = 0.98 * (yaw + yaw_w * 0.01) + 0.02 * yaw_n; // complementry filter
pData->Yaw = yaw;
};

rahnema1
دوشنبه 30 دی 1392, 18:41 عصر
دوست عزیز ببینید شما انتظار چه خروجی از این تابع دارید و چه چیزی ازش دریافت می کنید؟ تابع هایی که گفته شد تغییر بدهید همشون یک کار رو انجام می دهند اما نام متغیر ها تغییر کرده یا مثلا اشاره گر به یه چیز دیگه تبدیل شده در ضمن اگه بشه فایل program.c را هم ضمیمه کنید

Ananas
دوشنبه 30 دی 1392, 22:47 عصر
این نمونه دقیقا چیزیه که من پیشنهاد میکنم:

void IMU_Poll(IMU_DATA * pData, const MPU6050Data * pMPU_Data)
{
static float pitch_n, pitch, pitch_w;
static float yaw_n, yaw, yaw_w;
static float roll_n, roll, roll_w;
// static MPU6050Data MPU_Data;
// MPU_Data = MPU6050_ReadAllSensorData();

pitch_n = (acos((float)pMPU_Data->Accel_Z / sqrt(pMPU_Data->Accel_X * pMPU_Data->Accel_X + pMPU_Data->Accel_Z * pMPU_Data->Accel_Z)) - 1.58925) * 57.297469;// Accelerator degree
pitch_w = (((float)(pMPU_Data->Gyro_Y)) / 131.07); // angular speed calculation
pitch = 0.98 * (pitch + pitch_w * 0.01) + 0.02 * pitch_n;// complementry filter
pData->Pitch = pitch;

roll_n = (acos((float)pMPU_Data->Accel_Y / sqrt(pMPU_Data->Accel_Y * pMPU_Data->Accel_Y + pMPU_Data->Accel_Z * pMPU_Data->Accel_Z)) - 1.58925) * 57.297469; // Accelerator degree
roll_w = (((float)(pMPU_Data->Gyro_X)) / 131.07); // angular speed calculation
roll = 0.98 * (pitch + roll_w * 0.01) + 0.02 * roll_n; // complementry filter
pData->Roll = roll;

yaw_n = (acos((float)pMPU_Data->Accel_X / sqrt(pMPU_Data->Accel_X * pMPU_Data->Accel_X + pMPU_Data->Accel_Y * pMPU_Data->Accel_Y)) - 1.58925) * 57.297469; // Accelerator degree
yaw_w = (((float)(pMPU_Data->Gyro_Z)) / 131.07); // angular speed calculation
yaw = 0.98 * (yaw + yaw_w * 0.01) + 0.02 * yaw_n; // complementry filter
pData->Yaw = yaw;
};

int _tmain(int argc, _TCHAR* argv[])
{
IMU_DATA imu_Data;
MPU6050Data mpu_Data;
//...
// initialize..
//...
while (true)
{
mpu_Data = MPU6050_ReadAllSensorData(); // update struct
IMU_Poll(&imu_Data, &mpu_Data);
cout << imu_Data.Yaw << endl;
cout << imu_Data.Pitch << endl;
cout << imu_Data.Roll << endl;
};
return 0;
}

حالا هر کاره اضافه ی دیگه که لازمه انجام بده رو شما اضافه کنید.
من دو متغیر از دو ساختار رو تعریف کردم و متغیر mpu_Data رو با تابع MPU6050_ReadAllSensorData مقدار میدم و بعد به عنوان ورودی میفرستم به تابع IMU_Roll و متغیر imu_Data رو هم به عنوان خروجی به تابع میفرستم.
تابع اطلاعات رو از mpu_Data میخونه و imu_Data رو برامون پر میکنه و بعد ما با cout اون رو چاپ میکنیم.