3 축 전자 나침반을 사용하는 휴대폰 및 기타 장치에서는 ∞ / 8 / S 모양의 움직임 이이 비디오에 표시된대로 자력계를 교정하는 데 사용됩니다 .
이 동작이 수행되는 이유는 무엇이며 이론은 무엇이며이를 구현하기 위해 C 코드 예제를 제공 할 수 있습니까?
더 많은 정보가 포함 된 비슷한 질문 을 거쳐야합니다 .
이 특정 질문에 대한 추가 정보 : 플랫폼은 AVR Studio 5를 사용하는 8 비트 AtMega32입니다.
지금까지 시도했습니다 : 모양을 만드는 자력계의 벡터 값 중 2 개로 평균을 나눕니다 . 사고는 오프셋 계산에 도움이 될 수 있습니다. 모양의 동일한 두 부분 /면이 어떻게 지구 자기장을 상쇄하고 오프셋 값을 제공하는지 생각합니다. 제가 틀렸을 수 있습니다. 그러나 특히 형상 기반 보정의 경우 현재 위치입니다. 교정이 이런 식으로 작동한다고 생각합니다. 아이디어는 그것이 이런 식으로 작동하는지 알아내는 것입니다.
오프셋을 계산하고 나중에 Raw magnetic 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 ;
...
}
내가 말했듯이.