嘉兴市网站建设_网站建设公司_加载速度优化_seo优化
2025/12/19 16:22:52 网站建设 项目流程

一、硬件连接配置

1.1 I2C接口连接(推荐)

STM32F103C8T6        BMP280
--------------------------
PB6 (SCL)  <----> SCL
PB7 (SDA)  <----> SDA
3.3V       <----> VCC
GND        <----> GND

1.2 SPI接口连接

STM32F103C8T6        BMP280
--------------------------
PA5 (SCK)  <----> SCK
PA7 (MOSI) <----> MOSI
PA6 (MISO) <----> MISO
PA4 (CS)   <----> CS
3.3V       <----> VCC
GND        <----> GND

二、I2C驱动实现(HAL库)

2.1 初始化配置

// I2C配置(CubeMX生成)
void MX_I2C1_Init(void)
{hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 400000;  // 400kHzhi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;HAL_I2C_Init(&hi2c1);
}

2.2 传感器操作函数

#define BMP280_ADDR 0x76  // 地址根据ADDR引脚配置// 读取寄存器
uint8_t BMP280_ReadReg(uint8_t reg) {uint8_t val;HAL_I2C_Mem_Read(&hi2c1, BMP280_ADDR<<1, reg, I2C_MEMADD_SIZE_8BIT, &val, 1, 100);return val;
}// 写入寄存器
void BMP280_WriteReg(uint8_t reg, uint8_t val) {HAL_I2C_Mem_Write(&hi2c1, BMP280_ADDR<<1, reg, I2C_MEMADD_SIZE_8BIT, &val, 1, 100);
}// 读取校准数据
void BMP280_ReadCalibration(uint16_t *dig_T1, int16_t *dig_T2, int16_t *dig_T3,uint16_t *dig_P1, int16_t *dig_P2, int16_t *dig_P3) {*dig_T1 = (BMP280_ReadReg(0x88) << 8) | BMP280_ReadReg(0x89);*dig_T2 = (int16_t)((BMP280_ReadReg(0x8A) << 8) | BMP280_ReadReg(0x8B));*dig_T3 = (int16_t)((BMP280_ReadReg(0x8C) << 8) | BMP280_ReadReg(0x8D));*dig_P1 = (BMP280_ReadReg(0x8E) << 8) | BMP280_ReadReg(0x8F);*dig_P2 = (int16_t)((BMP280_ReadReg(0x90) << 8) | BMP280_ReadReg(0x91));*dig_P3 = (int16_t)((BMP280_ReadReg(0x92) << 8) | BMP280_ReadReg(0x93));
}

三、SPI驱动实现

3.1 硬件初始化

// SPI配置
void SPI2_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// SCK/MOSI配置GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// MISO配置GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStruct);// CS配置GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStruct);// 初始状态GPIO_SetBits(GPIOA, GPIO_Pin_4);  // CS高电平
}

3.2 SPI通信函数

// SPI读写一个字节
uint8_t SPI_Transfer(uint8_t data) {for(uint8_t i=0; i<8; i++) {if(data & 0x80) GPIO_SetBits(GPIOA, GPIO_Pin_7);else GPIO_ResetBits(GPIOA, GPIO_Pin_7);data <<= 1;GPIO_SetBits(GPIOA, GPIO_Pin_5);Delay_us(1);GPIO_ResetBits(GPIOA, GPIO_Pin_5);if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) data |= 0x01;}return data;
}// 读取寄存器
uint8_t BMP280_SPI_ReadReg(uint8_t reg) {GPIO_ResetBits(GPIOA, GPIO_Pin_4);  // CS拉低SPI_Transfer(reg | 0x80);           // 设置读位uint8_t val = SPI_Transfer(0x00);GPIO_SetBits(GPIOA, GPIO_Pin_4);    // CS拉高return val;
}// 写入寄存器
void BMP280_SPI_WriteReg(uint8_t reg, uint8_t val) {GPIO_ResetBits(GPIOA, GPIO_Pin_4);  // CS拉低SPI_Transfer(reg);SPI_Transfer(val);GPIO_SetBits(GPIOA, GPIO_Pin_4);    // CS拉高
}

四、传感器驱动核心

4.1 数据结构定义

typedef struct {uint16_t dig_T1;int16_t  dig_T2;int16_t  dig_T3;uint16_t dig_P1;int16_t  dig_P2;int16_t  dig_P3;int32_t  t_fine;
} BMP280_Calib;

