3-অক্ষের বৈদ্যুতিন কম্পাস ব্যবহার করে মোবাইল ফোন এবং অন্যান্য ডিভাইসে, এই ভিডিওগুলিতে প্রদর্শিত ম্যাগনেটমিটারটি ক্রমাঙ্কিত করতে একটি 8/8 / S আকারের আন্দোলন ব্যবহৃত হয় ।
এই আন্দোলনটি কেন সম্পাদিত হয়, তত্ত্বটি কী এবং এর বাস্তবায়নের জন্য কেও উদাহরণ দিতে পারে সি কোড?
আপনাকে অবশ্যই আমার আরও একটি অনুরূপ প্রশ্নটি আরও তথ্য সমেত যেতে হবে ।
এই নির্দিষ্ট প্রশ্নের জন্য কিছু অতিরিক্ত তথ্য: প্ল্যাটফর্মটি এভিআর স্টুডিও 5 ব্যবহার করে 8-বিট এটিমেগ 32 হয় is
এখনও অবধি আমি চেষ্টা করেছি: আমি ম্যাগনেটমিটারের আকারটি তৈরির ভেক্টর মানের 2 টি দিয়ে গড়কে ভাগ করার চেষ্টা করেছি । চিন্তাভাবনা অফসেট গণনা করতে সহায়তা করতে পারে। আমি কিছু মনে করি যে আকারের দুটি অভিন্ন অংশ / দিকগুলি পৃথিবীর চৌম্বকীয় ক্ষেত্রটি বাতিল করে এবং অফসেট মানগুলি প্রদান করে। আমার ভুলও হতে পারে. তবে বিশেষত আকৃতি ভিত্তিক ক্রমাঙ্কনের জন্য আমি এখানে বর্তমানে আছি। আমি মনে করি ক্রমাঙ্কনটি এভাবে কাজ করে। ধারণাটি কী তা এইভাবে কাজ করে?
ঠিক আছে, যার মাধ্যমে আমি অফসেটগুলি গণনা করতে পারি এবং পরে কেবল কাঁচা চৌম্বকীয় 3 ডি ভেক্টর থেকে বিয়োগ করে। আমি সম্পূর্ণ ভুল হতে পারি এবং এটি কীভাবে কাজ করে তার কোনও ব্যাখ্যা নেই। ভিডিওটি এবং গোলকের উপর ডেটা প্লট করার পরে দেখে, কোনওভাবে আমার চিন্তাকে ত্বরান্বিত করেছে এবং আমি সেই চিন্তাটি সমীকরণের আকারে ব্যবহার করেছি। বি)
কোড:
Read_accl();
এবং Read_magnato(1);
ফাংশন সেন্সর ডেটা পড়া হয়। আমি আশা করি কোডটি স্ব-বর্ণনামূলক। প্রত্যাশিত বুদ্ধিমান পিপিএল অবশ্যই আরও ভাল উপায়ে এটি ব্যবহার করবে। : \
void InfinityShapedCallibration()
{
unsigned char ProcessStarted = 0;
unsigned long cnt = 0;
while (1)
{
Read_accl();
// Keep reading Acc data
// Detect Horizontal position
// Detect Upside down position
// Then detect the Horizontal position again.
// Meanwhile an infinity shaped movement will be created.
// Sum up all the data, divide by the count, divide by 2 .
// !We've offsets.
if (ProcessStarted!=3)
{
//
//USART_Transmit_String("\r");
//rprintfFloat(4, g_structAccelerometerData.accx_RAW);
//USART_Transmit_String(",");
//rprintfFloat(4, g_structAccelerometerData.accy_RAW);
//USART_Transmit_String(",");
//rprintfFloat(4, g_structAccelerometerData.accz_RAW);
}
if (
abs( g_structAccelerometerData.accx_RAW) < 100
&& abs(g_structAccelerometerData.accy_RAW) < 100
&& g_structAccelerometerData.accz_RAW < -350
&& ProcessStarted != 2 && ProcessStarted != 3 && ProcessStarted != 1 )
{
ProcessStarted = 1;
}
if (ProcessStarted==1)
{
Read_magnato(1);
structMagnetometerOffsetDataToEEPROM.Off_X += g_structMegnetometerData.magx_RAW;
structMagnetometerOffsetDataToEEPROM.Off_Y += g_structMegnetometerData.magy_RAW;
structMagnetometerOffsetDataToEEPROM.Off_Z += g_structMegnetometerData.magz_RAW;
cnt++;
}
if ( g_structAccelerometerData.accz_RAW > 350
&& ProcessStarted==1)
{
ProcessStarted = 2;
}
if ( g_structAccelerometerData.accz_RAW < -350
&& ProcessStarted == 2 )
{
ProcessStarted=3;
structMagnetometerOffsetDataToEEPROM.Off_X /= cnt;
structMagnetometerOffsetDataToEEPROM.Off_X /= 2;
structMagnetometerOffsetDataToEEPROM.Off_Y /= cnt;
structMagnetometerOffsetDataToEEPROM.Off_Y /= 2;
structMagnetometerOffsetDataToEEPROM.Off_Z /= cnt;
structMagnetometerOffsetDataToEEPROM.Off_Z /= 2;
UpdateOFFSETDATAinEEPROM();
break;
}
}
}
এই অফসেটগুলি পাওয়ার পরে আমি সেগুলি নীচে ব্যবহার করেছি:
void main()
{
...
Read_magnato(1);
g_structMegnetometerData.magx_RAW -= structMagnetometerOffsetDataToEEPROM.Off_X ;
g_structMegnetometerData.magy_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Y ;
g_structMegnetometerData.magz_RAW -= structMagnetometerOffsetDataToEEPROM.Off_Z ;
...
}
যেমন আমি উল্লেখ করলাম.