Первая итерация

This commit is contained in:
2026-06-27 00:39:04 +03:00
parent 2009035bb4
commit c4ec2b64cd
12 changed files with 951 additions and 180 deletions
+81
View File
@@ -0,0 +1,81 @@
# Драйвер датчика давления и температуры 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`).