|
FOSP01 - датчик атмосферного давления и температуры, Скачут показания |
|
|
|
Mar 5 2007, 12:26
|
Участник

Группа: Участник
Сообщений: 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); }
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 36)
|
Mar 6 2007, 09:11
|
Участник

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

|
Док на мой взглят скромный очень, вот он:
FOSP01.pdf ( 115.68 килобайт )
Кол-во скачиваний: 738
Сообщение отредактировал sls_ - Mar 6 2007, 09:12
|
|
|
|
|
Apr 19 2007, 08:45
|
Участник

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

|
Времени не было написать, разобрался, ошибка: два байта в которые читаю значения с датчика должны быть беззнаковые (unsigned char b1,b2;), соответственно в функции чтения значений и коеффициентов.
|
|
|
|
|
May 5 2007, 06:06
|
Знающий
   
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 7 2007, 05:28
|
Участник

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

|
Цитата(alux @ May 5 2007, 10:06)  По-моему должно быть наоборот : d1 = FOSP01RxValue(0xf0); // pressure d2 = FOSP01RxValue(0xe8); // temperature согласен.
|
|
|
|
|
May 14 2007, 02:44
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 16 2007, 01:37
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
May 17 2007, 01:38
|
Участник

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

|
Цитата(bullit @ May 16 2007, 17:46)  Что за тип искал? И как там с заявленными точностями по давлению? Дает точность? Тип - ошибка в коде писал о ней выше (с чего собсно тема началась) На наших высотах точность соответствует, на границах пока проверить не удалось.
|
|
|
|
|
Aug 28 2007, 14:47
|
Знающий
   
Группа: Свой
Сообщений: 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 висят еще пару устройств. Читаю, пишу в них без проблем. В чем может быть проблема? Ну не может же датчик не работать наполовину! Или может?
|
|
|
|
|
Aug 29 2007, 06:56
|
Участник

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

|
Цитата(alux @ Aug 28 2007, 23:12)  Попробовал на другом датчике (FOSP01A). Та же фигня.  Температура и давление=0. Прошу помощи в данной проблеме. Исчерпал все варианты.  Здравствуйте alux! Бегло просмотрев Ваш исходник, не нашол в нем сброса датчика, который на сколько я помню его и запускает. Что то типа этого: void FOSP01Reset(void) { bXCLR = 0; I2c_dly (); bXCLR = 1; }
|
|
|
|
|
Aug 29 2007, 07:24
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(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.
|
|
|
|
|
Aug 29 2007, 11:58
|
Участник

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

|
Дело есть, времяни нет .... Цитата(alux @ Aug 29 2007, 11:24)  В даташите ничего не сказано про длительность импульса сброса. Пробовал разные. Или импульс сброса надо давать перед КАЖДЫМ преобразованием? Нет достаточно один раз сбросить. На мой взгляд три варианта: 1. не проходит сброс 2. нет частоты (не та частота) на MCLK 3. брак
|
|
|
|
|
Aug 29 2007, 12:29
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(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пФ). Может из-за этого микросхема выдает пониженную частоту , и АЦП не хочет запускаться?
|
|
|
|
|
Aug 29 2007, 13:27
|
Участник

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

|
1. врятли, у меня одного раза хватило. 2. возможно перепутано oscout и oscin, по моему коэффициенты считываются из какой то внутренней флехи и частота там не нужна. 3. да наверно, хотя если брак то как правило вся партия целиком. В программе не увидел ничего криминального, единственное не очень понял реализацию сброса.
|
|
|
|
|
Aug 29 2007, 14:26
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(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(выход осциллятора). ТА ЖЕ ФИГНЯ!!!
|
|
|
|
|
Aug 29 2007, 17:37
|

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

|
Вроде код нормальный. Цитата 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 и двумя кондерами.
|
|
|
|
|
Feb 2 2008, 09:05
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Проблема решена частично. Датчик заработал. Но выдает завышенное атмосферное давление. 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.
|
|
|
|
|
Feb 4 2008, 09:41
|
Участник

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

|
я считал так:
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);
в свое время пробовал три варианта из разных даташитов, остановился на этом, почему непомню, попробуй может поможет.
|
|
|
|
|
Apr 7 2008, 10:33
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(bullit @ Mar 22 2008, 23:13)  А что если его тактировать с выхода Меги(другого МК), но не с осцилятора напрямую, а с выхода таймера? Т.е. дать ему не синусойду, а меандр? Он ведь будет тактироваться? Ничего не мешает тактировать FOSP01A с "родного" МК генерацией тактовой частоты от таймера. Такая схема включения приведена в документации на HP-03. Цитата(bullit @ Mar 22 2008, 23:13)  И как решились проблемы с расчётом давления? Меня пока устраивают показания от ASDX-DO. Но не устраивают его цена, размеры, ток потребления и напряжение питания +5В. Скоро должны прислать HP-03. Тогда буду продолжать эксперименты с датчиками.
|
|
|
|
|
May 24 2008, 17:54
|
Группа: Новичок
Сообщений: 4
Регистрация: 4-02-08
Пользователь №: 34 749

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

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

|
Цитата(K19 @ May 24 2008, 21:54)  Есть вопросы по датчику HP03 (аналог FOS01) читаю температуру вроде похожа а вот давление выдаёт 1000 мм рт ст это как то много для моск обл однако вроде ресет делаю перед считыванием хрень какая то где копать ? может кто знает что куда ? до этого ваще как в постах выше читался ноль но с нулями разобрался вопрос в ресете был перед считыванием данных. Значение меняется или постоянно 1000 мм рт ст? Каким образом в мм рт ст переводите?
|
|
|
|
|
May 26 2008, 08:57
|
Группа: Новичок
Сообщений: 4
Регистрация: 4-02-08
Пользователь №: 34 749

|
Цитата(sls_ @ May 26 2008, 08:37)  Значение меняется или постоянно 1000 мм рт ст? Каким образом в мм рт ст переводите? значение полученное из девайса меняется и реагирует на воздействие расчитываю по форммуле как написанно в мануале подставив контрольные данные из примера результат совпадает с примером
|
|
|
|
|
May 26 2008, 11:20
|
Участник

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

|
Цитата(K19 @ May 26 2008, 12:57)  значение полученное из девайса меняется и реагирует на воздействие расчитываю по форммуле как написанно в мануале подставив контрольные данные из примера результат совпадает с примером умножение на 0,75006 присутствует? посмотрел шит на HP03, не увидел там перевода в мм рт ст, давление там в hpa, чтобы перевести в мм рт ст нужно домножить на 0.750062
|
|
|
|
|
May 26 2008, 11:27
|
Группа: Новичок
Сообщений: 4
Регистрация: 4-02-08
Пользователь №: 34 749

|
Цитата(sls_ @ May 26 2008, 14:20)  умножение на 0,75006 присутствует? посмотрел шит на HP03, не увидел там перевода в мм рт ст, давление там в hpa, чтобы перевести в мм рт ст нужно домножить на 0.750062 о спасибо огромное!! видимо в этом и есть моя ошибка более менее стало похоже
|
|
|
|
|
Jun 30 2008, 05:39
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|