82 lines
5.8 KiB
Markdown
82 lines
5.8 KiB
Markdown
# Драйвер датчика давления и температуры 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`
|
||
|
||
Датчик является асинхронным: сначала подается команда на запуск преобразования, затем выдерживается пауза на замер, и только после этого считывается результат.
|
||
|
||
```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`).
|