Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование датчиков давления BMP085 и BMP180


Исследование датчиков давления BMP085 и BMP180

Сообщений 1 страница 16 из 16

1

Документация на BMP085   
Документация на BMP180

Симуляция Протеус 7.10; 8.1 + исходник Bascom 2.0.7.1; 2.0.7.5; 2.0.7.7; 2.0.7.8 + Log работы в железе + документация   -   скачать

Модель для Протеуса пока не готова, добавлю по готовности

В исходнике реализовано:
Температура 0,0°С
Давление 000,0 мм.рт.ст (термокомпенсировано)
Высота 0,0 м.над уровнем моря


Снимки экрана + фото в железе

http://se.uploads.ru/t/LOFTd.jpg http://se.uploads.ru/t/kORxN.jpg

http://se.uploads.ru/t/IrwCv.jpg


Появятся вопросы, пишите в ЛС или на mail

+3

2

Mrshilov написал(а):

Сдвиг не работает потому, что аргумент отрицательный.

СПАСИБО, а то эта проблема мне весь мозок совокупила!

Архив перезалил 25.01.2015, с учётом всех последних изменений.

0

3

Библиотечный вариант работы с BMP085   -   скачать

Пример работы

'===============================================================================
'      К О Н Ф И Г У Р А Ц И Я   К О Н Т Р О Л Л Е Р А     ATMEGA_328P
'===============================================================================
  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"       'http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
  $crystal = 8000000
  $framesize = 64       ' Размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека

'===============================================================================
'               К О Н Ф И Г У Р А Ц И Я   USART
'===============================================================================
  $baud = 38400       ' : Ucsr0a.1 = 1       ' Скорость трансляции Baud * 2 = 9600 бод
