3-अक्ष इलेक्ट्रॉनिक कम्पास का उपयोग करते हुए मोबाइल फोन और अन्य उपकरणों में, एक 8/8 / एस आकार का आंदोलन इन वीडियो में दिखाए अनुसार मैग्नेटोमीटर को कैलिब्रेट करने के लिए उपयोग किया जाता है ।
यह आंदोलन क्यों किया गया है, सिद्धांत क्या है, और क्या कोई इसे लागू करने के लिए कुछ उदाहरण सी कोड दे सकता है?
आपको मेरे अन्य समान प्रश्न से गुजरना होगा जिसमें अधिक जानकारी होगी।
इस विशेष प्रश्न के लिए कुछ अतिरिक्त जानकारी: AVR स्टूडियो 5 का उपयोग कर, प्लेटफॉर्म 8-बिट AtMega32 है।
अब तक मैंने कोशिश की है: मैंने मैग्नेटोमीटर के 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 ;
...
}
जैसा कि मैंने उल्लेख किया।