sls_ 0 5 марта, 2007 Опубликовано 5 марта, 2007 · Жалоба Привет всем! Нужна помощь. Имеются два датчика 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 марта, 2007 Опубликовано 6 марта, 2007 · Жалоба А че доке пишут? Внимательно читал? мож он умеет усреднять запериод и раз за период обновляет регистры с результатами измерений? тыкни сылокой в доку, посмотрим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 6 марта, 2007 Опубликовано 6 марта, 2007 (изменено) · Жалоба Док на мой взглят скромный очень, вот он:FOSP01.pdf Изменено 6 марта, 2007 пользователем sls_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Времени не было написать, разобрался, ошибка: два байта в которые читаю значения с датчика должны быть беззнаковые (unsigned char b1,b2;), соответственно в функции чтения значений и коеффициентов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 5 мая, 2007 Опубликовано 5 мая, 2007 · Жалоба //далее постоянно вызываетя эта функция 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 7 мая, 2007 Опубликовано 7 мая, 2007 · Жалоба По-моему должно быть наоборот : d1 = FOSP01RxValue(0xf0); // pressure d2 = FOSP01RxValue(0xe8); // temperature согласен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bullit 0 11 мая, 2007 Опубликовано 11 мая, 2007 · Жалоба to sls: а где такой датчик можно приобрести и за какие деньги? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 14 мая, 2007 Опубликовано 14 мая, 2007 (изменено) · Жалоба to sls: а где такой датчик можно приобрести и за какие деньги? В платане розн. 260р, от 5шт. 232р http://www.platan.ru Изменено 14 мая, 2007 пользователем sls_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bullit 0 14 мая, 2007 Опубликовано 14 мая, 2007 · Жалоба В Платане (http://www.platan.ru/cgi-bin/qwery.pl/id=430951872&group=32401) написанно мол он Дифференциальный, но в даташите нет такого. Какой же он? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба В платане ещё написано что он на 12 вольт ..... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bullit 0 15 мая, 2007 Опубликовано 15 мая, 2007 · Жалоба Ответ понятен. Давно уже замечал неточности у Платана. Привык. И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками. to sls: Есть ли какие нибудь рекомендации по применению этого датчика? Так чёб другие не наступали на грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 16 мая, 2007 Опубликовано 16 мая, 2007 · Жалоба Ответ понятен. Давно уже замечал неточности у Платана. Привык. И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками. to sls: Есть ли какие нибудь рекомендации по применению этого датчика? Так чёб другие не наступали на грабли. Да вроде нет. У меня кроме ошибке с типом проблем не было, хотя пока нашел много времени убил. А так все читается, после пересчетов к температуре в термошкафу притензий не было, давление по барометру анеройду тоже(правда на границах в барокамере испытать пока не удалось). В шите приведен рисунок одного корпуса (с штырьками 2.54), на самом деле их минимум два, второй вариант с площадками (1.27) поменьше и по аккуратнее с металлическим кольцом. Мне лично нравится больше второй вариант. Еще возможно будет полезно: http://www.intersema.ch/site/technical/ms5534.php и HP03.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bullit 0 16 мая, 2007 Опубликовано 16 мая, 2007 · Жалоба Что за тип искал? И как там с заявленными точностями по давлению? Дает точность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sls_ 0 17 мая, 2007 Опубликовано 17 мая, 2007 · Жалоба Что за тип искал? И как там с заявленными точностями по давлению? Дает точность? Тип - ошибка в коде писал о ней выше (с чего собсно тема началась) На наших высотах точность соответствует, на границах пока проверить не удалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 28 августа, 2007 Опубликовано 28 августа, 2007 · Жалоба У меня проблема с этим датчиком. Считываемые температура и давление = 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 висят еще пару устройств. Читаю, пишу в них без проблем. В чем может быть проблема? Ну не может же датчик не работать наполовину! Или может? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться