BMP085 - датчик абсолютного давления. Пдключаем к ATMEGA.
BMP085 - датчик абсолютного атмосферного давления. Область применения: измерение давления для барометров, метеостанций и приборов, перемещающихся в атмосфере.
Ранее я писал о датчике атмосферного давления HP03
BMP085 привлекателен не только значительно более высокими характеристиками, и меньшей стоимостью, но и завидной стабильностью характеристик в отличие от китайского собрата.
Характеристики BMP085
- Пределы измерения абсолютного давления 30-110кПа (300-1100hPa) (-500...9000 метров над уровнем моря) - Питание 1.8 - 3.6В (Vdda), 1.62 - 3.6В (Vddd) - Размер корпуса: 5.0X5.0 мм. - Низкий уровень шума: 0.06hPa (0.5м) в стандартном режиме 0.03hPa (0.25м) в режиме ультравысокого разрешения 0.1m возможно при применение программного фильтра. - Интерфейс: I2C - Разрешение: 0.01 hPa, 0.1 С
Датчик может работать в нескольких режимах: - Режим пониженного энергопотребления - Стандартный - Режим высокого разрешения - Режим ультравысокого разрешения.
Часто в описании BMP085 можно встретить "разрешение 14бит", но это не соответствует действительности. Датчик способен выдавать от 16 до 19 значащих бит в зависимости от режима работы.
Датчик откалиброван. Имеет термостабилизацию. Логика работы сходна с прочими цифровыми датчиками. С памяти датчика считываются калибровочные коэффициенты, показания АЦП сенсора давления и температуры, после чего по специальной формуле вычисляются значение давления и температуры.
Скачать документацию по BMP085 в формате pdf
Схема подключения датчика к микроконтроллеру ATmega8
В нашей схеме отсутствуют внешние подтягивающие резисторы на выходах микроконтроллера SCL, SDA. Задействованы внутренние подтягивающие резисторы микроконтроллера.
Для этого функция i2cSetBitrate была модифицирована.
void i2cSetBitrate(uint16_t bitratekHz)
{
uint8_t bitrate_div;
// set i2c bitrate
// Set Prescaler to one --> TWPS = 1
TWSR =((0<<TWPS0)|(0<<TWPS1));
//calculate bitrate division
bitrate_div = (((float)F_CPU/1000.0)/(float)bitratekHz);
if(bitrate_div >= 16){
bitrate_div = (float)(bitrate_div-16)/8;
}
//printf("DIV: %d ",bitrate_div);
TWBR=(uint8_t)bitrate_div;
//TWBR=0; -> max speed
/// !!!
PORTC |= ((1<<PINC4) | (1<<PINC5));
/// !!!
}
//----------------------------------------
Добавлена строка, которая включает подтягивающие резисторы на выводы SCL, SDA:
PORTC |= ((1<<PINC4) | (1<<PINC5));
Отладочная плата датчика BMP085
Для тестирования датчика BMP085 была сделана плата
Файл платы в формате Sprint Layout включен в архив с примером (ссылка в конце статьи).
Плата датчика подключена к тестовой плате с контроллером ATMega8 (Простая отладочная плата) Для связи с компьютером использовался модуль на базе FT232 (Подключаем микроконтроллер к компьютеру. Com-порт (RS-232), USB), который эмулирует виртуальный последовательный порт. От него же и питалась вся схема напряжением 3.3В.. Обратите внимание, что для датчика напряжение питания 5В недопустимо велико. Информация о давлении, высоте и температуре будет выводиться в последовательный порт UART на скорости 9600 бит/с. Информация на компьютере будем наблюдать с помощью стандартной программы HyperTerminal. Подразумевается, что читатель обладает знаниями по настройки терминала и знаком с работой модуля на базе FT232.
Микроконтроллер работает на частоте 4 МГц. Все прочие фьюзы без изменений.
Режимы работы датчика
Режим работы датчика и настройка используемого порта для сигнала EOC устанавливается в файле atmega_bmp085_lib.h
//----------------------------------------
// Set Ports
//----------------------------------------
//###########################
// I n p u t s
//###########################
#define input_DDR DDRC //DDR for EOC
#define input_PORT PORTC //PORT for EOC
#define input_PIN PINC //PIN for EOC
#define BMP085_pin PC2 //Pin of EOC
//----------------------------------------
// Set BMP085 oversampling
//----------------------------------------
#define OSS 2 // Oversampling Setting works for 0,1,2 NOT for 3 (not implemented)
//----------------------------------------
Обращаю Ваше внимание на то, что в данной библиотеке режим повышенной точности (OSS 3) не реализован.
Расчет высоты
Как известно, с ростом высоты давление падает. Примерная зависимость давления от высоты над уровнем моря отображена на следующем графике:
Эту зависимость описывает Барометрическая формула. На самом деле, вычисление высоты по давлению занятие весьма приблизительное. Дело в том, что основные показатели атмосферы (температура, влажность, атмосферное давление) меняются во времени. Эти показатели могут значительно изменяться в течение суток и существенно влиять на вычисление высоты. В барометрической формуле присутствует средняя температура слоя воздуха между точками измерения. При разных погодных условиях температура с ростом высоты может изменяться по разным кривым, что так же вносит погрешность в вычисления. Если пользоваться формулой Лапласа, то следует учитывать влажность воздуха. Вы должны понимать, что вычисленная по давлению высота над уровнем моря, будет совпадать с реальной только при стандартном давлении 760 мм рт.ст. (101 325 Па) над уровне моря.
Невзирая на сложности в вычислениях высоты по давлению, ее все же вычисляют, с некоторыми упрощениями. Из за разных подходов к вычислению высоты по давлению, у приборов разных производителей результаты могут отличаться. Не удивляйтесь, если на высоте свыше 1 км показания приборов разных производителей будут разниться на несколько процентов. В нашем случае, для вычисления высоты будем пользоваться формулой, рекомендуемой производителем датчика давления BMP085:
Пример использования BMP085 для AVR
#include <stdio.h>
#include <avr/io.h>
#include "atmega_bmp085_lib.h"
#include "uart.h"
int main(void)
{
int32_t temperature = 0;
int32_t pressure = 0;
int16_t BMP085_calibration_int16_t[8];
int16_t BMP085_calibration_uint16_t[3];
uint8_t error_code=0;
// Initialize UART0
uart_init();
_delay_ms(11);
// Initialize TWI
i2cSetBitrate(1000);
// Initialize BMP085
BMP085_Calibration(BMP085_calibration_int16_t, BMP085_calibration_uint16_t,&error_code);
printf("Error code: %d ",error_code);
while(1)
{
bmp085Convert(BMP085_calibration_int16_t, BMP085_calibration_uint16_t,&temperature, &pressure,&error_code);
printf("%ld;%ld;%ld", temperature/10, pressure, bmp085CalcAltitude(pressure)/10);
//printf("Temperature: %ld", temperature);
//printf("Pressure: %ld Pa", pressure);
//printf("Altitude: %ld m", bmp085CalcAltitude(pressure)/10);
_delay_ms(10);
}
}
Результат, выводимый в окне терминала:
Через точку с запятой выводится температура в градусах Цельсия, давление в паскалях, высота в метрах.
В используемой библиотеке режим 3 (сверх высокого разрешения) не поддерживается. Для этого требуется доработка библиотеки.
Результаты законченного USB барометра/термометра/альтиметра/вариометра.
Скачать пример использования датчика BMP085 совместно с Atmega8.
см. также:
- Сравнение датчиков атмосферного давления MS5611 и BMP280
- BME280 – датчик атмосферного давления с гигрометром
- BMP280 – датчик атмосферного давления от BOSCH
- BMP180 – датчик атмосферного давления. Подключаем к ATMEGA
- BMP085 – датчик абсолютного давления. Подключаем к ATMEGA
Недавні записи
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
Tags
battery soldering java-script ngnix adc rs-232 flask esp8266 watchdog web exti solar mongodb rtc sms pwm usart books ethernet smd git websocket meteo css python dc-dc displays led ssd1306 eeprom gpio barometer max1674 mpx4115a brushless motor mpu-6050 timer sensors remap servo bldc atmega pmsm 3d-printer flash encoder examples dma raspberry-pi tim ssd1331 piezo mpu-9250 rfid eb-500 foc bme280 gps nvic dht11 bluetooth hih-4000 stm32 st-link docker uart avr html wifi bmp280 bkp nodemcu options usb lcd programmator i2c capture
Архіви