'  Ubrr0 = 12        ' 4800, данные на стр. 190 документации на МК (http://www.atmel.com/Images/Atmel-8271- … mplete.pdf)
'  Ucsr0a.1 = 1      ' Скорость трансляции Baud * 2 = 9600 бод
  Print "Usart 38400"

'===============================================================================
'               К О Н Ф И Г У Р А Ц И Я   LCD
'===============================================================================
'  Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
  Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  Config Lcd = 20 * 4
  Initlcd
  Cursor Off Noblink
  Cls

  Deflcdchar 0 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32       ' Знак градуса "°"

  $include "Кириллица на HD44780.inc"

'===============================================================================
'               К О Н Ф И Г У Р А Ц И Я   Ш И Н Ы   i2c
'===============================================================================
  Const Variant_realizacii_i2c = 1       ' 1 - аппаратная реализация (МК - выводы аппаратные); 2 - программная ускоренная реализация (МК - выводы любые); 3 - программная реализация (МК - выводы любые)

  #if Variant_realizacii_i2c = 1
      $lib "i2c_twi.lbx"       ' Без этой библиотеки реализация работы с шиной I2c будет программной, с библиотекой реализация шины I2c происходит на уровне аппаратных средств МК
      Config Sda = Portc.4       ' Конфигурация вывода Sda
      Config Scl = Portc.5       ' Конфигурация вывода Scl
      ' SCL и SDA, аппаратные выводы МК!!!
      Config Twi = 40000       ' Скорость работы шины I2c на аппаратном уровне
  #endif

  #if Variant_realizacii_i2c = 2
      $lib "i2c-x4.lib"       ' Ускоренный вариант программной реализации шины I2c
      Config Sda = Portc.4       ' Конфигурация вывода Sda
      Config Scl = Portc.5       ' Конфигурация вывода Scl
      Config I2cdelay = 1       ' Скорость работы шины I2c на программном уровне
  #endif

  #if Variant_realizacii_i2c = 3
      Config Sda = Portc.4       ' Конфигурация вывода Sda
      Config Scl = Portc.5       ' Конфигурация вывода Scl
      Config I2cdelay = 1       ' Скорость работы шины I2c на программном уровне
  #endif

  I2cinit       ' Инициализация шины I2c
  Waitms 50

  Const Const_точность_измерений_bmp085 = 3       ' Смотреть документацию
  $include "BMP085_BMP180.inc"
'------------------  Настраиваем точность измерения  ---------------------------
' Использовалась документация: BST-BMP085-DS000-06 | Revision 1.3 | August 2011
'         стр.12; таблица 3; возможные варианты: 0; 1; 2; 3
'+------------------------+----------------+----------------------+-------------+------------+
'|  Режим                 | Значение "oss" | Время преобразования | Потребление | Разрешение |
'+------------------------|----------------+----------------------+-------------+------------+
'|  ultra low power       |       0        |        4.5 ms        |    3 мкА    |    0.5 m   |
'|  standart              |       1        |        7.5 ms        |    5 мкА    |    0.4 m   |
'|  high resolution       |       2        |       13.5 ms        |    6 мкА    |    0.3 m   |
'|  ultra high resolution |       3        |       25.5 ms        |   12 мкА    |   0.25 m   |
'+------------------------+----------------+----------------------+-------------+------------+
'Обязательно читаем калибровочные константы, нужны для расчётов
  Gosub Чтение_калибровочных_данных

'Переменные для готовых строковых значений с BMP085
  Dim Высота_bmp085_str As String * 10
  Dim Давление_bmp085_str As String * 10
  Dim Температура_bmp085_str As String * 10

  Dim Lcd_высота_str As String * 20
  Dim Lcd_давление_str As String * 20
  Dim Lcd_температура_str As String * 20

  Dim Val_word As Word
  Dim Val_single As Single

           '+------------------------------- Строка
           '|   +--------------------------- Знакоместо
           '|   |           +--------------- Строковая переменная или строковое значение
           '|   |         / | \
  Lcd_print 1 , 1 , "  Барометр  BMP085  "

'===============================================================================
  Главный_цикл:
'===============================================================================

                                   '+---------- количество измерений (1-255, если 0 результат будет 0)
                                   '|
      Val_word = Температура_bmp085(5)
      Val_single = Val_word / 10
      Температура_bmp085_str = Fusing(val_single , "#.#")

                                 '+---------- количество измерений (1-255, если 0 результат будет 0)
                                 '|
      Val_word = Давление_bmp085(10)
      Val_single = Val_word / 10
      Давление_bmp085_str = Fusing(val_single , "#.#")

                               '+---------- количество измерений (1-255, если 0 результат будет 0)
                               '|
      Val_word = Высота_bmp085(50)
      Val_single = Val_word / 10
      Высота_bmp085_str = Fusing(val_single , "#.#")

      Lcd_высота_str = "Высота " + Высота_bmp085_str + " m "
      Lcd_давление_str = "Давление " + Давление_bmp085_str + " mm "
      Lcd_температура_str = "Температура " + Температура_bmp085_str

      Lcd_print 2 , 1 , Lcd_высота_str
      Lcd_print 3 , 1 , Lcd_давление_str
      Lcd_print 4 , 1 , Lcd_температура_str
      Locate 4 , 17
      Lcd Chr(0) ; "C "

      Print "Температура BMP085 " ; Температура_bmp085_str ; " °C"
      Print "Давление " ; Давление_bmp085_str ; " мм.р.с"
      Print "Давление " ; P_bmp085 ; " Па"
      Print "Высота " ; Высота_bmp085_str ; " метров"
      Print
      Print

'===============================================================================
  Goto Главный_цикл
'===============================================================================

+1

4

Может кому пригодится!

Датчики разные, соответственно и константы разные.

Калибровочные константы с двух датчиков BMP085

1 датчик

Ac1 =   7192
Ac2 =  -1185
Ac3 =  -14421
Ac4 =   33300
Ac5 =   25339
Ac6 =   18518
B1  =   5498
B2  =   63
Mb  =  -32768
Mc  =  -11075
Md  =   2432

2 датчик

Ac1 =   8974
Ac2 =  -1171
Ac3 =  -14476
Ac4 =   33998
Ac5 =   24681
Ac6 =   15648
B1  =   5498
B2  =   62
Mb  =  -32768
Mc  =  -11075
Md  =   2432

Калибровочные константы с 3-х датчиков BMP085 + 2-х датчиков BMP180

Channel_i2c 0
Ac1 =   8057
Ac2 =  -1062
Ac3 =  -14500
Ac4 =   32832
Ac5 =   24955
Ac6 =   16692
B1  =   5498
B2  =   55
Mb  =  -32768
Mc  =  -11075
Md  =   2432

1 sensor - BMP085
Temperature 24.1 °C
Pressure 759.9 mmHg
Pressure 101323 Pa
Altitude 57.1 m

Channel_i2c 1
Ac1 =   8327
Ac2 =  -1263
Ac3 =  -14479
Ac4 =   34114
Ac5 =   25070
Ac6 =   20859
B1  =   5498
B2  =   69
Mb  =  -32768
Mc  =  -11075
Md  =   2432

2 sensor - BMP085
Temperature 23.8 °C
Pressure 759.9 mmHg
Pressure 101319 Pa
Altitude 57.4 m

Channel_i2c 2
Ac1 =   7488
Ac2 =  -993
Ac3 =  -14550
Ac4 =   33579
Ac5 =   25269
Ac6 =   19360
B1  =   6515
B2  =   31

Mb  =  -32768
Mc  =  -11786
Md  =   2656

3 sensor - BMP180
Temperature 24.2 °C
Pressure 760.4 mmHg
Pressure 101387 Pa
Altitude 51.8 m

Channel_i2c 3
Ac1 =   7482
Ac2 =  -1102
Ac3 =  -14442
Ac4 =   33083
Ac5 =   25421
Ac6 =   18344
B1  =   6515
B2  =   40
Mb  =  -32768
Mc  =  -11786
Md  =   2563

4 sensor - BMP180
Temperature 23.7 °C
Pressure 760.4 mmHg
Pressure 101383 Pa
Altitude 52.1 m

Channel_i2c 4
Ac1 =   7192
Ac2 =  -1185
Ac3 =  -14421
Ac4 =   33300
Ac5 =   25339
Ac6 =   18518
B1  =   5498
B2  =   63
Mb  =  -32768
Mc  =  -11075
Md  =   2432

5 sensor - BMP085
Temperature 24.3 °C
Pressure 759.4 mmHg
Pressure 101258 Pa
Altitude 62.5 m

+1

5


!!!   ТОЛЬКО BASCOM 2.0.7.8   !!!


Ещё вариант, кучка датчиков давления (все, что смог найти) опрашивается по шине multi-i2c (только Bascom 2.0.7.8)

Atmega328 + 3 x BMP085 + 2 x BMP180 + LCD RDX0154 + multi-i2c


Библиотеку для LCD RDX0xxx переписал специально под multi-i2c (потому, как предыдущая версия не работала)

МНОГОУВАЖАЕМЫЙ АКСАКАЛ НАШЕГО И МНОГИХ ДРУГИХ ФОРУМОВ    Сергей Шилов  (Mrshilov)!

!!!  ОГРОМНОЕ СПАСИБО  !!!


Симуляция + исходники + библиотеки для Bascom   -   скачать


http://se.uploads.ru/t/vcGNO.jpg http://se.uploads.ru/t/58zT0.jpg

0

6


Версия исходника на английском

!!! ВНИМАНИЕ !!!

Только Bascom 2.0.7.8

!!! ВНИМАНИЕ !!!


Симуляция + исходник + библиотеки - скачать

0

7

Atmega8 + BMP085_180

' Документация на датчик BMP085  -  http://www.adafruit.com/datasheets/BST- … 000-06.pdf
' Документация на датчик BMP180  -  https://ae-bst.resource.bosch.com/media … 001-10.pdf
' Документация на датчик BMP180  -  https://ae-bst.resource.bosch.com/media … 000-09.pdf

'===============================================================================
'      К О Н Ф И Г У Р А Ц И Я   К О Н Т Р О Л Л Е Р А     ATMEGA_328P
'===============================================================================
  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m8def.dat"       'http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
  $crystal = 8000000
  $framesize = 64       ' Размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека

'===============================================================================
'               К О Н Ф И Г У Р А Ц И Я     USART
'===============================================================================
  $baud = 38400
'  Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2
  Print "Скорость трансляции USART: 38400 бод"
  Print       ' Пустая строка
  Print       ' Пустая строка

'===============================================================================
'               К О Н Ф И Г У Р А Ц И Я   Ш И Н Ы   i2c
'===============================================================================
  Config Sda = Portc.4       ' Конфигурация вывода Sda
  Config Scl = Portc.5       ' Конфигурация вывода Scl
  Config I2cdelay = 1       ' Скорость работы шины I2c на программном уровне

  I2cinit       ' Инициализация шины I2c
  Waitms 50

'===============================================================================
'               К О Н Ф И Г У Р А Ц И Я     BMP085 или BMP180
'===============================================================================
' Ревизию документации можно посмотреть: внизу последней страницы Datasheet
' http://www.adafruit.com/datasheets/BST- … 000-06.pdf
'Смотреть стр.17, п.п.4.2 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
  Const Адрес_запись_bmp085 = &HEE
  Const Адрес_чтение_bmp085 = &HEF

'Используемые константы
  Const Const_точность_измерений_bmp085 = 3       ' Смотреть документацию
'------------------  Настраиваем точность измерения  ---------------------------
' Использовалась документация: BST-BMP085-DS000-06 | Revision 1.3 | August 2011
'         стр.12; таблица 3; возможные варианты: 0; 1; 2; 3
'+------------------------+----------------+----------------------+-------------+------------+
'|  Режим                 | Значение "oss" | Время преобразования | Потребление | Разрешение |
'+------------------------|----------------+----------------------+-------------+------------+
'|  ultra low power       |       0        |        4.5 ms        |    3 мкА    |    0.5 m   |
'|  standart              |       1        |        7.5 ms        |    5 мкА    |    0.4 m   |
'|  high resolution       |       2        |       13.5 ms        |    6 мкА    |    0.3 m   |
'|  ultra high resolution |       3        |       25.5 ms        |   12 мкА    |   0.25 m   |
'+------------------------+----------------+----------------------+-------------+------------+

  Const Const_коррекция_показаний = 57       ' Коррекция показаний

  Const Const_стандартная_атмосфера = 101325       ' Международная стандартная атмосфера — 101325 Паскалей

'  Const Const_50000 = 50000       ' Константа используется в расчёте давления

'Смотреть стр.15, п.п.3.6 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
  Const Const_1делить5255 = 1 / 5.255       ' Для расчёта высоты над уровнем моря

  Dim Точность_измерений_bmp085 As Byte : Точность_измерений_bmp085 = Const_точность_измерений_bmp085
  Dim Oss As Byte

'Переменные для чтения и хранения калибровочных констант датчика BMP085
'Пишутся производителем в EEPROM BMP085, стр.12 документации
'Смотреть стр.12 п.п.3.4 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
  Dim Ac1 As Integer
  Dim Ac1_low As Byte At Ac1 Overlay
  Dim Ac1_high As Byte At Ac1 + 1 Overlay
  Dim Ac1a As Long

  Dim Ac2 As Integer
  Dim Ac2_low As Byte At Ac2 Overlay
  Dim Ac2_high As Byte At Ac2 + 1 Overlay

  Dim Ac3 As Integer
  Dim Ac3_low As Byte At Ac3 Overlay
  Dim Ac3_high As Byte At Ac3 + 1 Overlay

  Dim Ac4 As Word
  Dim Ac4_low As Byte At Ac4 Overlay
  Dim Ac4_high As Byte At Ac4 + 1 Overlay

  Dim Ac5 As Word
  Dim Ac5_low As Byte At Ac5 Overlay
  Dim Ac5_high As Byte At Ac5 + 1 Overlay
  Dim Ac5a As Single

  Dim Ac6 As Word
  Dim Ac6_low As Byte At Ac6 Overlay
  Dim Ac6_high As Byte At Ac6 + 1 Overlay

  Dim B1 As Integer
  Dim B1_low As Byte At B1 Overlay
  Dim B1_high As Byte At B1 + 1 Overlay

  Dim B2 As Integer
  Dim B2_low As Byte At B2 Overlay
  Dim B2_high As Byte At B2 + 1 Overlay

  Dim Mb As Integer
  Dim Mb_low As Byte At Mb Overlay
  Dim Mb_high As Byte At Mb + 1 Overlay

  Dim Mc As Integer
  Dim Mc_low As Byte At Mc Overlay
  Dim Mc_high As Byte At Mc + 1 Overlay
  Dim Mc2 As Long

  Dim Md As Integer
  Dim Md_low As Byte At Md Overlay
  Dim Md_high As Byte At Md + 1 Overlay

'Переменные для получения сырых данных температуры с BMP085
  Dim Ut As Long
  Dim Ut_low As Byte At Ut Overlay
  Dim Ut_high As Byte At Ut + 1 Overlay

'Переменные для получения сырых данных давления с BMP085
  Dim Up As Long
  Dim Up_xlow As Byte At Up Overlay
  Dim Up_low As Byte At Up + 1 Overlay
  Dim Up_high As Byte At Up + 2 Overlay

'Переменные для расчётов температуры, давления и высоты, полученные с BMP085
'Именно такая размерность переменной B4, иначе будет ошибка в расчётах
'смотреть стр.14 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
  Dim B4 As Dword

  Dim B3 As Long
  Dim B3a As Long
  Dim B5 As Long
  Dim B6 As Long
  Dim B6a As Long
  Dim B7 As Long
  Dim X1 As Long
  Dim X2 As Long
  Dim X2a As Long
  Dim X3 As Long
  Dim T As Long
  Dim T_bmp085 As Long
  Dim P_bmp085 As Long
  Dim P2_bmp085 As Long
  Dim X1t As Single
  Dim T_bmp085_single As Single
  Dim P_bmp085_single As Single
  Dim Высота_bmp085_single As Single

'Переменные для готовых строковых значений с BMP085
  Dim Высота_bmp085_str As String * 10
  Dim Давление_bmp085_str As String * 10
  Dim Температура_bmp085_str As String * 10

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'    З А П У С К    И    П Р Е Д В А Р И Т Е Л Ь Н Ы Е    Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'--------------  Разрешаем работу необходимых прерываний  ----------------------
'  Enable Int0
'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:

         'Обязательно читаем калибровочные константы, нужны для расчётов
          Gosub Чтение_калибр_данных_bmp085
          Gosub Запрос_температуры_bmp085
          Gosub Запрос_давления_bmp085
          Gosub Расчет_температуры_bmp085
          Gosub Расчет_давления_bmp085
          Gosub Расчет_высоты_bmp085

          Print "Температура " ; Температура_bmp085_str ; " °C"
          Print "Давление " ; Давление_bmp085_str ; " мм.р.с"
          Print "Давление " ; P_bmp085 ; " Па"
          Print "Высота " ; Высота_bmp085_str ; " метров"
          Print
          Print

    Waitms 100

'   Idle
  Goto Главный_цикл:
End
'===============================================================================
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Запрос_температуры_bmp085:
'-------------------------------------------------------------------------------
   'Запрос температуры с BMP085
    I2cstart
    I2cwbyte Адрес_запись_bmp085
    I2cwbyte &HF4       ' Адрес первой константы, остальные идут по порядку, итого 22 байта
    I2cwbyte &H2E       ' Запрос температуры
    I2cstop

    Waitms 5       ' Ждём, согласно документации на BMP085: 4.5 ms

   'Получение температуры с BMP085
    I2cstart
    I2cwbyte Адрес_запись_bmp085
    I2cwbyte &HF6       ' Адрес хранения температуры
    I2crepstart
    I2cwbyte Адрес_чтение_bmp085
    I2crbyte Ut_high , Ack       'Адрес &HF6
    I2crbyte Ut_low , Nack       'Адрес &HF7
    I2cstop

'    Print "Ut = " ; Ut
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Запрос_давления_bmp085:
'-------------------------------------------------------------------------------
   'Запрос давления с BMP085
    I2cstart
    I2cwbyte Адрес_запись_bmp085
    I2cwbyte &HF4       ' Адрес первой константы, остальные идут по порядку, итого 22 байта
   ' Выбираем точность измерения, датчиком BMP085
    Select Case Точность_измерений_bmp085
        Case 0 : I2cwbyte &H34       ' Запрос давления: &H34(OSS=0)
        Case 1 : I2cwbyte &H74       ' Запрос давления: &H74(OSS=1)
        Case 2 : I2cwbyte &HB4       ' Запрос давления: &HB4(OSS=2)
        Case 3 : I2cwbyte &HF4       ' Запрос давления: &HF4(OSS=3)
    End Select       ' Select Case Точность_измерений_bmp085
    I2cstop

   'Ждём, согласно документации на BMP085: min 4.5 ms, в зависимости от OSRS(точности)
    Select Case Точность_измерений_bmp085
        Case 0 : Waitms 5       ' Согластно документации 4.5 ms
        Case 1 : Waitms 10       ' Согластно документации 7.5 ms
        Case 2 : Waitms 15       ' Согластно документации 13.5 ms
        Case 3 : Waitms 30       ' Согластно документации 25.5 ms
    End Select       ' Select Case Точность_измерений_bmp085

   'Получение давления с BMP085
    I2cstart
    I2cwbyte Адрес_запись_bmp085
    I2cwbyte &HF6       ' Адрес хранения температуры
    I2crepstart
    I2cwbyte Адрес_чтение_bmp085
    I2crbyte Up_high , Ack       ' Адрес &HF6
    I2crbyte Up_low , Ack       ' Адрес &HF7
    I2crbyte Up_xlow , Nack       ' Адрес &HF8
    I2cstop

   'Не забываем про сдвиг на "oss" полученных данных с датчика BMP085
   'UP = (MSB <<16 + LSB << 8 + XLSB) >> (8 - oss)
    Oss = 8 - Точность_измерений_bmp085
    Shift Up , Right , Oss       ' Сдвигаем на "8 - oss", смотреть документацию стр.12

'    Print "Up = " ; Up
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Расчет_высоты_bmp085:
'-------------------------------------------------------------------------------
'Смотреть стр.15, п.п.3.6 документации (BST-BMP085-DS000-06 | Revision 1.3 | August 2011) на датчик BMP085
    Высота_bmp085_single = P_bmp085 / Const_стандартная_атмосфера
    Высота_bmp085_single = Высота_bmp085_single ^ Const_1делить5255
    Высота_bmp085_single = 1 - Высота_bmp085_single
    Высота_bmp085_single = Высота_bmp085_single * 44330
    Высота_bmp085_single = Высота_bmp085_single + Const_коррекция_показаний

    Print "Высота single = " ; Высота_bmp085_single
'    Высота_bmp085_str = Fusing(высота_bmp085_single , "#.&")
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Расчет_температуры_bmp085:
'-------------------------------------------------------------------------------
    Ut = Ut - Ac6
    X1t = Ut * Ac5a
    X3 = X1t + Md
    X2 = Mc2 / X3       ' Mc2 расчитывается при чтении калибровочных констант
    B5 = X1t + X2
    T = B5 + 8
    Shift T , Right , 4 , Signed       ' Аналог деления на 2^4

   'Получаем температуру в "°С" с десятыми
    T_bmp085_single = T / 10
    Print "T_single = " ; T_bmp085_single
'    Температура_bmp085_str = Fusing(t_bmp085_single , "&.&")
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Расчет_давления_bmp085:
'-------------------------------------------------------------------------------
    B6 = B5 - 4000
    B6a = B6 * B6
    Shift B6a , Right , 12 , Signed       ' Аналог деления на 2^12
    X1 = B2 * B6a
    Shift X1 , Right , 11 , Signed       ' Аналог деления на 2^11
    X2 = Ac2 * B6
    Shift X2 , Right , 11 , Signed       ' Аналог деления на 2^11
    X3 = X1 + X2

   'В документации строку формулы: B3 = (( AC1 * 4 + X3 ) << oss + 2 ) / 4
   'следует понимать так: B3 = (( AC1 * 4 + X3 ) << oss ) + 2 ) / 4
    Ac1a = Ac1 * 4
    Ac1a = Ac1a + X3
    Shift Ac1a , Left , Точность_измерений_bmp085
    Ac1a = Ac1a + 2
    B3 = Ac1a / 4

    B6a = B6 * Ac3
    X1 = B6a / 8192       ' 2^13
    B6a = B6 * B6
    Shift B6a , Right , 12 , Signed       ' Аналог деления на 2^12
    X2 = B1 * B6a
    Shift X2 , Right , 16 , Signed       ' Аналог деления на 2^16
    X3 = X1 + X2
    X3 = X3 + 2
    Shift X3 , Right , 2 , Signed       ' Аналог деления на 2^2
    B4 = X3 + 32768       ' 2^15
    B4 = B4 * Ac4
    Shift B4 , Right , 15 , Signed       ' Аналог деления на 2^15

    B7 = Up - B3
    B3a = 50000
    Shift B3a , Right , Точность_измерений_bmp085
    B7 = B7 * B3a

    If B7 < &H80000000 Then
        P_bmp085 = B7 * 2
        P_bmp085 = P_bmp085 / B4
      Else
        P_bmp085 = B7 / B4
        P_bmp085 = P_bmp085 * 2
    End If

    P2_bmp085 = P_bmp085
    Shift P2_bmp085 , Right , 8 , Signed       ' Аналог деления на 2^8

    X1 = P2_bmp085 * P2_bmp085
    X1 = X1 * 3038
    Shift X1 , Right , 16 , Signed       ' Аналог деления на 2^16
    X2 = -7357 * P_bmp085
    Shift X2 , Right , 16 , Signed       ' Аналог деления на 2^16

    P2_bmp085 = P_bmp085
    P_bmp085 = X2 + 3791
    P_bmp085 = P_bmp085 + X1
    Shift P_bmp085 , Right , 4 , Signed       ' Аналог деления на 2^4
    P_bmp085 = P_bmp085 + P2_bmp085

   'Переводим в привычные миллиметры ртутного столба
   '1 Паскаль = ~ 0.0075006 мм рт. ст. Или 1 мм рт. ст. = ~ 133,3224 Паскаля
    P_bmp085_single = P_bmp085 * 0.0075006

    Print "P_bmp085 = " ; P_bmp085
    Print "P_single = " ; P_bmp085_single

'    Давление_bmp085_str = Fusing(p_bmp085_single , "#.&")
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Чтение_калибр_данных_bmp085:
'-------------------------------------------------------------------------------
'Читаем калибровочные константы с датчика давления BMP085
    I2cstart
    I2cwbyte Адрес_запись_bmp085
    I2cwbyte &HAA       ' Адрес первой константы, остальные идут по порядку, итого 22 байта
    I2crepstart
    I2cwbyte Адрес_чтение_bmp085
    I2crbyte Ac1_high , Ack
    I2crbyte Ac1_low , Ack
    I2crbyte Ac2_high , Ack
    I2crbyte Ac2_low , Ack
    I2crbyte Ac3_high , Ack
    I2crbyte Ac3_low , Ack
    I2crbyte Ac4_high , Ack
    I2crbyte Ac4_low , Ack
    I2crbyte Ac5_high , Ack
    I2crbyte Ac5_low , Ack
    I2crbyte Ac6_high , Ack
    I2crbyte Ac6_low , Ack
    I2crbyte B1_high , Ack
    I2crbyte B1_low , Ack
    I2crbyte B2_high , Ack
    I2crbyte B2_low , Ack
    I2crbyte Mb_high , Ack
    I2crbyte Mb_low , Ack
    I2crbyte Mc_high , Ack
    I2crbyte Mc_low , Ack
    I2crbyte Md_high , Ack
    I2crbyte Md_low , Nack
    I2cstop

   'Калибровочные константы реального датчика BMP085
'    Ac1 = 7192
'    Ac2 = -1185
'    Ac3 = -14421
'    Ac4 = 33300
'    Ac5 = 25339
'    Ac6 = 18518
'    B1 = 5498
'    B2 = 63
'    Mb = -32768
'    Mc = -11075
'    Md = 2432

   'Печатаем калибровочные константы датчика BMP085
'    Print
'    Print "Калибровочные константы BMP085"
'    Print "Ac1 =   " ; Ac1
'    Print "Ac2 =  " ; Ac2
'    Print "Ac3 =  " ; Ac3
'    Print "Ac4 =   " ; Ac4
'    Print "Ac5 =   " ; Ac5
'    Print "Ac6 =   " ; Ac6
'    Print "B1  =   " ; B1
'    Print "B2  =   " ; B2
'    Print "Mb  =  " ; Mb
'    Print "Mc  =  " ; Mc
'    Print "Md  =   " ; Md
'    Print

    Mc2 = Mc * 2048       ' Аналог умножения на 2^11
'    Print "MC2 = " ; Mc2

    Ac5a = Ac5 / 32768       ' Аналог деления на 2^15
'    Print "Ac5a = " ; Ac5a

'-------------------------------------------------------------------------------
  Return
'===============================================================================

+4

8

А как достоверно определить наличие чипа на шине?
Считать температуру? - так она может быть в большом диапазоне...
Других идей нет.

0

9

Александр Д. написал(а):

А как достоверно определить наличие чипа на шине?
Считать температуру? - так она может быть в большом диапазоне...
Других идей нет.

Я BME280 проверяю, считывая один из регистров, заведомо зная его значение "с завода".

0

10

Логично
Но в BMP180 я таких не нашел
В ОДНОМ из документов видел про Chip Id 0xD0
Но в каких-то даёт ответ, а потом купили 100 датчиков, а он виснет при опросе этого регистра...

или вот такой прикол: Выдаёт h55 на запрос ChipID, но давление - отрицательное: -131.4 (вот текущий датчик выдал, чаще всего -248 и ниже)

Отредактировано Александр Д. (2023-07-05 20:03:17)

0

11

Александр Д. написал(а):

ЛогичноНо в BMP180 я таких не нашел
В ОДНОМ из документов видел про Chip Id 0xD0Но в каких-то даёт ответ, а потом купили 100 датчиков, а он виснет при опросе этого регистра...

Я использую как раз регистр Chip ID. ;)

