Перейти к содержанию
    

FOSP01 - датчик атмосферного давления и температуры

Привет всем! Нужна помощь.

Имеются два датчика FOSP01 и FOSP01A (они одинаковые, разница в типе корпуса).

Датчики подключены по I2C к двум контроллерам ADuC848. Колибровочные константы из памяти датчиков читаются бз проблем, а вот с регистрами хранящими данные о температуре и давлении происходит странная вещь: в термошкафу температура 25.5С, а с датчика получаю: 24.4, 26.8 тоесть цифра не изменяется плавно от верхнего значения до нижнего, а изменяется скачком то 24.4 то 26.8, такая же фигня и со вторым датчиком только цифры немного другие 23.9,25.1. Дело не в расчетах, проверял, цифра читаемая с датчика скачет. Подозреваю что какаято проблемма в обращении к датчику, возможно его сбросе, различные манипуляции ни к чему хорошему не привели. Думаю как следствие занижает давление ~30mmHg.

Если кто сталкивался и может помочь, советом или исходниками, буду благодарен.

 

мои исходники:

// i2c ********************************* i2c

long xdata c1, c2, c3, c4, c5, c6, c7;

char xdata a, b, c, d;

 

void i2c_dly (void)

{

time(100);

}

 

void i2c_start (void)

{

bSDA = 1;

I2c_dly ();

bSCL = 1;

I2c_dly ();

bSDA = 0;

I2c_dly ();

bSCL = 0;

I2c_dly ();

}

void i2c_stop (void)

{

bSDA = 0;

I2c_dly ();

bSCL = 1;

I2c_dly ();

bSDA = 1;

I2c_dly ();

}

 

char i2c_rx(char ack)

{

char x, d=0;

bSDA = 1;

for(x=0; x<8; x++)

{

d <<= 1;

do

{

bSCL = 1;

}

while(bSCL==0);

i2c_dly();

if(bSDA) d |= 1;

bSCL = 0;

}

if(ack) bSDA = 0;

else bSDA = 1;

bSCL = 1;

i2c_dly();

bSCL = 0;

bSDA = 1;

return d;

}

 

bit i2c_tx(unsigned char d)

{

char x;

static bit b;

for(x=8; x; x--)

{

if(d&0x80) bSDA = 1;

else bSDA = 0;

bSCL = 1;

d <<= 1;

bSCL = 0;

}

bSDA = 1;

bSCL = 1;

i2c_dly();

b = bSDA;

bSCL = 0;

return b;

}

// FOSP01 ***************************************** FOSP01

int FOSP01RxCoeff(unsigned char n)

{

char b1,b2;

i2c_start();

i2c_tx(0xa0);

i2c_tx(n);

i2c_start();

i2c_tx(0xa1);

b1 = i2c_rx(1);

b2 = i2c_rx(0);

i2c_stop();

return b1*256+b2;

}

 

int FOSP01RxValue(unsigned char n)

{

char b1,b2;

i2c_start();

i2c_tx(0xee);

i2c_tx(0xff);

i2c_tx(n);

i2c_stop();

I2c_dly ();

i2c_start();

i2c_tx(0xee);

i2c_tx(0xfd);

i2c_start();

i2c_tx(0xef);

b1 = i2c_rx(1);

b2 = i2c_rx(0);

i2c_stop();

return b1*256+b2;

}

 

void FOSP01Reset(void)

{

 

bXCLR = 0;

I2c_dly ();

bXCLR = 1;

}

 

void FOSP01Initial(void)

{

int b1, b2;

c1 = FOSP01RxCoeff(16);

c2 = FOSP01RxCoeff(18);

c3 = FOSP01RxCoeff(20);

c4 = FOSP01RxCoeff(22);

c5 = FOSP01RxCoeff(24);

c6 = FOSP01RxCoeff(26);

c7 = FOSP01RxCoeff(28);

b1 = FOSP01RxCoeff(30)/256;

b2 = FOSP01RxCoeff(30);

c = b2;

d = b1;

b1 = FOSP01RxCoeff(32)/256;

b2 = FOSP01RxCoeff(32);

a = b2;

b = b1;

 

FOSP01Reset();

}

 

//******************************************************

//******************************************************

//******************************************************

//MAIN

 

FOSP01Initial();

 

 

//далее постоянно вызываетя эта функция

long FOSP01RxTB(void)

