BMP085 - датчик абсолютного давления. Пдключаем к ATMEGA.


04.12.2012

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.

см. также:

Схеми і прошивки
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви