Привет всем! Нужна помощь.
Имеются два датчика 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);
}
А че доке пишут? Внимательно читал? мож он умеет усреднять запериод и раз за период обновляет регистры с результатами измерений? тыкни сылокой в доку, посмотрим.
Времени не было написать, разобрался, ошибка: два байта в которые читаю значения с датчика должны быть беззнаковые (unsigned char b1,b2;), соответственно в функции чтения значений и коеффициентов.
Цитата(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
Цитата(alux @ May 5 2007, 10:06)

По-моему должно быть наоборот :
d1 = FOSP01RxValue(0xf0); // pressure
d2 = FOSP01RxValue(0xe8); // temperature
согласен.
bullit
May 11 2007, 10:42
to sls:
а где такой датчик можно приобрести и за какие деньги?
Цитата(bullit @ May 11 2007, 14:42)

to sls:
а где такой датчик можно приобрести и за какие деньги?
В платане розн. 260р, от 5шт. 232р
http://www.platan.ru
bullit
May 14 2007, 03:57
В Платане (http://www.platan.ru/cgi-bin/qwery.pl/id=430951872&group=32401) написанно мол он Дифференциальный, но в даташите нет такого. Какой же он?
В платане ещё написано что он на 12 вольт .....
bullit
May 15 2007, 13:50
Ответ понятен. Давно уже замечал неточности у Платана. Привык.
И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками.
to sls:
Есть ли какие нибудь рекомендации по применению этого датчика?
Так чёб другие не наступали на грабли.
Цитата(bullit @ May 15 2007, 21:50)

Ответ понятен. Давно уже замечал неточности у Платана. Привык.
И с поискому них туговато. Так как поиск нечего не дал(!). Пришлось ручками.
to sls:
Есть ли какие нибудь рекомендации по применению этого датчика?
Так чёб другие не наступали на грабли.
Да вроде нет. У меня кроме ошибке с типом проблем не было, хотя пока нашел много времени убил. А так все читается, после пересчетов к температуре в термошкафу притензий не было, давление по барометру анеройду тоже(правда на границах в барокамере испытать пока не удалось).
В шите приведен рисунок одного корпуса (с штырьками 2.54), на самом деле их минимум два, второй вариант с площадками (1.27) поменьше и по аккуратнее с металлическим кольцом. Мне лично нравится больше второй вариант.
Еще возможно будет полезно:
http://www.intersema.ch/site/technical/ms5534.phpи
Нажмите для просмотра прикрепленного файла
bullit
May 16 2007, 09:46
Что за тип искал?
И как там с заявленными точностями по давлению? Дает точность?
Цитата(bullit @ May 16 2007, 17:46)

Что за тип искал?
И как там с заявленными точностями по давлению? Дает точность?
Тип - ошибка в коде писал о ней выше (с чего собсно тема началась)
На наших высотах точность соответствует, на границах пока проверить не удалось.
У меня проблема с этим датчиком. Считываемые температура и давление = 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 висят еще пару устройств. Читаю, пишу в них без проблем. В чем может быть проблема? Ну не может же датчик не работать наполовину! Или может?
Попробовал на другом датчике (FOSP01A). Та же фигня.

Температура и давление=0. Прошу помощи в данной проблеме. Исчерпал все варианты.
Цитата(alux @ Aug 28 2007, 23:12)

Попробовал на другом датчике (FOSP01A). Та же фигня.

Температура и давление=0. Прошу помощи в данной проблеме. Исчерпал все варианты.

Здравствуйте alux!
Бегло просмотрев Ваш исходник, не нашол в нем сброса датчика, который на сколько я помню его и запускает.
Что то типа этого:
void FOSP01Reset(void)
{
bXCLR = 0;
I2c_dly ();
bXCLR = 1;
}
Цитата(sls_ @ Aug 29 2007, 09:56)

не нашол в нем сброса датчика, который на сколько я помню его и запускает.
Спасибо, за ответ. Функция fosp01Init(); вызывается раньше в main().
Код
void main(void)
.......
fosp01Init();
.......
PressureTemperatureMeasure();
......
}
/////////////////
void fosp01Init(void)
{
DDRD |= (1<<XCLR); //XCLR - на выход
PORTD &= ~(1<<XCLR);
delay_ms(100);
PORTD |= (1<<XCLR); //сброс FOSP01-A
}
В даташите ничего не сказано про длительность импульса сброса. Пробовал разные. Или импульс сброса надо давать перед КАЖДЫМ преобразованием?
В JTAG проконтролировал каждый шаг в функции fosp01RxValue(n). Каждый байт успешно отправлен. А в ответ - 0.
Глас вопиющего в пустыне... Видимо, никому нет дела. У меня вывод напрашивается только такой: Оба датчика бракованные.
Дело есть, времяни нет ....
Цитата(alux @ Aug 29 2007, 11:24)

В даташите ничего не сказано про длительность импульса сброса. Пробовал разные. Или импульс сброса надо давать перед КАЖДЫМ преобразованием?
Нет достаточно один раз сбросить.
На мой взгляд три варианта:
1. не проходит сброс
2. нет частоты (не та частота) на MCLK
3. брак
Цитата(sls_ @ Aug 29 2007, 14:58)

1. не проходит сброс
Подаю отрицательный импульс длительностью от 100мсек. Пробовал 3сек. Может как-то по особенному надо сбрасывать? Типа 20 раз подать импульсов на XCLR...
Цитата(sls_ @ Aug 29 2007, 14:58)

2. нет частоты (не та частота) на MCLK
Частота формируется микросхемой реального времени DS1388. Осцилографом не смотрел, но уверен, что там 32768Гц. Второе. Если бы проблема была бы в этом, то коэффициенты не считывались.
Цитата(sls_ @ Aug 29 2007, 14:58)

3. брак
Сразу два датчика? Маловероятно. Очень похоже , что ошибка в программе. Только все здесь просто как 2х2, ... но не работает
Просто черная полоса какая-то. То АЦП AD7730 сгорело по непонятной причине. Теперь вот это...
Цитата
Добавлено
Один датчик выдает:
Цитата
C1: 8609
C2: -24317
C3: 175
C4: 0
C5: 28576
C6: -24159
C7: -24124
A: 3
B: 22
C: 6
D: 161
D1: 0
D2: 0
Второй:
C1: 20694
C2: 1843
C3: 218
C4: 168
C5: 28936
C6: 5923
C7: 2500
A: 3
B: 22
C: 6
D: 12
D1: 0
D2: 0
Откуда взялись отрицательные значения? У меня везде unsigned char/int
Есть одна мысль, которая требует проверки. Может действительно проблема в частоте? По-моему чтобы считать EEPROM частота на MCLK не нужна. Она нужна только для АЦП. Поправьте меня, если я не прав. В микросхеме часов (DS1388) стоит кварц 13768 (12,5пФ вместо необходимых 6пФ). Может из-за этого микросхема выдает пониженную частоту , и АЦП не хочет запускаться?
1. врятли, у меня одного раза хватило.
2. возможно перепутано oscout и oscin, по моему коэффициенты считываются из какой то внутренней флехи и частота там не нужна.
3. да наверно, хотя если брак то как правило вся партия целиком.
В программе не увидел ничего криминального, единственное не очень понял реализацию сброса.
Цитата(sls_ @ Aug 29 2007, 16:27)

возможно перепутано oscout и oscin
Это первое, что я проверил. MCLK беру со 2-го вывода RTC. Мне все-таки кажется, что у RTC не хватает нагрузочной способности. Имеет ли смысл попробовать взять частоту 32768, например, с ассинхронного таймера Меги32?
Цитата(sls_ @ Aug 29 2007, 16:27)

единственное не очень понял реализацию сброса.
Да что тут непонятного?
Код
void fosp01Init(void)
{
DDRD |= (1<<XCLR); //XCLR - на выход
PORTD &= ~(1<<XCLR); //XCLR=0
delay_ms(100); //пауза 100мсек
PORTD |= (1<<XCLR); //XCLR=1
}
А что на счет отрицательных коэффициентов?
Цитата
Добавлено
Вместо микросхемы RTC (DS1388) использовал асинхронный таймер Меги32. Подключил кварц 32768 на TOSC1, TOSC2. Выход на MCLK взял с TOSC2(выход осциллятора). ТА ЖЕ ФИГНЯ!!!
bullit
Aug 29 2007, 17:37
Вроде код нормальный.
Цитата
void fosp01Init(void){
DDRD |= (1<<XCLR); //XCLR - на выход
PORTD &= ~(1<<XCLR); //XCLR=0
delay_ms(100); //пауза 100мсек
PORTD |= (1<<XCLR); //XCLR=1}
Может перед этим не хватает этой строчки (мало ли, забыли или закаментили):
#define XCLR PDn; // где n - номер порта для сброса АЦП FOSP
+ советую использовать встроенный в мегу асинхронный Т/С с кварцем на 32 и двумя кондерами.
Нет, такие ошибки у меня не бывают. На счет использования таймера я уже писал...Без результатно.
Я очень разочарован... Если кому интересно, выложу свои исходники. Интересно все-таки в чем проблема: в железе или в софте.
bullit
Aug 30 2007, 13:56
Был бы очень рад исходникам. Тем более под мегу, как я понимаю.
Может что и нарою.
Удачи!
Проблема решена.

Как я и предполагал, проблема была в низкой нагрузочной способности осциллятора DS1388. В принципе об этом даже было сказано в апноте AN58 DallasSemiconductor по поводу того, что нельзя подключать даже осциллограф к кварцу. Собрал отдельный кварцевый генератор 32768 Гц на инверторах (74hc04) на отдельной платке. Подал сигнал на MCLK. И все Заработало!!!
Всем спасибо.

PS. Нужно было ставить DS1338. У него есть генераторный выход. Да и дешевле раза в 1,5...2. Проглядел.
Проблема решена частично. Датчик заработал. Но выдает завышенное атмосферное давление. 1004 мм. рт. ст. Хотя рядом стоит еще один цифровой датчик давления ASDX-DO, который показывает 730 мм.рт.ст. Что совпадает с официальным прогнозом в моем регионе. Температуру FOSP01A меряет вроде нормально.
В формуле ошибки нет. По крайней мере проверял подстановкой значений из примера даташита FOSP01A.
Пробовал использовать пример кода для HP03 аналог(замена) FOSP01. Результат тот же (завышенный). Выкладываю исходники. Может кто и найдет ошибку. Хотя сто раз перепроверял...
Код
#define fospEEPROM_ADR 0xa0 // EEPROM device address
#define fospADC_ADR 0xee // ADC device address
#define PRESSURE 0xf0
#define TEMPERATURE 0xe8
#define mm_rt_st 0.7500638 // мм. рт. ст. (@ 0 гр. C)
//#############################################################################
// Инициализация FOSP01-A
//_____________________________________________________________________________
void fosp01Init(void)
{
port &= ~(1<<XCLR); //Сброс FOSP01-A
__delay_cycles(1000);
port |= (1<<XCLR);
__delay_cycles(1000);
port &= ~(1<<XCLR);
__delay_cycles(1000);
fosp01RxCoeff();
// с1=20694;
// c2=1843;
// c3=218;
// c4=168;
// c5=28936;
// c6=5923;
// a=3;
// b=22;
// c=6;
// d=12;
}
//#############################################################################
// Чтение калибровочных коэффициентов из EEPROM (FOSP01-A)
//_____________________________________________________________________________
void fosp01RxCoeff(void)
{
unsigned char ret, HiTemp, LowTemp;
ret = i2c_start(fospEEPROM_ADR|W); // EEPROM write address 0xA0
if(ret)
{
// failed to issue start condition, possibly no device found
i2c_stop();
}
else
{
i2c_write(16); // EEPROM coefficient address
i2c_rep_start(fospEEPROM_ADR|R); // EEPROM read address 0xA1
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK); //Считываем коэффициенты
c1 = (((unsigned int)HiTemp) << 8) + LowTemp; // 16:17
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK);
c2 = (((unsigned int)HiTemp) << 8) + LowTemp; // 18:19
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK);
c3 = (((unsigned int)HiTemp) << 8) + LowTemp; // 20:21
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK);
c4 = (((unsigned int)HiTemp) << 8) + LowTemp; // 22:23
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK);
c5 = (((unsigned int)HiTemp) << 8) + LowTemp; // 24:25
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK);
c6 = (((unsigned int)HiTemp) << 8) + LowTemp; // 26:27
HiTemp=i2c_read(ACK);
LowTemp=i2c_read(ACK);
c7 = (((unsigned int)HiTemp) << 8) + LowTemp; // 28:29
a = i2c_read(ACK); // 30
b = i2c_read(ACK); // 31
c = i2c_read(ACK); // 32
d = i2c_read(NACK); // 33 last byte must NACK
i2c_stop();
}
}
//#############################################################################
// Чтение данных АЦП (FOSP01-A)
//_____________________________________________________________________________
unsigned int fosp01RxValue(unsigned char n)
{
unsigned char ret, HighTemp, LowTemp;
unsigned int temp;
ret=i2c_start(fospADC_ADR|W); // ADC device write address 0xEE
if(ret)
{
// failed to issue start condition, possibly no device found
i2c_stop();
}
else
{
i2c_write(0xff);
i2c_write(n); // Pressure(0xF0), Temperature(0xE8)
i2c_stop();
delay_ms(50);
i2c_start(fospADC_ADR|W); // ADC device write address 0xEE
i2c_write(0xfd);
i2c_rep_start(fospADC_ADR|R); // ADC device read address 0xEF
HighTemp=i2c_read(ACK);
LowTemp=i2c_read(NACK);
temp = (((unsigned int)HighTemp)<<8) + LowTemp;
i2c_stop();
}
return temp;
}
//#############################################################################
// Вычисление температуры и атмосферного давления
// с учетом калибровочных коэффициентов
// input -> D1,D2,C1---C7,A,B,C,D
// output -> Press, unit: 0.01 hpa
// Temp, unit: 0.1 C
//_____________________________________________________________________________
void PressureTemperatureMeasure(void)
{
double dUT;
double off, sens, x; // offset, sensivity
unsigned long SumValueAD=0;
port |= (1<<XCLR);
__delay_cycles(1000);
d1 = fosp01RxValue(PRESSURE); // measured pressure
SumValueAD += d1;
d1 = fosp01RxValue(PRESSURE);
SumValueAD += d1;
d1 = fosp01RxValue(PRESSURE);
SumValueAD += d1;
d1 = fosp01RxValue(PRESSURE);
SumValueAD += d1;
d1 = SumValueAD >>2;
d2 = fosp01RxValue(TEMPERATURE); // measured temperature
// d1=40506;
// d2=29136;
port &= ~(1<<XCLR);
printf_P("\n\r Измеренное абсолютное давление D1: %u", d1);
printf_P("\n\r Измеренная температура возле датчика D2: %u", d2);
if(d2 >= c5) dUT = (d2-c5) - (((d2-c5)/pow(2,7))*((d2-c5)/pow(2,7))*a)/pow(2,c);
else dUT = ((double)d2-c5) - (((double)d2-c5)/pow(2,7))*(((double)d2-c5)/pow(2,7))*b/pow(2,c);
t = (250 + ((dUT*c6)/pow(2,16)) - dUT/pow(2,d))/10; // calculate final temperature value ( C)
//OFF = (C2+(C4-1024)*DUT/Get2_x(14))*4;
off = (c2+(c4-1024)*dUT/pow(2,14))*4; // calculate offset
//SENS = C1+C3*DUT/Get2_x(10);
sens = c1+(c3*dUT)/pow(2,10); // calculate sensivity
//X = SENS*(D1-7168)/Get2_x(14)-OFF;
x = (sens*(d1-7168))/pow(2,14)-off;
//Press = X*100/Get2_x(5)+C7*10;
p = ((x*100/pow(2,5)+c7*10)/100)*mm_rt_st; // calculate final pressure value (мм. рт. ст.)
printf_P("\n\r Пересчитанное абсолютное давление : %f, мм. рт. ст.", p);
printf_P("\n\r Пересчитанная температура возле датчика: %f, C", t);
}
//=============================================================================
void calculate(void)
{
delay_ms(50);
fosp01RxCoeff();
while(1)
{
PressureTemperatureMeasure();
delay_ms(1000);
}
}
Я все же склоняюсь к мысли, что проблема в самих датчиках (FOSP01A). Не зря же их заменили на HP03.
я считал так:
d1 = FOSP01RxValue(0xf0);
d2 = FOSP01RxValue(0xe8);
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);
t = 250+dut*c6/65536;
Ts.tek=t;//numbers(35,1,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;
p = p*75006/100000;
Da.tek=p/10;//numbers(35,5,0,p/10);
в свое время пробовал три варианта из разных даташитов, остановился на этом, почему непомню, попробуй может поможет.
bullit
Mar 22 2008, 20:13
А что если его тактировать с выхода Меги(другого МК), но не с осцилятора напрямую, а с выхода таймера? Т.е. дать ему не синусойду, а меандр? Он ведь будет тактироваться?
Или может буфер на операционике собрать OPA364 ?
И как решились проблемы с расчётом давления?
Цитата(bullit @ Mar 22 2008, 23:13)

