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;