Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Въпрос за термометър (PIC)
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=3728
Страница 1 от 2

Автор:  Иво [ Чет Фев 15, 2007 12:48 pm ]
Заглавие:  Въпрос за термометър (PIC)

Здравейте, ползвам PIC16F870 и LM335. Ето я програмата:
Код:
#include <16F870.h>
#device adc=10
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,WRT,PUT
#use delay(clock=20000000)

#include <LCD.C>

#define green PIN_C2
#define red   PIN_C3

void main()
{
int adc_val;
float temp;

lcd_init();
setup_adc_ports( RA0_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
delay_ms(50);

   while(TRUE)
   { temp=(read_adc()*0.48828)-273.15;
     printf(LCD_PUTC, "\fIn  %f",temp);
     delay_ms(500);   
   };
}


Формулата temp=(read_adc()*0.48828)-273.15 я видях от един форум, обаче не е много точна. Лошото е, че температурата се извежда през 0.5C, а при по високи стойности на променливата пак се мени през 0.5, но не на кръгла стойност (примерно 48.1, 48.6, 49,1...). Как може да се направи да работи с точност 0.1C ?

Благодаря предварително !

Автор:  valioman [ Чет Фев 15, 2007 4:50 pm ]
Заглавие:  Re: Въпрос за термометър (PIC)

ЗАщо делиш измерената стойнос на 2 т.е(read_adc()*0.488...) си е почти делене на две .
Точността ти идва от датчика т.е. моя въпрос е .
Как се именя напрежението от него в зависимост от температурата опитно...
и пробвай да зададеш опорно напрежение на пика Vref и мери в по тесни граници.

Така ще получиш по голяма точност мисля....

Автор:  Иво [ Чет Фев 15, 2007 8:30 pm ]
Заглавие: 

Здрасти, може би темата е а раздел Академия, оправих се ;) Промених #device ADC=16 за да връща резултата в 16 битов INT и после делих на 1023 (макс. стойност) и температурата излезе почти точна. Малкото разминаване от няколко десети оправих като просто коригирах резултата, който се извежда на LCD .

Автор:  Иво [ Чет Фев 15, 2007 8:51 pm ]
Заглавие: 

Дааа... Обаче се оказва, че не е така. Сега при промяна на околната температура с 5 градуса/C, показанията се променят с 0.1....

Автор:  [ Чет Фев 15, 2007 10:19 pm ]
Заглавие: 

Пробвай с едно (float) пред read_adc()

Автор:  Иво [ Чет Фев 15, 2007 11:27 pm ]
Заглавие: 

Здрасти, сложих (float), но нищо не се промени. Отново мери през 0.5 C.

Код:
while(TRUE)
   { temp=((float) read_adc()*0.48828)-273.15;
     printf(LCD_PUTC, "\fIn  %f",temp);
     delay_ms(500);   
   };

Автор:  [ Пет Фев 16, 2007 12:55 am ]
Заглавие: 

Ако използваш 5V за опорно напрежение, при 10-битово АЦП, се получава разделителна способност от 4,88mV. При положение, че LM335 генерира на изхода си 10mV/C, то на 0,5C ще е 5mV, или приблизително колкото ти е разделителната способност на АЦП-то.

Има 2 начина да увеличиш разделителната способност: софтуерен и хардуерен.

Софтуерния е да направиш множество измервания, примерно 1024, като сумираш резултата след всяко измерване в 32-битово цяло число. След 1024 измервания, на теория, ще имаш резултат като от 20 битово АЦП. На практика обаче не е така. Чрез софтуерно увеличаване на разредността на АЦП-то можеш да го направиш най-много до 13-14 битово. Но и това е достатъчно, защото при 14-битово АЦП и 5V опорно напрежение ще получиш за тегло на 1 бит 0,610mV, което е по-малко от 1/10 от напрежението, което генерира LM335 при промяна на температурата с 1C.

Хардуерния начин е описан много подробно в "Designing With The LM335 Temperature Sensor", by Mark E. Nurczyk, списание "Circuit Cellar", мисля от Feb 1992. Виж си PM.

Автор:  SpeedyX [ Сря Фев 28, 2007 8:14 pm ]
Заглавие: 

