在使用 3 轴电子罗盘的手机和其他设备中,使用 ∞/8/S 形运动来校准磁力计,如这些视频中所示。
为什么要执行此动作,理论是什么,任何人都可以提供一些示例 C 代码来实现它吗?
您必须仔细阅读我的另一个包含更多信息的类似问题。
这个特定问题的一些附加信息:平台是 8 位 AtMega32,使用 AVR Studio 5。
直到现在我已经尝试过:我尝试将平均值除以 2的磁力计矢量值来制作形状。思考可能有助于计算偏移量。我认为形状的两个相同部分/侧面如何抵消地球磁场并给出偏移值。我可能错了。但特别是对于基于形状的校准,这是我目前所处的位置。我认为校准是这样进行的。我们的想法是找出这样做是否可行?
好的,我可以计算偏移量的代码,然后简单地从原始磁性 3D 矢量中减去这些偏移量。我可能完全错了,没有解释它是如何工作的。看了视频和绘制在球体上的数据后,不知何故加速了我的思考,我把这个想法用在了方程的形式上。二)
代码:
和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 ;
...
}
如我所说。