5.8 KiB
Драйвер датчика давления и температуры DS_BMP180
Драйвер на Си для работы с цифровым барометрическим датчиком BMP180 (а также совместимым BMP085) по интерфейсу I2C. Библиотека обеспечивает чтение заводских калибровочных коэффициентов из EEPROM чипа и производит математическую компенсацию нелинейности показаний.
📌 Особенности реализации
- Полная аппаратная компенсация: Драйвер содержит внутреннюю структуру
Calibrationдля хранения 11 уникальных заводских коэффициентов (AC1–MD) и промежуточного фактора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).