Files
2026-06-27 00:39:04 +03:00

5.8 KiB
Raw Permalink Blame History

Драйвер датчика давления и температуры DS_BMP180

Драйвер на Си для работы с цифровым барометрическим датчиком BMP180 (а также совместимым BMP085) по интерфейсу I2C. Библиотека обеспечивает чтение заводских калибровочных коэффициентов из EEPROM чипа и производит математическую компенсацию нелинейности показаний.

📌 Особенности реализации

  • Полная аппаратная компенсация: Драйвер содержит внутреннюю структуру Calibration для хранения 11 уникальных заводских коэффициентов (AC1MD) и промежуточного фактора B5.
  • Поддержка Oversampling (OSS): Реализована возможность выбора точности измерения давления от экономичного (0) до сверхвысокого разрешения (3) через функцию конфигурирования.
  • Целочисленная математика: Все формулы вычисления оптимизированы под битовые сдвиги и целочисленные типы данных long/uint32_t, что исключает нагрузку на блок плавающей точки (FPU) микроконтроллера.

🔌 Схема подключения (I2C)

Адрес устройства на шине I2C фиксирован аппаратно и равен 0x77 (в функциях HAL адрес необходимо передавать со сдвигом: 0x77 << 1).

Вывод датчика BMP180 Вывод STM32 Назначение
VCC 3.3V / 5V Питание модуля (зависит от наличия стабилизатора на плате)
GND GND Общая земля
SCL I2Cx_SCL Тактовая линия шины I2C
SDA I2Cx_SDA Линия данных шины I2C

💻 Пример использования в main.c

Датчик является асинхронным: сначала подается команда на запуск преобразования, затем выдерживается пауза на замер, и только после этого считывается результат.

#include "DS_BMP180.h"

extern I2C_HandleTypeDef hi2c1;
DS_BMP180 barometer;

int main(void) {
    // ... Автоматическая инициализация HAL, GPIO, I2C ...

    /* 1. Инициализация и вычитка калибровочных коэффициентов */
    // Передаем сдвинутый адрес: 0x77 << 1 = 0xEE
    DS_BMP180_Init(&barometer, &hi2c1, 0xEE);

    while (1) {
        /* 2. Измерение ТЕМПЕРАТУРЫ */
        DS_BMP180_StartConversionTemperature(&barometer);
        HAL_Delay(5); // Пауза на преобразование температуры по даташиту (min 4.5 мс)
        long raw_temp = DS_BMP180_GetTemperature(&barometer);
        float real_temp = raw_temp / 10.0f; // Результат возвращается в десятых долях градуса

        /* 3. Измерение ДАВЛЕНИЯ */
        // Запуск в режиме ультравысокого разрешения OSS = 3
        DS_BMP180_StartConversionPressure(&barometer, 3);
        HAL_Delay(26); // Пауза для режима OSS=3 (min 25.5 мс)
        long pressure_pa = DS_BMP180_GetPressure(&barometer); // Результат в Паскалях (Па)
        float pressure_mmhg = pressure_pa / 133.3224f; // Перевод в мм ртутного столба

        // Полученные данные real_temp и pressure_mmhg готовы для вывода
        HAL_Delay(1000);
    }
}

📋 Справочник API функций

void DS_BMP180_Init(DS_BMP180 *DS_BMP180, I2C_HandleTypeDef *hi2c, uint8_t address)

Выполняет первичную привязку дескриптора к шине I2C и вычитывает массив из 22 байт из регистра 0xAA для заполнения таблицы калибровочных констант.

void DS_BMP180_StartConversionTemperature(DS_BMP180 *DS_BMP180)

Записывает команду 0x2E в управляющий регистр 0xF4, запуская внутренний аналого-цифровой замер температуры.

long DS_BMP180_GetTemperature(DS_BMP180 *DS_BMP180)

Считывает регистры данных 0xF6-0xF7, рассчитывает промежуточный фактор компенсации B5 и возвращает температуру.

  • Выходное значение: Целое число (например, значение 245 соответствует температуре 24.5 °C).

void DS_BMP180_StartConversionPressure(DS_BMP180 *DS_BMP180, uint8_t OversamplingRatio)

Запускает замер давления с указанным коэффициентом аппроксимации OversamplingRatio (значения от 0 до 3).

long DS_BMP180_GetPressure(DS_BMP180 *DS_BMP180)

Вычитывает 3 байта сырых данных давления, выполняет полную компенсацию нелинейности по формулам Bosch с использованием ранее рассчитанного фактора B5.

  • Выходное значение: Давление в Паскалях (Pa).