Ако мериш няколко пъти (oversampling), ще е по-добре, и да не забравиш dead band...

Код:
unsigned long int reade_adc(void){
   unsigned long int adc_c=0;
   unsigned int32 adc_total=0;
   
   for (adc_c=0;adc_c<VreadingQ;adc_c++)  {restart_wdt(); adc_total+=read_adc();};
   
   return(dead_band(adc_total));
}


Код:
unsigned long int dead_band(unsigned int32 toplam){
   unsigned long int x;          // return value
   unsigned int32 VMaxCounter;   // total max value
   float DeltaQuant;             // broi za Quanting
   float y;
   
   VmaxCounter =(int32)VreadingQ*(int32)1023;    // max 4islo
   DeltaQuant=(float)VmaxCounter/(float)(Vmax/Vres);
   
   x=toplam/DeltaQuant;
   y=(toplam-x*DeltaQuant)/DeltaQuant;       // deadband
   
      if(y<0.3)   {  Vxold=x;     return(x+1);     }
      if(y>0.7)   {  Vxold=x+1;   return(x+2);   }
     
      if(Vxold<=x){  Vxold=x;     return(x+1);     }
      else        {  Vxold=x+1;   return(x+2);   }
}


и дефинициите :
Код:
#define VreadingQ  1024         // max sampling
#define Vmax 5                  // (Vin/Vout) * VREF
#define Vres 0.0048828125       // resulation
unsigned long int Vxold = 0;    // v Dead bant za nula


значи рутина за измерването ще е:
Код:
      set_adc_channel(Podhodq6tKanal); delay_us(30);
      ResultX=(float)(reade_adc()*Vres);
      printf(lcd_data," (%2.2fV)    ",ResultX);


и за по-добрo измерване, забавим АЦП-то
Код:
   setup_adc_ports(sAN0|VREF_VREF);
   setup_adc(ADC_CLOCK_DIV_64);


Ако правиш ето така, с 10 битов ацп, можеш да получиш 12,13 битовa информация.

Иво написа:
Как може да се направи да работи с точност 0.1C ?

Така, както ти написа програма, не може да стане това. трябва да използваш Vref пиновете, и търси за "Ratiometric Measurement" и ако искаш да напредваш повече, ще прочетеш за "auto range" ;)

Автор:  sthx [ Сря Фев 28, 2007 9:56 pm ]
Заглавие: 

Toва статистическо увеличаване на рарешаващата способност на АЦП е хитринка, която се получава благодарение на шумовете на сигнала и на самото АЦП. Аз също съм ползват тази хватка, но практиката ми показва, че е ефективна само за увеличаване на разрешаващата способност с 1 разряд. Не ми се вярва от 10 битово АЦП да се получи 14 битово.

Автор:  ji4ka [ Сря Фев 28, 2007 10:55 pm ]
Заглавие: 

Цитат:
Как може да се направи да работи с точност 0.1C ?


Ами не може! Дори и да го изпишеш някак си на дисплея показанието просто няма да е вярно. Самия датчик не е разчетен за такава точност. А и да е разчетен ,съмнявам се ,че ще можеш да го калибрираш да показва реалната температура. Точност 0.5С си е максималната за тоя хардуер дето ползваш.

Автор:  sthx [ Сря Фев 28, 2007 11:18 pm ]
Заглавие: 

Не ми се искаше да засягам въпроса с точността на измерване, но ще подкрепя жичката. Може и да се направи показанието да се изменя през 0.1 градуса, но това едва ли ще е вярно. Калибрирането на такъв термометър е сериозен проблем. Виж - за домашно ползване става. 8)

Автор:  SpeedyX [ Чет Мар 01, 2007 12:16 am ]
Заглавие: 

sthx написа:
Toва статистическо увеличаване на рарешаващата способност на АЦП е хитринка, която се получава благодарение на шумовете на сигнала и на самото АЦП. Аз също съм ползват тази хватка, но практиката ми показва, че е ефективна само за увеличаване на разрешаващата способност с 1 разряд. Не ми се вярва от 10 битово АЦП да се получи 14 битово.


