在 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);
    }
}
相关推荐
清风66666610 小时前
基于单片机的锅炉压力与温度监测报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
ACP广源盛1392462567311 小时前
GSV2221 显示转换芯片@ACP#赋能 RTX Spark 端侧 AI 设备,构建多屏全模态视觉交互新生态
大数据·人工智能·嵌入式硬件·gpt·spark·电脑·音视频
Szime12 小时前
TJA1044T/1现货查询与汽车CAN通信应用采购注意事项
嵌入式硬件·汽车
rhythm-ring12 小时前
《汽车智能高边开关PROFET:电流检测与标定实战》
嵌入式硬件·汽车
点灯小铭15 小时前
基于单片机的鱼缸监测与远程管理系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Szime15 小时前
DS90UB924TRHSRQ1现货交期与车载视频SerDes项目采购说明
嵌入式硬件·汽车
清风66666615 小时前
基于单片机的罐体压力控制器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
嵌入式-老费15 小时前
esp32开发与应用(题外话之j-link调试)
嵌入式硬件
点灯小铭15 小时前
基于单片机的热量计测量系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
wengqidaifeng16 小时前
嵌入式小白第三站:UART、I2C、SPI、ADC 怎么学?从传感器读数到完整小项目
stm32·单片机·嵌入式硬件·51单片机