在 STM32F1上读取 BMX055 三轴加速度

在 STM32F1(如 STM32F103C8T6)上读取 BMX055 三轴加速度

BMX055 是 Bosch 的 9 轴传感器(Acc + Gyro + Mag),这里我们只读 加速度计(ACC),代码可直接用 HAL 库 + CubeMX 使用。


一、BMX055 加速度计基础

1、 接口与地址

BMX055 加速度计支持 I2C / SPI ,常用 I2C

器件 I2C 地址(7bit)
ACC 0x18(SDO1 = GND)
ACC 0x19(SDO1 = VDDIO)

默认用 0x18


2、 常用寄存器(ACC)

寄存器 地址 说明
CHIP_ID 0x00 应返回 0xFA
ACC_X_LSB 0x02 X 轴低字节
ACC_X_MSB 0x03 X 轴高字节
ACC_Y_LSB 0x04 Y
ACC_Y_MSB 0x05
ACC_Z_LSB 0x06 Z
ACC_Z_MSB 0x07
PMU_RANGE 0x0F ±2g / ±4g / ±8g / ±16g
PMU_BW 0x10 带宽
PMU_LPW 0x11 电源模式

3、 量程与灵敏度

量程 LSB/g
±2g 16384
±4g 8192
±8g 4096
±16g 2048

二、硬件连接(STM32F103)

BMX055 STM32F103
VDD 3.3V
GND GND
SDA PB7(I2C1_SDA)
SCL PB6(I2C1_SCL)
SDO_ACC GND(地址 0x18)
CSB 3.3V(I2C 模式)

注意

  • 不要用 5V
  • SDA/SCL 建议加 4.7k 上拉电阻(很多模块已内置)

三、CubeMX 配置

启用 I2C1

  • Mode:I2C
  • Speed:100kHz(Standard Mode)

启用 SWD

时钟:72 MHz


四、BMX055 驱动代码(HAL 库)

1、宏定义(bmx055.h

c 复制代码
#ifndef __BMX055_H
#define __BMX055_H

#include "stm32f1xx_hal.h"

#define BMX055_ACC_ADDR  0x18 << 1   // 7bit → 8bit

#define ACC_CHIP_ID_REG  0x00
#define ACC_X_LSB_REG    0x02
#define ACC_X_MSB_REG    0x03
#define ACC_Y_LSB_REG    0x04
#define ACC_Y_MSB_REG    0x05
#define ACC_Z_LSB_REG    0x06
#define ACC_Z_MSB_REG    0x07

#define ACC_RANGE_REG    0x0F
#define ACC_BW_REG       0x10
#define ACC_PMU_LPW_REG  0x11

typedef struct {
    float ax;
    float ay;
    float az;
} AccelData_t;

uint8_t BMX055_ACC_Init(I2C_HandleTypeDef *hi2c);
void BMX055_ReadAccel(I2C_HandleTypeDef *hi2c, AccelData_t *acc);

#endif

2、I2C 读写封装

c 复制代码
static uint8_t BMX055_ReadReg(I2C_HandleTypeDef *hi2c, uint8_t reg)
{
    uint8_t data;
    HAL_I2C_Mem_Read(hi2c, BMX055_ACC_ADDR, reg,
                     I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
    return data;
}

static void BMX055_WriteReg(I2C_HandleTypeDef *hi2c, uint8_t reg, uint8_t val)
{
    HAL_I2C_Mem_Write(hi2c, BMX055_ACC_ADDR, reg,
                      I2C_MEMADD_SIZE_8BIT, &val, 1, 100);
}

3、加速度计初始化

c 复制代码
uint8_t BMX055_ACC_Init(I2C_HandleTypeDef *hi2c)
{
    uint8_t id = BMX055_ReadReg(hi2c, ACC_CHIP_ID_REG);
    if (id != 0xFA) return 0;

    // ±4g
    BMX055_WriteReg(hi2c, ACC_RANGE_REG, 0x05);

    // 125Hz BW
    BMX055_WriteReg(hi2c, ACC_BW_REG, 0x0C);

    // Normal mode
    BMX055_WriteReg(hi2c, ACC_PMU_LPW_REG, 0x00);

    return 1;
}

4、读取三轴加速度(单位:g)

c 复制代码
void BMX055_ReadAccel(I2C_HandleTypeDef *hi2c, AccelData_t *acc)
{
    uint8_t buf[6];

    HAL_I2C_Mem_Read(hi2c, BMX055_ACC_ADDR,
                     ACC_X_LSB_REG, I2C_MEMADD_SIZE_8BIT,
                     buf, 6, 100);

    int16_t raw_x = ((int16_t)((buf[1] << 8) | buf[0])) >> 4;
    int16_t raw_y = ((int16_t)((buf[3] << 8) | buf[2])) >> 4;
    int16_t raw_z = ((int16_t)((buf[5] << 8) | buf[4])) >> 4;

    acc->ax = raw_x / 8192.0f; // ±4g
    acc->ay = raw_y / 8192.0f;
    acc->az = raw_z / 8192.0f;
}

参考代码 STM32F1读取BMX055三轴加速度 www.youwenfan.com/contentcsu/70188.html

五、主函数调用示例

c 复制代码
AccelData_t acc;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_I2C1_Init();

    if (!BMX055_ACC_Init(&hi2c1))
        Error_Handler();

    while (1)
    {
        BMX055_ReadAccel(&hi2c1, &acc);

        printf("AX:%.3f g  AY:%.3f g  AZ:%.3f g\r\n",
               acc.ax, acc.ay, acc.az);

        HAL_Delay(100);
    }
}
相关推荐
FreakStudio7 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘12 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u1521096484912 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150012 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼12 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
牛根生同志12 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
wohoo_wangzi12 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
goldenrolan12 天前
学习型红外控制系统稳定性挂测工装专项总结
软件测试·python·stm32·嵌入式·红外
✎ ﹏梦醒͜ღ҉繁华落℘12 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展12 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件