在 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);
    }
}
相关推荐
嵌入式小站3 小时前
STM32 零基础可移植教程 04:按键输入,为什么按下去读到的是 0 或 1
chrome·stm32·嵌入式硬件
三佛科技-187366133973 小时前
BP8522D贴片SOP7,5V150mA高集成度无VCC电容降压型恒压芯片解析
单片机·嵌入式硬件
csg11073 小时前
MSP430F149驱动T8650北斗模块实现短报文通信实战
单片机·嵌入式硬件·物联网·自动化
hoiii1874 小时前
基于STM32的音频播放系统,实现SD卡读取音频文件PWM输出播放
stm32·嵌入式硬件·音视频
Deitymoon4 小时前
STM32——软件IIC显示字符
stm32·单片机·嵌入式硬件
百万老师4 小时前
自然语言编程时代,如何零基础学习掌握嵌入式编程
c语言·单片机·嵌入式硬件·学习·ai全流程闭环开发
efangfd5 小时前
TXS0104 和 TXB0104 的 IO 驱动电流对比
单片机·嵌入式硬件
gihigo19986 小时前
STM32F407 Modbus RTU主站例程
stm32·单片机·嵌入式硬件
程序员差不多先生6 小时前
HisparkStudio有哪些开发功能?
嵌入式硬件