Enhancing ADC resolution by oversampling (Atmel)
http://www.atmel.com/dyn/resources/prod ... oc8003.pdf

Автор:  sthx [ Чет Мар 01, 2007 10:47 pm ]
Заглавие: 

Mнооого готина табличка. Просто на човек му удва на сърце да я допълни до 24 битово АЦП. И да се чуди що се правят все още АЦП-та като схеми и да смята отношението на цените на 1 пин на процесорчето и едно АЦП. Хартията и без това търпи всичко. Чел съм българска статия по проблема, но авторът и нямаше такъв оптимизъм. Ето още едно оптимистично решение на Analog Devices :

http://mcu-bg.com/mcu_site/viewtopic.php?t=2790

Moята практика е следната. Ползвах 8 битово АЦП. Правех 256 измервания и делях на 128. Така получавах 9-битово АЦП, което не ми създаваше проблеми. Когато се опитах да го вдигна на 10-битово, започна да се наблюдава прескачане на стойности. Ако някой има практика с тоя род шмекерлъци, нека да сподели.

Автор:  [ Чет Мар 01, 2007 11:44 pm ]
Заглавие: 

Точно LM335, захранен с токов генратор (0.5mA), измерване с 10-bit ADC на PIC18F2520, правя oversampling до 14-bit ADC и няма никакви прескачания в показанията, Vref=4.096V, без ОУ, през НЧФ RC филтър директно на входа на ADC-то, 1/10 от градуса резолюция на дисплея.

Като си доближа ръката на около 3-4 см от сензора и показанието на дисплея веднага мръдва с 2-3 десети от градуса.

Калибровка с метода на "мишницата" :D - сензора под мишница за 4-5 минути, телесната ми температура е 36,4C ( ако не съм нещо настинал ), коригирвам показанието ( чрез промяна на тока на токовия генератор ) докато дисплея покаже 36,4 без да се мандахерца. Все пак, когато реша да понастина, си меря телесната температура с класическия живачен термометър 8)

Автор:  sthx [ Пет Мар 02, 2007 9:36 am ]
Заглавие: 

Пирев, тебе съм те признал в много отношения. С това твое ново качество, би бил безценен инструмент в която и да е сериозна метрологична служба. Даже съм чувал от докторите, че аналният метод е по-точен от метода под мишницата и с него вероятно би хванал и стотна от градуса. Но това вероятно ще се докаже от компетентните специалисти след многобройни тестове. :D
Пак от лекари съм чувал, че на по-обикновените хора температурата се мени циклично в денонощието и зависи от много фактори.
По света се продават и други симулатори на температура и температурни датчици, но обикновено не достигат точностите, които си достигнал.
http://www.fluke.nl/comx/show_product.a ... &pid=23623
http://www.fluke.nl/comx/show_product.a ... &pid=19351
http://www.shopping.com/xFS?KW=Fluke+724&CLT=SCH
http://www.shopping.com/xFS?KW=Fluke+744&CLT=SCH

Аз определено не вярвам на себе си , та камо ли да разчитам на телесната си температура и затова използвам стари бабешки методи за калибрация.
Определено на полупроводников датчик не мога да разчитам за по-отговорни приложения, най-малкото поради по-големия ефект на стареене при полупроводниците. Предпочитам да използвам терморезистори от вида Pt100 и Pt1000. Тези, които се продават масово са с клас на точност +/-0.3 градуса при нула градуса по целзии. Явно е необходима калибровка, като всеки датчик си върви с термометъра. Калибровката я правя в 2 точки, защото за повече ме мързи , а да калибрирам само в една точка ми се струва несериозно.
Относно разредността , която може да се получи от АЦП-то, чрез метода на осредняване на голямо количество резултати. Тука има един парадокс. Колкото са повече флуктуациите, толкова по-голяма разрешаваща способност можеш да докараш. Ако АЦП-то, опорният източник и източника на сигнала са ти идеални, то всички резултати ще са едни и същи и кокото измервания да правиш, няма да постигнеш по-голяма разрешаваща способност. Явно в моя случай шумките са били по-малко и е трябвало да вкарам някак си повече смущения, за да постигна по-добър резултат. 8)

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/