А что если его тактировать с выхода Меги(другого МК), но не с осцилятора напрямую, а с выхода таймера? Т.е. дать ему не синусойду, а меандр? Он ведь будет тактироваться?
Ничего не мешает тактировать FOSP01A с "родного" МК генерацией тактовой частоты от таймера. Такая схема включения приведена в документации на HP-03.
Цитата(bullit @ Mar 22 2008, 23:13)

И как решились проблемы с расчётом давления?
Меня пока устраивают показания от ASDX-DO. Но не устраивают его цена, размеры, ток потребления и напряжение питания +5В. Скоро должны прислать HP-03. Тогда буду продолжать эксперименты с датчиками.
Есть вопросы по датчику HP03 (аналог FOS01) читаю температуру вроде похожа а вот давление выдаёт 1000 мм рт ст
это как то много для моск обл однако
вроде ресет делаю перед считыванием хрень какая то где копать ?
может кто знает что куда ?
до этого ваще как в постах выше читался ноль но с нулями разобрался вопрос в ресете был перед считыванием данных.
Цитата(K19 @ May 24 2008, 21:54)

Есть вопросы по датчику HP03 (аналог FOS01) читаю температуру вроде похожа а вот давление выдаёт 1000 мм рт ст
это как то много для моск обл однако
вроде ресет делаю перед считыванием хрень какая то где копать ?
может кто знает что куда ?
до этого ваще как в постах выше читался ноль но с нулями разобрался вопрос в ресете был перед считыванием данных.
Значение меняется или постоянно 1000 мм рт ст?
Каким образом в мм рт ст переводите?
Цитата(sls_ @ May 26 2008, 08:37)

