1.模式简介

1.1 正常模式

磁传感器持续测量并存入数据输出寄存器中。

1.2 单次测量模式

只run一次,运行完毕进入休眠

1.3 连续模式

始终处于运行模式,没有休眠时间,可获得最大的数据输出率。自检功能只要continuous下启用,并在数据更新后进入休眠模式

1.4 休眠模式

无磁力计测量,且所有寄存器的读写操作都允许

2.应用例程

2.1 初始化

主要是控制CTRL1、CTRL2两个状态寄存器

CTRL1寄存器配置

  • MODE[0:1]:

    • 00: 待机模式 (Standby Mode) — 芯片进入低功耗状态,不进行测量。

    • 01: 正常模式 (Normal Mode) — 芯片进行正常的磁场测量。

    • 10: 连续模式 (Continuous Mode) — 芯片连续进行磁场测量,适合对实时数据要求较高的应用。

    • 11: 单次模式 (Single Measurement Mode) — 芯片只进行一次测量,适用于需要间歇性获取数据的应用。

    通常使用 00(待机模式)和 01(正常模式)来进行配置。

  • ODR[2:3]:

    • 00: 10Hz 输出数据速率 (Output Data Rate)

    • 01: 50Hz 输出数据速率

    • 10: 100Hz 输出数据速率

    • 11: 200Hz 输出数据速率

  • OSR1[4:5]:

    • 过采样率配置1 (Oversampling Rate 1),影响测量精度与速度:

      • 00: 采样率×1

      • 01: 采样率×2

      • 10: 采样率×4

      • 11: 采样率×8

  • OSR2[6:7]:

    • 过采样率配置2 (Oversampling Rate 2),进一步影响精度:

      • 00: 采样率×1

      • 01: 采样率×2

      • 10: 采样率×4

      • 11: 采样率×8

    过采样率越高,数据的精度和稳定性增强,但数据读取速度可能会降低。

CTRL2寄存器配置

  • SET/RESET MODE[0:1]:用来配置软复位

  • RNG[2:3]:

    • 00: ±2高斯 (±2G)

    • 01: ±8高斯 (±8G)---4000

    • 10: ±12高斯 (±12G)

    • 11: ±30高斯 (±30G)

    量程配置决定了传感器对磁场的灵敏度和测量范围。更高的量程会降低灵敏度,但能够测量更强的磁场。

2.2 数据读取

小端模式存放,低字节在前,高字节在后。

#define QMC5883P_REG_DATA_X_LSB     0x01    /* X轴数据低字节寄存器 */
#define QMC5883P_REG_DATA_X_MSB     0x02    /* X轴数据高字节寄存器 */
#define QMC5883P_REG_DATA_Y_LSB     0x03    /* Y轴数据低字节寄存器 */
#define QMC5883P_REG_DATA_Y_MSB     0x04    /* Y轴数据高字节寄存器 */
#define QMC5883P_REG_DATA_Z_LSB     0x05    /* Z轴数据低字节寄存器 */
#define QMC5883P_REG_DATA_Z_MSB     0x06    /* Z轴数据高字节寄存器 */

static void QMC5883P_Read_RawData(short *raw_data)
{
    uint8_t buffer[6];
    /* QMC5883L: 连续读取6个字节,从 0x00 (X_LSB) 开始 */
    BSP_Hard_I2C_Mem_Write(QMC5883P_ADDR, QMC5883P_REG_DATA_X_LSB, 0, NULL);
    BSP_Hard_I2C_Mem_Read(QMC5883P_ADDR, 6, buffer);
    /* QMC5883L 数据格式: LSB first (小端) */
    raw_data[0] = (short)(buffer[1] << 8 | buffer[0]); /* X轴: MSB[1], LSB[0] */
    raw_data[1] = (short)(buffer[3] << 8 | buffer[2]); /* Y轴: MSB[3], LSB[2] */
    raw_data[2] = (short)(buffer[5] << 8 | buffer[4]); /* Z轴: MSB[5], LSB[4] */
}

2.3 转化高斯单位

/* 灵敏度定义 (LSB/Gauss) */
#define QMC5883P_SENSITIVITY_8G   4000.0f

    /* 读取原始数据 */
    QMC5883P_Read_RawData(raw_data);
    
    /* 转换为高斯单位 */
    x_gauss = (float)raw_data[0] / QMC5883P_SENSITIVITY_8G;
    y_gauss = (float)raw_data[1] / QMC5883P_SENSITIVITY_8G;

2.4 硬磁校准

建议一定使用,要不然会出现大范围旋转,角度变化幅度极小的情况

static int16_t x_min=32767, x_max=-32768;
static int16_t y_min=32767, y_max=-32768;
static int16_t x_off=0, y_off=0;

    // 1) 在线更新极值(先跑一阵或做一个“校准模式”)
    if (QMC5883P_RawData.x < x_min) x_min = QMC5883P_RawData.x;
    if (QMC5883P_RawData.x > x_max) x_max = QMC5883P_RawData.x;
    if (QMC5883P_RawData.y < y_min) y_min = QMC5883P_RawData.y;
    if (QMC5883P_RawData.y > y_max) y_max = QMC5883P_RawData.y;

    // 2) 计算粗偏置
    x_off = (int16_t)((x_max + x_min) / 2);
    y_off = (int16_t)((y_max + y_min) / 2);

    // 3) 去偏再算角
    int16_t x_corr = QMC5883P_RawData.x - x_off;
    int16_t y_corr = QMC5883P_RawData.y - y_off;