3軸電子コンパスを使用する携帯電話およびその他のデバイスでは、∞/ 8 / S形の動きを使用して、これらのビデオに示すように磁力計を較正します。
なぜこの動きが実行されるのか、理論は何なのか、それを実装するためのCコードの例を挙げることができますか?
あなたは、より多くの情報を含む私の別の同様の質問を通過しなければなりません。
この特定の質問に関する追加情報:プラットフォームは、AVR Studio 5を使用した8ビットAtMega32です。
今まで試してみました:形状を作る磁力計のベクトル値の2で平均を除算してみました。考えることはオフセットの計算に役立つかもしれません。形状の2つの同一の部分/側面が、地球の磁場を相殺し、オフセット値を与える方法を考えています。私は間違っているかもしれません。しかし、特に形状ベースのキャリブレーションでは、これが私が現在いる場所です。キャリブレーションはこのように機能すると思います。アイデアは、それがこのようにうまくいくかどうかを調べることです?
オフセットを計算し、後でそれらをRaw磁気3Dベクトルから単純に差し引くことができるコードを確認します。私は完全に間違っている可能性があり、それがどのように機能するのか説明がありません。ビデオと球体上にプロットされたデータを見て、どういうわけか私の思考が加速し、方程式の形でその思考を使用しました。B)
コード:
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 ;
...
}
私が示したように。