这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STEVAL-STWINKT1B】:结合STMcubeMX读取磁力计iis2m

共2条 1/1 1 跳转至

【STEVAL-STWINKT1B】:结合STMcubeMX读取磁力计iis2mdc

高工
2026-03-30 15:00:02     打赏

一:IIS2mdc基础知识

  IIS2MDC是一款高精度、超低功耗的三轴数字磁:传感器。

  IIS2MDC具有高达+50高斯的磁场动态范围0

  IIS2MDC包含一个支持标准、快速模式、快速模式增强和高速(100kHz、400kHz、1MHz和3.4MHz)以及SPI串行标准接口的I12C总线接口。

  该设备可配置为生成中断信号以用于磁场检测。

  IIS2MDC提供塑料扁平网格阵列封装(LGA),并保证在-40°C至+85°C的宽温度范围内工作。

二:原理图:

06-1IIS2MDC 原理图.png

    IIS2MDC 通过标准的 I²C 总线与主控(MCU)通信。在配置前,需要确保硬件连接正确:

    引脚连接:将传感器的 SDA 和 SCL 引脚分别连接到主控的对应 I²C 引脚,并必须通过上拉电阻(如 4.7kΩ)连接到电源,以保证总线空闲时为高电平 。CS 引脚需接高电平,以选择 I²C 模式 。

    从设备地址:IIS2MDC 的 7 位 I²C 设备地址是 0x1E 。写操作为 0x3C (0x1E << 1),读操作为 0x3D (0x1E << 1 | 1) 。

三:软件代码:

1.硬件初始化与接口选择

    IIS2MDC 支持 I2C 和 3线SPI 两种数字接口,通过 CS引脚 的电平进行选择:

    CS引脚为高电平:选择 I2C 通信。I2C 设备地址通常是 0x1E(7位地址)。

    CS引脚为低电平:选择 SPI 通信。

2.传感器配置

    在读取数据前,需要通过配置寄存器来设定传感器的工作方式。关键配置如下:

    设置工作模式:通过 CFG_REG_A 寄存器的 MD[1:0] 位进行配置。

   00:连续模式,传感器持续测量并更新数据。

  01:单次模式,触发一次测量后自动进入空闲模式。

  11:空闲模式(上电后默认状态)。

    设置输出数据速率:在连续模式下,通过 CFG_REG_A 寄存器的 ODR[1:0] 位,可选择10 Hz 至 150 Hz 的输出速率。

    设置量程:IIS2MDC 的固定满量程为 ±50高斯。

3. 数据读取流程    检查数据就绪状态

    有三种方式可以判断新数据是否准备好:

    轮询状态寄存器:读取 STATUS_REG 寄存器,检查 Zyxda 位。该位为 '1' 时,表示三轴新数据均已就绪。

    使用DRDY引脚:将 CFG_REG_C 寄存器中的 DRDY_on_PIN 位置为 '1',可以将数据就绪信号直接输出到 INT/DRDY 硬件引脚,通过外部中断或GPIO监听来高效读取。

读取原始数据

    当数据就绪后,主控通过I2C或SPI从 0x68 寄存器地址开始,连续读取 6个字节 的数据。这6个字节分别对应X、Y、Z轴的输出寄存器,每个轴的原始数据为 16位有符号整数(2个字节,低字节在前)。示例代码逻辑如下:

// 通过I2C读取
uint8_t raw_data[6];
i2c_read(DEVICE_ADDR, 0x68, raw_data, 6); // 从0x68开始读取6个字节

// 将两个字节组合成一个int16_t数(小端模式)
int16_t raw_x = (int16_t)((raw_data[1] << 8) | raw_data[0]);
int16_t raw_y = (int16_t)((raw_data[3] << 8) | raw_data[2]);
int16_t raw_z = (int16_t)((raw_data[5] << 8) | raw_data[4]);

数据转换

    将原始数据乘以灵敏度,即可得到单位为毫高斯的实际磁场强度值。灵敏度通常在数据手册中给出,例如 0.0015 高斯/LSB 或 1.5 毫高斯/LSB。转换公式如下:

float sensitivity = 1.5f; // 灵敏度,单位: 毫高斯/LSB
float mag_x = raw_x * sensitivity;
float mag_y = raw_y * sensitivity;
float mag_z = raw_z * sensitivity;
    硬件IIC初始化函数

