ในโทรศัพท์มือถือและอุปกรณ์อื่น ๆ ที่ใช้ 3 แกนเข็มทิศอิเล็กทรอนิกส์∞ / 8 / S เคลื่อนไหวรูปถูกนำมาใช้ในการสอบเทียบ magnetometer ดังแสดงในวิดีโอเหล่านี้
เหตุใดการเคลื่อนไหวนี้จึงเกิดขึ้นทฤษฎีคืออะไรและทุกคนสามารถให้ตัวอย่างรหัส C เพื่อนำมาใช้
คุณต้องผ่านคำถามอื่นที่คล้ายกันซึ่งมีข้อมูลเพิ่มเติม
ข้อมูลเพิ่มเติมสำหรับคำถามนี้: แพลตฟอร์ม AtMega32 8 บิตโดยใช้ AVR Studio 5
จนถึงตอนนี้ฉันได้ลองแล้ว: ฉันพยายามหารค่าเฉลี่ยด้วย 2ของค่าเวกเตอร์ของ Magnetometer เพื่อสร้างรูปร่าง การคิดอาจช่วยในการคำนวณออฟเซ็ต ฉันคิดว่าชิ้นส่วน / ด้านที่เหมือนกันสองชิ้นของรูปร่างกำลังยกเลิกสนามแม่เหล็กของโลกและให้ค่าออฟเซ็ต ฉันอาจจะผิด. แต่โดยเฉพาะอย่างยิ่งสำหรับการปรับเทียบตามรูปร่างนี่คือที่ฉันอยู่ในขณะนี้ ฉันคิดว่าการสอบเทียบใช้วิธีนี้ได้ แนวคิดคือการค้นหาว่าวิธีนี้ใช้ได้ผลหรือไม่
ตกลงรหัสที่ฉันสามารถคำนวณออฟเซ็ตและต่อมาก็แค่ลบพวกมันออกจากเวกเตอร์ Raw Magnetic 3D ฉันอาจจะผิดทั้งหมดและไม่มีคำอธิบายวิธีการทำงาน หลังจากดูวิดีโอและข้อมูลที่ถูกวางลงบนทรงกลมก็ทำให้ความคิดของฉันเร่งขึ้นและฉันก็ใช้ความคิดนั้นในรูปของสมการ B)
รหัส:
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 ;
...
}
อย่างที่ฉันพูดไป