реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> FOSP01 - датчик атмосферного давления и температуры, Скачут показания
sls_
сообщение Mar 5 2007, 12:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Привет всем! Нужна помощь.
Имеются два датчика 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);
}
Go to the top of the page
 
+Quote Post
klen
сообщение Mar 6 2007, 08:41
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



А че доке пишут? Внимательно читал? мож он умеет усреднять запериод и раз за период обновляет регистры с результатами измерений? тыкни сылокой в доку, посмотрим.
Go to the top of the page
 
+Quote Post
sls_
сообщение Mar 6 2007, 09:11
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Док на мой взглят скромный очень, вот он:Прикрепленный файл  FOSP01.pdf ( 115.68 килобайт ) Кол-во скачиваний: 738


Сообщение отредактировал sls_ - Mar 6 2007, 09:12
Go to the top of the page
 
+Quote Post
sls_
сообщение Apr 19 2007, 08:45
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Времени не было написать, разобрался, ошибка: два байта в которые читаю значения с датчика должны быть беззнаковые (unsigned char b1,b2;), соответственно в функции чтения значений и коеффициентов.
Go to the top of the page
 
+Quote Post
alux
сообщение May 5 2007, 06:06
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(sls_ @ Mar 5 2007, 15:26) *
//далее постоянно вызываетя эта функция
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
Go to the top of the page
 
+Quote Post
sls_
сообщение May 7 2007, 05:28
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Цитата(alux @ May 5 2007, 10:06) *
По-моему должно быть наоборот :
d1 = FOSP01RxValue(0xf0); // pressure
d2 = FOSP01RxValue(0xe8); // temperature


согласен.
Go to the top of the page
 
+Quote Post
bullit
сообщение May 11 2007, 10:42
Сообщение #7


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



to sls:
а где такой датчик можно приобрести и за какие деньги?
Go to the top of the page
 
+Quote Post
sls_
сообщение May 14 2007, 02:44
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Цитата(bullit @ May 11 2007, 14:42) *
to sls:
а где такой датчик можно приобрести и за какие деньги?


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

http://www.platan.ru

Сообщение отредактировал sls_ - May 14 2007, 02:51
Go to the top of the page
 
+Quote Post
bullit
сообщение May 14 2007, 03:57
Сообщение #9


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



В Платане (http://www.platan.ru/cgi-bin/qwery.pl/id=430951872&group=32401) написанно мол он Дифференциальный, но в даташите нет такого. Какой же он?
Go to the top of the page
 
+Quote Post
sls_
сообщение May 15 2007, 07:38
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



В платане ещё написано что он на 12 вольт ..... smile.gif
Go to the top of the page
 
+Quote Post
bullit
сообщение May 15 2007, 13:50
Сообщение #11


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Ответ понятен. Давно уже замечал неточности у Платана. Привык.
И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками.
to sls:
Есть ли какие нибудь рекомендации по применению этого датчика?
Так чёб другие не наступали на грабли.
Go to the top of the page
 
+Quote Post
sls_
сообщение May 16 2007, 01:37
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Цитата(bullit @ May 15 2007, 21:50) *
Ответ понятен. Давно уже замечал неточности у Платана. Привык.
И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками.
to sls:
Есть ли какие нибудь рекомендации по применению этого датчика?
Так чёб другие не наступали на грабли.

Да вроде нет. У меня кроме ошибке с типом проблем не было, хотя пока нашел много времени убил. А так все читается, после пересчетов к температуре в термошкафу притензий не было, давление по барометру анеройду тоже(правда на границах в барокамере испытать пока не удалось).
В шите приведен рисунок одного корпуса (с штырьками 2.54), на самом деле их минимум два, второй вариант с площадками (1.27) поменьше и по аккуратнее с металлическим кольцом. Мне лично нравится больше второй вариант.
Еще возможно будет полезно:
http://www.intersema.ch/site/technical/ms5534.php
и
Прикрепленный файл  HP03.pdf ( 249.41 килобайт ) Кол-во скачиваний: 551
Go to the top of the page
 
+Quote Post
bullit
сообщение May 16 2007, 09:46
Сообщение #13


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Что за тип искал?
И как там с заявленными точностями по давлению? Дает точность?
Go to the top of the page
 
+Quote Post
sls_
сообщение May 17 2007, 01:38
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-03-07
Пользователь №: 25 875



Цитата(bullit @ May 16 2007, 17:46) *
Что за тип искал?
И как там с заявленными точностями по давлению? Дает точность?

Тип - ошибка в коде писал о ней выше (с чего собсно тема началась)
На наших высотах точность соответствует, на границах пока проверить не удалось.
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 28 2007, 14:47
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



У меня проблема с этим датчиком. Считываемые температура и давление = 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 висят еще пару устройств. Читаю, пишу в них без проблем. В чем может быть проблема? Ну не может же датчик не работать наполовину! Или может?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016