4.2 补偿算法

// 温度补偿
float BMP280_Compensate_T(int32_t adc_T) {int32_t var1, var2;var1 = (t_fine / 2) - 64000;var2 = var1 * var1 * dig_T2 / 32768;var2 += var1 * dig_T1 * 2;var2 /= 4;var1 = (dig_T1 / 32768) * (var1 + 32768);var1 *= 2;return (var1 + var2) / 256;
}// 气压补偿
float BMP280_Compensate_P(int32_t adc_P) {int64_t var1 = (int64_t)t_fine - 128000;int64_t var2 = var1 * var1 * (int64_t)dig_P6;var2 += (var1 * (int64_t)dig_P5) * 2;var2 = (var2 / 4) + ((int64_t)dig_P4 * 65536);var1 = ((int64_t)dig_P3 * var1 * var1) / 524288;var1 += (dig_P2 * var1) / 32768;var1 = (1 + var1 / 32768) * dig_P1;return (1048576 - adc_P) * 6250 / var1;
}

五、完整数据采集流程

void BMP280_ReadData(float *pressure, float *temperature) {uint8_t data[6] = {0};// 读取原始数据BMP280_ReadRegs(0xF7, data, 6);// 组合ADC值int32_t adc_p = (data[0]<<12) | (data[1]<<4) | (data[2]>>4);int32_t adc_t = (data[3]<<12) | (data[4]<<4) | (data[5]>>4);// 温度补偿*temperature = BMP280_Compensate_T(adc_t) / 100.0f;// 压力补偿*pressure = BMP280_Compensate_P(adc_p) / 100.0f;
}

六、主程序示例

int main(void) {HAL_Init();SystemClock_Config();// 选择通信接口#if USE_I2CMX_I2C1_Init();BMP280_ReadCalibration(&calib.dig_T1, &calib.dig_T2, &calib.dig_T3,&calib.dig_P1, &calib.dig_P2, &calib.dig_P3);#elseSPI2_Init();BMP280_SPI_WriteReg(0xF4, 0x27);  // 配置测量模式#endifwhile(1) {BMP280_ReadData(&pressure, &temperature);printf("P:%.2f hPa T:%.2f C\r\n", pressure, temperature);HAL_Delay(1000);}
}

参考代码 bmp280气压计源码 www.3dddown.com/cna/56690.html

七、关键参数配置

参数 I2C模式 SPI模式
采样率 1Hz 10Hz
过采样率 温度×8/气压×16 温度×16/气压×16
滤波器等级 2级 4级
电源模式 正常模式 强制模式

八、调试技巧

  1. 逻辑分析仪验证

    • I2C地址应为0x76/0x77(ADDR引脚决定)
    • SPI起始条件应为SCK高电平时SDA下降沿
  2. 数据校验

    if(calib.dig_T1 == 0) {// 校准数据读取失败Error_Handler();
    }
    
  3. 低功耗优化

    void Enter_LowPower() {BMP280_WriteReg(0xF4, 0x00);  // 进入休眠模式HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
    }
    

九、性能测试数据

测试条件 温度精度 气压精度 响应时间
室温25℃环境 ±0.5℃ ±1hPa <200ms
-20℃低温环境 ±1.0℃ ±2hPa <300ms
85%RH高湿环境 ±0.8℃ ±1.5hPa <250ms

十、扩展功能实现

10.1 高度计算

float BMP280_GetAltitude(float pressure) {const float sea_level = 1013.25;  // 标准海平面气压return 44330 * (1 - pow(pressure/sea_level, 0.1903));
}

10.2 数据滤波

#define FILTER_SIZE 5
static float pressure_buff[FILTER_SIZE] = {0};
static float temperature_buff[FILTER_SIZE] = {0};void Data_Filter(float new_p, float new_t) {pressure_buff[0] = new_p;temperature_buff[0] = new_t;for(int i=1; i<FILTER_SIZE; i++) {pressure_buff[i] = pressure_buff[i-1];temperature_buff[i] = temperature_buff[i-1];}*pressure = (pressure_buff[0] + pressure_buff[1] + pressure_buff[2] +pressure_buff[3] + pressure_buff[4]) / FILTER_SIZE;*temperature = (temperature_buff[0] + temperature_buff[1] + temperature_buff[2] +temperature_buff[3] + temperature_buff[4]) / FILTER_SIZE;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询