сайт для палких паяльників
  • Facebook
  • Twitter
  • Google Plus
  • Add to favorites
  • Email
  • Print
  • RSS

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 \n",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 (http://www.avislab.com/blog/avr_atmega8/)
Для связи с компьютером использовался модуль на базе FT232 (http://www.avislab.com/blog/uart_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 \n",error_code);
while(1)
{
bmp085Convert(BMP085_calibration_int16_t, BMP085_calibration_uint16_t,&temperature, &pressure,&error_code);
printf("%ld;%ld;%ld\n", temperature/10, pressure, bmp085CalcAltitude(pressure)/10);
//printf("Temperature: %ld\n", temperature);
//printf("Pressure: %ld Pa\n", pressure);
//printf("Altitude: %ld m\n\n", bmp085CalcAltitude(pressure)/10);
_delay_ms(10);
}
}

Результат, выводимый в окне терминала:

Через точку с запятой выводится температура в градусах Цельсия, давление в паскалях, высота в метрах.

В используемой библиотеке режим 3 (сверх высокого разрешения) не поддерживается. Для этого требуется доработка библиотеки.

Результаты законченного USB барометра/термометра/альтиметра/вариометра.

Скачать пример использования датчика BMP085 совместно с Atmega8.

см. также:

Translate
Архіви

© 2011-2017 Андрій Корягін, Кременчук, Україна