Значение меняется или постоянно 1000 мм рт ст?
Каким образом в мм рт ст переводите?
значение полученное из девайса меняется и реагирует на воздействие
расчитываю по форммуле как написанно в мануале
подставив контрольные данные из примера результат совпадает с примером
Цитата(K19 @ May 26 2008, 12:57)

значение полученное из девайса меняется и реагирует на воздействие
расчитываю по форммуле как написанно в мануале
подставив контрольные данные из примера результат совпадает с примером
умножение на 0,75006 присутствует?
посмотрел шит на HP03, не увидел там перевода в мм рт ст, давление там в hpa, чтобы перевести в мм рт ст нужно домножить на 0.750062
Цитата(sls_ @ May 26 2008, 14:20)

умножение на 0,75006 присутствует?
посмотрел шит на HP03, не увидел там перевода в мм рт ст, давление там в hpa, чтобы перевести в мм рт ст нужно домножить на 0.750062
о спасибо огромное!!
видимо в этом и есть моя ошибка
более менее стало похоже
Цитата(K19 @ May 24 2008, 20:54)

Есть вопросы по датчику HP03 (аналог FOS01) читаю температуру вроде похожа а вот давление выдаёт 1000 мм рт ст
Цитата(sls_ @ May 26 2008, 14:20)

умножение на 0,75006 присутствует?
посмотрел шит на HP03, не увидел там перевода в мм рт ст, давление там в hpa, чтобы перевести в мм рт ст нужно домножить на 0.750062
У меня такая проблема была с FOSP01A. Причем с двумя датчиками. Температуру более-менее точно выдавало. А вот давление выдавало завышенное - около 950-1000 мм.рт.ст. Перевожу в мм.рт.ст. правильно (умножаю результат на 0,75006). Ошибки в расчетах не было. Потратил уйму времени, пока не заменил на HP-03. У меня конструктивно датчики выведены на разъем. Аппаратно и программно они совместимы. Датчик HP-03 работает отлично. Проблема оказалась в самих датчиках FOSP-03A. Из этого я сделал вывод, что FOSP-01A - первая неудачная поделка, которую китайцы срочно заменили на HP-03.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.