{

long d1, d2;

long t;

long dut;

long off,sens,x,p;

 

d1 = FOSP01RxValue(0xe8);

 

d2 = FOSP01RxValue(0xf0);

 

if(d2 >= c5) dut = d2-c5 - ((d2-c5)/128)*((d2-c5)/128)*a/pow(2,c);

else dut = d2-c5 - ((d2-c5)/128)*((d2-c5)/128)*b/pow(2,c);

numbers8(110, 0, 0, d2); //вывод на экран

t = 250+dut*c6/65536;

numbers8(30, 0, 1, t);

 

off = (c2+(c4-1024)*dut/16384)*4;

sens = c1+c3*dut/1024;

x = sens*(d1-7168)/16384-off;

p = x*10/32+c7;

numbers8(110, 1, 0, d1);

numbers8(30, 1, 1, p);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А че доке пишут? Внимательно читал? мож он умеет усреднять запериод и раз за период обновляет регистры с результатами измерений? тыкни сылокой в доку, посмотрим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Док на мой взглят скромный очень, вот он:FOSP01.pdf

Изменено пользователем sls_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Времени не было написать, разобрался, ошибка: два байта в которые читаю значения с датчика должны быть беззнаковые (unsigned char b1,b2;), соответственно в функции чтения значений и коеффициентов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//далее постоянно вызываетя эта функция

long FOSP01RxTB(void)

{

long d1, d2;

long t;

long dut;

long off,sens,x,p;

///////////////////////////////////////////////////

d1 = FOSP01RxValue(0xe8);

 

d2 = FOSP01RxValue(0xf0);

///////////////////////////////////////////////////

 

}

 

По-моему должно быть наоборот :

d1 = FOSP01RxValue(0xf0); // pressure

d2 = FOSP01RxValue(0xe8); // temperature

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему должно быть наоборот :

d1 = FOSP01RxValue(0xf0); // pressure

d2 = FOSP01RxValue(0xe8); // temperature

 

согласен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to sls:

а где такой датчик можно приобрести и за какие деньги?

 

В платане розн. 260р, от 5шт. 232р

 

http://www.platan.ru

Изменено пользователем sls_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Платане (http://www.platan.ru/cgi-bin/qwery.pl/id=430951872&group=32401) написанно мол он Дифференциальный, но в даташите нет такого. Какой же он?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответ понятен. Давно уже замечал неточности у Платана. Привык.

И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками.

to sls:

Есть ли какие нибудь рекомендации по применению этого датчика?

Так чёб другие не наступали на грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответ понятен. Давно уже замечал неточности у Платана. Привык.

И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками.

to sls:

Есть ли какие нибудь рекомендации по применению этого датчика?

Так чёб другие не наступали на грабли.

Да вроде нет. У меня кроме ошибке с типом проблем не было, хотя пока нашел много времени убил. А так все читается, после пересчетов к температуре в термошкафу притензий не было, давление по барометру анеройду тоже(правда на границах в барокамере испытать пока не удалось).

В шите приведен рисунок одного корпуса (с штырьками 2.54), на самом деле их минимум два, второй вариант с площадками (1.27) поменьше и по аккуратнее с металлическим кольцом. Мне лично нравится больше второй вариант.

Еще возможно будет полезно:

http://www.intersema.ch/site/technical/ms5534.php

и

HP03.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за тип искал?

И как там с заявленными точностями по давлению? Дает точность?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за тип искал?

И как там с заявленными точностями по давлению? Дает точность?

Тип - ошибка в коде писал о ней выше (с чего собсно тема началась)

На наших высотах точность соответствует, на границах пока проверить не удалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня проблема с этим датчиком. Считываемые температура и давление = 0. Хотя калибровачные коэффициенты читаются без проблем.

#define fospEEPROM_ADR  0xa0    // EEPROM device address
#define fospADC_ADR       0xee    // ADC device address

//#############################################################
// Чтение калибровочных коэффициентов EEPROM (FOSP01-A)
//_____________________________________________________________________________
void fosp01RxCoeff(unsigned char n)
{
  Send_start();
  Send_addr(fospEEPROM_ADR+W);    // EEPROM write address 0xA0
  Send_byte(n);                   // EEPROM coefficient address

  Send_start();
  Send_addr(fospEEPROM_ADR+R);    // EEPROM read address 0xA1

  C1 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 16:17
  C2 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 18:19
  C3 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 20:21
  C4 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 22:23
  C5 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 24:25
  C6 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 26:27
  C7 = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(ACK);  // 28:29
  A = Rx_byte(ACK);    // 30
  B = Rx_byte(ACK);    // 31
  C = Rx_byte(ACK);    // 32
  D = Rx_byte(NACK);   // 33  last byte must NACK

  Send_stop();
}


//####################################################
// Чтение данных АЦП (FOSP01-A)
//___________________________________________________________________
unsigned int fosp01RxValue(unsigned char n)
{
  unsigned int temp;

  Send_start();
  Send_addr(fospADC_ADR+W);   // ADC device write address 0xEE
  Send_byte(0xff);
  Send_byte(n);               // Pressure(0xF0), Temperature(0xE8)
  Send_stop();

  delay_ms(100);

  Send_start();
  Send_addr(fospADC_ADR+W);   // ADC device write address 0xEE
  Send_byte(0xfd);
  Send_start();
  Send_addr(fospADC_ADR+R);   // ADC device read address 0xEF
  temp = ((unsigned int)Rx_byte(ACK) << 8) + Rx_byte(NACK);

  Send_stop();

  return temp;
}

//___________________________________________________
void PressureTemperatureMeasure(void)
{
  unsigned int D1,D2;      // pressure, temperature
  long dUT;
  long off,sens,x;            // offset, sensivity

  fosp01RxCoeff(16);

  D1 = fosp01RxValue(0xf0);   // measured pressure
  D2 = fosp01RxValue(0xe8);   // measured temperature
...............
}

На шине I2C висят еще пару устройств. Читаю, пишу в них без проблем. В чем может быть проблема? Ну не может же датчик не работать наполовину! Или может?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...