А что мешает использовать калибровочные регистры ?
https://upforme.ru/uploads/0000/25/b8/1743/t192185.jpg
Особенность использования подчеркнута.
Неважно, что будет из них считано, главное, чтоб не &H0000 и не &HFFFF.

0

12

ну, в принципе как вариант - да

0

13

Александр Д. написал(а):

А как достоверно определить наличие чипа на шине?

    Const Id_bme280 = &H60

    Const Slave_bme280 = 236       'EC 236    I2C Address (5pin(BME280) = 0)

    Temp_bme280(1) = &HD0       ' ID register address
    I2creceive Slave_bme280 , Temp_bme280(1) , 1 , 1

    If Temp_bme280(1) = Id_bme280 Then       ' ID register must return $60
        'Print "Sensor found"
        Flag_availability_bme280 = 1
      Else
        'Print "Sensor not found"
        Flag_availability_bme280 = 0
        Goto Exit_initialization_bme280
    End If

+1

14

Александр Д. написал(а):

или вот такой прикол: Выдаёт h55 на запрос ChipID, но давление - отрицательное: -131.4 (вот текущий датчик выдал, чаще всего -248 и ниже)

Нескромный вопрос - а паузу необходимую перед считыванием выдерживаем ?  :blush:
https://upforme.ru/uploads/0000/25/b8/1743/t202271.jpg
Вот из примера Александра в #7:

Запрос_температуры_bmp085:
'-------------------------------------------------------------------------------
   'Запрос температуры с BMP085
    I2cstart
    I2cwbyte Адрес_запись_bmp085
    I2cwbyte &HF4       ' Адрес первой константы, остальные идут по порядку, итого 22 байта
    I2cwbyte &H2E       ' Запрос температуры
    I2cstop

    Waitms 5       ' Ждём, согласно документации на BMP085: 4.5 ms

   'Получение температуры с BMP085
    I2cstart
.....

0

15

Код - из примеров Александра
Мы производим оборудование с bmp180 уже несколько лет.
Проблем не было

Но в последнее время попёр брак всего: оптосимисторы (обрыв в цепи св.диода), полевики (ощущение, что просто кусок пластика с выводами), светодиоды Пиранья (обрыв внутри), МК, которые не видит ни FuseDoctor, ни параллельный программатор...
И вот партия датчиков, которые или не отвечают, или в ленте только металлическая крышечка без самой платы под ней )))
А примерно 10% выдают отрицательные значения.

Левота, короче!

Отредактировано Александр Д. (2023-07-07 10:35:15)

0

16

Ну, против брака не попрешь... ;)

0


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование датчиков давления BMP085 и BMP180