Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: датчик давления HP03, i2c и ARM/LPC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
evgen2
Братья и сестры,

Никто не работал с датчиком давления HP03 из ARMа (лучше из LPC) ?

есть родные доки hp03.pdf и hp03_code.pdf страдающие чрезмерным лаконизмом и невполне понятные (типа того, что частота указана не в Hz, а в k, временные диаграммы указаны в файле c описанием code), можно найти код для атмеги
в файле hp03_ATMega_source_code.zip который как-то достаточно отдаленно напоминает hp03_code, и есть сильно перпендикулярный им кейловский пример для работы с i2c..

С i2c ранее не работал :-(

Вот пара веток по HP03
http://electronix.ru/forum/index.php?showt...844&hl=hp03
и
http://electronix.ru/forum/index.php?showt...l=hp03&st=0
evgen2
Цитата(evgen2 @ May 17 2012, 13:01) *
Братья и сестры,

-------
Вроде бы победил.
В этом HP03 нарисована следующая последовательность

Read pressure
S 0xEE A 0xFF A 0XF0 A P D S 0xEE A 0xFD A S 0XEF A MSB ALSB N P
S: start bit
P: stop bit
A:acknowledge from slave
A: acknowledge from master
N: no acknowledge from master
D: delay for 40ms
MSB: conversion result MSB
LSB: conversion result LSB.

И, если использовать пример для i2c взятый из
\mcb1700.code.bundle.lpc17xx.keil\keil_examples\I2C\
(который под keil 4.23 еще нужно слегка допилить), то чтоб в ем выдать это самое дополнительное S нужно делать вот так:

Код
#define PRESSURE        0xF0
#define TEMPERATURE     0xE8

  d1 = HP03ReadValue(PRESSURE);
  d2 = HP03ReadValue(TEMPERATURE);
....
unsigned int HP03ReadValue(unsigned char n)
{
  unsigned int temp;
  char *ptr, ch;

  temp = 0;

  I2CWriteLength[PORT_USED] = 3;
  I2CReadLength[PORT_USED] = 0;
  I2CMasterBuffer[PORT_USED][0] = 0xEE;
  I2CMasterBuffer[PORT_USED][1] = 0xff;
  I2CMasterBuffer[PORT_USED][2] = n;    
  I2CEngine( PORT_USED );

  I2CStop( PORT_USED );
    _delay_ms(50);

// 2, а не 3!!!!;
Код
  I2CWriteLength[PORT_USED] = 2; // !!!!

  I2CReadLength[PORT_USED] = 2;
  I2CMasterBuffer[PORT_USED][0] = 0xEE;
  I2CMasterBuffer[PORT_USED][1] = 0xfd;    
  I2CMasterBuffer[PORT_USED][2] = 0xef; //!!! несмотря на то, что якобы пишем 2 байта, на самом деле пишем 3

  I2CEngine( PORT_USED );
  I2CStop( PORT_USED );

  ptr = (char *) (&I2CSlaveBuffer[2]);
  ch = ptr[1];
  ptr[1] = ptr[0];
  ptr[0] = ch;

  temp = *((unsigned short int *) ptr);

  return temp;

}

------
Температуру вроде бы как выдает правильную, а вот с давлением какая-то засада...
вместо атмосферного около 1000 (гектопаскалей) выдает 1800... пока не нашел ничего лучшего, как ввести коэффициент пересчета в мм.рт.ст 0.409245 вместо положенного 0.7500638
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.