Pada ponsel dan perangkat lain yang menggunakan kompas elektronik 3-sumbu, gerakan berbentuk ∞ / 8 / S digunakan untuk mengkalibrasi magnetometer seperti yang ditunjukkan dalam video ini .
Mengapa gerakan ini dilakukan, apa teorinya, dan adakah yang bisa memberikan beberapa contoh kode C untuk mengimplementasikannya?
Anda harus melalui pertanyaan serupa saya yang lain yang berisi lebih banyak info.
Beberapa info tambahan untuk pertanyaan khusus ini: Platformnya adalah 8-bit AtMega32, menggunakan AVR Studio 5.
Sampai sekarang saya sudah mencoba: Saya mencoba membagi rata dengan 2 nilai vektor dari Magnetometer membuat bentuk. Berpikir mungkin membantu dalam menghitung offset. Saya pikir beberapa bagaimana dua bagian / sisi identik dari bentuk membatalkan medan magnet bumi dan memberikan nilai offset. Saya mungkin salah. Tetapi khususnya untuk kalibrasi berbasis bentuk, inilah saya saat ini. Saya pikir kalibrasi berhasil dengan cara ini. Idenya adalah untuk mengetahui apakah itu berhasil seperti ini?
Ok kode dimana saya dapat menghitung offset dan kemudian cukup kurangi dari vektor 3D magnetik mentah. Saya mungkin benar-benar salah dan tidak memiliki penjelasan bagaimana cara kerjanya. Melihat setelah video dan data diplot pada bola, entah bagaimana telah mempercepat pemikiran saya dan saya menggunakan pemikiran itu dalam bentuk persamaan. B)
Kode:
Fungsi Read_accl();
dan Read_magnato(1);
membaca data sensor. Saya harap kode ini cukup jelas. Berharap ppl bijaksana akan menggunakan ini dengan cara yang jauh lebih baik. : \
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;
}
}
}
Setelah mendapatkan offset ini, saya menggunakannya sebagai berikut:
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 ;
...
}
Seperti yang saya sebutkan.