大小

我们一直在研究磁场的方向,但它的真实大小是多少?magnetic_field函数报告的数量是无单位的。 我们如何将这些值转换为Gauss?

文档将回答这个问题。

第2.1节传感器特性-第10页-LSM303DLHC数据表

该页中的表显示了根据GN bits的值具有不同值的磁增益设置。默认情况下,这些GN bits设置为001。 这意味着X轴和Y轴的磁增益为1100 LSB / Gauss,Z轴的磁增量为980 LSB / Gauss。LSB代表最低有效位, 1100 LSB / Gauss数表示读数1100等于1 Gauss,读数2200等于2 Gauss,依此类推。

因此,我们需要做的是将传感器输出的X、Y和Z值除以相应的增值。然后,我们将得到磁场的X、Y和Z分量,单位为Gauss。

通过一些额外的数学运算,我们可以从X、Y和Z分量中检索磁场的大小:

#![allow(unused)]
fn main() {
let magnitude = (x * x + y * y + z * z).sqrt();
}

将所有这些放在一个程序中:

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

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

#[entry]
fn main() -> ! {
    const XY_GAIN: f32 = 1100.; // LSB / G
    const Z_GAIN: f32 = 980.; // LSB / G

    let (_leds, mut lsm303dlhc, mut delay, mut itm) = aux15::init();

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

        let x = f32::from(x) / XY_GAIN;
        let y = f32::from(y) / XY_GAIN;
        let z = f32::from(z) / Z_GAIN;

        let mag = (x * x + y * y + z * z).sqrt();

        iprintln!(&mut itm.stim[0], "{} mG", mag * 1_000.);

        delay.delay_ms(500_u16);
    }
}

该程序将以毫高斯 (mG)为单位报告磁场的大小(强度)。地球磁场的大小在250 mG650 mG的范围内(大小取决于你的地理位置),所以 你应该看到一个在这个范围内或接近这个范围的值 -- 我看到的大约是210 mG。

一些问题:

不移动开发板,你会看到什么值?你总是看到同样的值吗?

如果你旋转板,幅度会改变吗?它应该改变吗?