Trong điện thoại di động và các thiết bị khác sử dụng la bàn điện tử 3 trục, chuyển động hình / 8 / S được sử dụng để hiệu chỉnh từ kế như trong các video này .
Tại sao phong trào này được thực hiện, lý thuyết là gì và bất cứ ai cũng có thể đưa ra một số ví dụ mã C để thực hiện nó?
Bạn phải đi qua một câu hỏi tương tự khác của tôi có chứa nhiều thông tin hơn.
Một số thông tin bổ sung cho câu hỏi cụ thể này: Nền tảng là 8 bit AtMega32, sử dụng AVR Studio 5.
Cho đến bây giờ tôi đã thử: Tôi đã thử chia trung bình cho 2 giá trị vectơ của Từ kế tạo thành hình dạng. Suy nghĩ có thể giúp tính toán bù đắp. Tôi nghĩ một số cách hai phần / mặt giống hệt nhau của hình dạng đang hủy bỏ từ trường của trái đất và đưa ra các giá trị bù. Tôi có thể sai. Nhưng đặc biệt đối với hiệu chuẩn dựa trên hình dạng, đây là nơi tôi đang ở. Tôi nghĩ rằng hiệu chuẩn làm việc theo cách này. Ý tưởng là để tìm ra rằng làm việc theo cách này?
Ok mã mà tôi có thể tính toán các độ lệch và sau đó chỉ cần trừ chúng khỏi vectơ 3D từ tính Nguyên. Tôi có thể hoàn toàn sai và không có lời giải thích làm thế nào nó hoạt động. Nhìn thấy sau video và dữ liệu được vẽ trên quả cầu, bằng cách nào đó đã tăng tốc suy nghĩ của tôi và tôi đã sử dụng suy nghĩ đó dưới dạng phương trình. B)
Mã số:
Các chức năng Read_accl();
và Read_magnato(1);
đang đọc dữ liệu cảm biến. Tôi hy vọng mã là tự giải thích. Hy vọng ppl khôn ngoan chắc chắn sẽ sử dụng điều này theo những cách tốt hơn nhiều. : \
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;
}
}
}
Sau khi nhận được những bù đắp này, tôi đã sử dụng chúng như sau:
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 ;
...
}
Như tôi đã đề cập.