Cep telefonlarında ve 3 eksenli elektronik pusula kullanan diğer cihazlarda, manyetometreyi bu videolarda gösterildiği gibi kalibre etmek için ∞ / 8 / S şekilli bir hareket kullanılır .
Bu hareket neden yapılır, teori nedir ve herkes onu uygulamak için bazı örnek C kodu verebilir mi?
Daha fazla bilgi içeren başka bir benzer sorumdan geçmelisiniz.
Bu soru için bazı ek bilgiler: Platform, AVR Studio 5 kullanan 8 bitlik AtMega32'dir.
Şimdiye kadar denedim: Ortalamayı şekil veren Magnetometrenin vektör değerlerinin 2'sine bölmeyi denedim . Düşünme, ofsetlerin hesaplanmasında yardımcı olabilir. Şeklin iki özdeş bölümünün / kenarının dünyanın manyetik alanını nasıl iptal ettiğini ve ofset değerlerini verdiğini düşünüyorum. Yanlış olabilirim. Ama özellikle şekle dayalı kalibrasyon için şu anda buradayım. Kalibrasyonun bu şekilde çalıştığını düşünüyorum. Fikir, bunun bu şekilde işe yaradığını öğrenmek mi?
Ofsetleri hesaplayabileceğim kodu tamamlayın ve daha sonra sadece Ham manyetik 3B vektöründen çıkartın. Tamamen yanlış olabilirim ve nasıl çalıştığına dair bir fikrim yok. Video ve kürenin üzerine çizilen verilerden sonra, bir şekilde düşüncemi hızlandırdım ve bu düşünceyi denklem formunda kullandım. B)
Kod:
Read_accl();
Ve Read_magnato(1);
işlevleri sensör verileri okuyor. Umarım kod kendi kendini açıklar. Bilge ppl umut kesinlikle çok daha iyi şekillerde kullanıyor olacak. : \
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;
}
}
}
Bu ofsetleri aldıktan sonra bunları aşağıdaki gibi kullandım:
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 ;
...
}
Bahsettiğim gibi.