У мобільних телефонах і інших пристроях з використанням 3-осьовий електронний компас, ∞ / 8 / S образного руху і використовується для калібрування магнитометра , як показано на цих відео .
Чому цей рух виконується, що таке теорія, і чи може хто-небудь навести приклад C коду для його здійснення?
Ви повинні пройти ще одне моє подібне запитання, що містить більше інформації.
Деякі додаткові відомості щодо цього конкретного питання: Платформа є 8-бітною AtMega32, використовуючи AVR Studio 5.
До цього часу я намагався: я спробував розділити середнє значення на 2 векторних значення магнітометра, роблячи форму. Мислення може допомогти у розрахунку компенсацій. Я думаю, що деякі, як дві однакові частини / сторони форми скасовують магнітне поле Землі та видають значення зміщення. Я можу помилятися. Але особливо для калібрування, заснованого на формі, це зараз я. Я думаю, що калібрування працює таким чином. Ідея полягає в тому, щоб з'ясувати, чи працює це таким чином?
Гаразд код, за допомогою якого я можу обчислити компенсації, а пізніше просто відняти ті з сирого магнітного 3D-вектора. Я, можливо, абсолютно помиляюся і не маю пояснення, як це працює. Побачення після відео та даних, нанесених на сферу, якимось чином прискорило мою думку, і я використав цю думку у формі рівняння. Б)
Код:
Функції Read_accl();
та Read_magnato(1);
функції зчитування даних датчика. Я сподіваюся, що код пояснює себе. Сподіваючись, що мудрий ppl напевно буде використовувати це набагато краще. : \
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 ;
...
}
Як я вже згадував.