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
Tags
bme280 bmp280 gps mpu-6050 options stm32 ssd1331 ssd1306 eb-500 3d-printer soldering tim mpu-9250 dma watchdog piezo exti web raspberry-pi docker ngnix solar bluetooth foc html css brushless flask dc-dc capture gpio avr rs-232 mpx4115a atmega mongodb st-link barometer pwm nvic git java-script programmator dht11 hih-4000 pmsm encoder max1674 smd sensors rtc adc lcd motor timer meteo examples i2c usb flash sms rfid python esp8266 servo books bldc remap eeprom bkp battery ethernet uart usart displays led websocket nodemcu wifi
Архіви






