校准

如果我们旋转磁强计板,地球磁场相对于磁强计的方向应该会改变,但其大小不应该改变!然而,磁强计显示,磁场的大小随着板的旋转而改变。

为什么会这样?结果磁力计需要校准才能返回正确的答案。

校准涉及相当多的数学(矩阵),因此我们在这里不做介绍,但如果您感兴趣,本应用说明将介绍该过程。相反,我们将在本节中做的是想象我们的境况。

让我们试试这个实验:让我们记录磁强计的读数,同时我们慢慢地向不同的方向旋转磁强计板。 我们将使用iprintln宏 将读数格式化为制表符分隔值(TSV)。

#![deny(unsafe_code)]
#![no_main]
#![no_std]

#[allow(unused_imports)]
use aux15::{entry, iprint, iprintln, prelude::*, I16x3};

#[entry]
fn main() -> ! {
    let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init();

    loop {
        let I16x3 { x, y, z } = lsm303dlhc.mag().unwrap();

        iprintln!(&mut itm.stim[0], "{}\t{}\t{}", x, y, z);

        delay.delay_ms(100_u8);
    }
}

您应该在控制台中获得如下输出:

$ # itmdump console
-76     213     -54
-76     213     -54
-76     213     -54
-76     213     -54
-73     213     -55

您可以使用以下方式将其传输到文件:

$ # Careful! Exit any running other `itmdump` instance that may be running
$ itmdump -F -f itm.txt > emf.txt

在记录数据的同时,沿多个不同方向旋转电路板几秒钟。

然后将该TSV文件导入电子表格程序(或使用下面显示的Python脚本),并将前两列绘制为散点图。

#!/usr/bin/python

import csv
import math
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import sys

# apply plot style
sns.set()

x = []
y = []

with open(sys.argv[1], 'r') as f:
    rows = csv.reader(f, delimiter='\t')

    for row in rows:
        # discard rows that are missing data
        if len(row) != 3 or not row[0] or not row[1]:
            continue

        x.append(int(row[0]))
        y.append(int(row[1]))

r = math.ceil(max(max(np.abs(x)), max(np.abs(y))) / 100) * 100

plt.plot(x, y, '.')
plt.xlim(-r, r)
plt.ylim(-r, r)
plt.gca().set_aspect(1)
plt.tight_layout()

plt.savefig('emf.svg')
plt.close

如果你在一个平坦的水平表面上旋转电路板,磁场的Z分量应该保持相对恒定,这个图应该是以原点为中心的圆周(而不是椭圆)。 如果你以随机的方向旋转棋盘,这就是上面的图,那么你应该得到一个由以原点为中心的一堆点组成的圆。与圆形的偏差表明磁力计需要校准。

Take home message: 不要只相信传感器的读数。验证它是否输出了可感知的值。如果不是,则进行校准。