// IIS2MDC 数据结构
typedef struct {
    int16_t x;
    int16_t y;
    int16_t z;
} IIS2MDC_MagData_t;

// 传感器初始化函数
HAL_StatusTypeDef IIS2MDC_Init(void) {
    uint8_t data;
    
    // 1. 检查设备ID(可选,WHO_AM_I寄存器值为0x40)
    // 注:IIS2MDC没有标准的WHO_AM_I寄存器,可通过读取CFG_REG_A默认值0x60验证
    
    // 2. 配置CFG_REG_A: 连续模式(00),输出速率10Hz(00)
    //    寄存器值: MD[1:0]=00, ODR[1:0]=00, 其他位默认0
    data = 0x00;
    if (HAL_I2C_Mem_Write(&hi2c1, IIS2MDC_ADDR_WRITE, IIS2MDC_CFG_REG_A,
                          I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY) != HAL_OK) {
        return HAL_ERROR;
    }
    
    // 3. 配置CFG_REG_C: 使能BDU位(bit4=1),防止读取时数据被更新
    //    寄存器值: 0x10
    data = 0x10;
    if (HAL_I2C_Mem_Write(&hi2c1, IIS2MDC_ADDR_WRITE, IIS2MDC_CFG_REG_C,
                          I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY) != HAL_OK) {
        return HAL_ERROR;
    }
    
    // 4. 等待传感器稳定
    HAL_Delay(50);
    
    return HAL_OK;
}

基础读取、写入寄存器函数

// 检查数据是否就绪(读取STATUS_REG的Zyxda位,bit3)
uint8_t IIS2MDC_IsDataReady(void) {
    uint8_t status;
    if (IIS2MDC_ReadReg(IIS2MDC_STATUS_REG, &status) != HAL_OK) {
        return 0;
    }
    return (status & 0x08) ? 1 : 0;  // Zyxda位为1表示新数据就绪
}

// 读取磁力计数据(6字节连续读取)[citation:1]
HAL_StatusTypeDef IIS2MDC_ReadMagData(IIS2MDC_MagData_t *data) {
    uint8_t raw_data[6];
    
    // 从0x68开始连续读取6个字节
    if (HAL_I2C_Mem_Read(&hi2c1, IIS2MDC_ADDR_READ, IIS2MDC_OUTX_L_REG,
                         I2C_MEMADD_SIZE_8BIT, raw_data, 6, HAL_MAX_DELAY) != HAL_OK) {
        return HAL_ERROR;
    }
    
    // 组合16位有符号整数(小端:低字节在前)
    data->x = (int16_t)((raw_data[1] << 8) | raw_data[0]);
    data->y = (int16_t)((raw_data[3] << 8) | raw_data[2]);
    data->z = (int16_t)((raw_data[5] << 8) | raw_data[4]);
    
    return HAL_OK;
}

// 读取温度数据(2字节)[citation:1]
HAL_StatusTypeDef IIS2MDC_ReadTemperature(float *temperature) {
    uint8_t temp_data[2];
    int16_t raw_temp;
    
    // 从0x6E开始读取2个字节(温度必须单独读取,不能与磁力计一起读)[citation:1]
    if (HAL_I2C_Mem_Read(&hi2c1, IIS2MDC_ADDR_READ, IIS2MDC_OUT_TEMP_L_REG,
                         I2C_MEMADD_SIZE_8BIT, temp_data, 2, HAL_MAX_DELAY) != HAL_OK) {
        return HAL_ERROR;
    }
    
    // 组合16位有符号整数(小端)
    raw_temp = (int16_t)((temp_data[1] << 8) | temp_data[0]);
    
    // 转换为摄氏度:温度(°C) = raw_temp / 256 + 25
    *temperature = (raw_temp / 256.0f) + 25.0f;
    
    return HAL_OK;
}
四:串口接收数据如下所示:

06-2IIS2MDC 串口接收数据.png

使用注意事项:

    启动时间:传感器上电后,需要等待约 20毫秒 的启动时间来加载修整参数,之后才能进行配置和读取。

    单次模式触发:在单次模式下,每次读取完成后,传感器会自动进入空闲模式。如需再次读取,需重新配置 MD[1:0] 位为 01 来触发下一次采样。

    磁场动态范围:在轴向对齐的情况下,动态范围为±50高斯;在交叉轴方向存在杂散场时,范围会降低到±25高斯。




关键词: STEVAL-STWINKT1B          磁力计         

专家
2026-03-31 08:21:34     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]