Отговори на тема  [ 26 мнения ]  Отиди на страница 1, 2  Следваща
Въпрос за термометър (PIC) 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 06, 2005 3:08 pm
Мнения: 98
Местоположение: София
Мнение Въпрос за термометър (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 ?

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


Чет Фев 15, 2007 12:48 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение Re: Въпрос за термометър (PIC)
ЗАщо делиш измерената стойнос на 2 т.е(read_adc()*0.488...) си е почти делене на две .
Точността ти идва от датчика т.е. моя въпрос е .
Как се именя напрежението от него в зависимост от температурата опитно...
и пробвай да зададеш опорно напрежение на пика Vref и мери в по тесни граници.

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


Чет Фев 15, 2007 4:50 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 06, 2005 3:08 pm
Мнения: 98
Местоположение: София
Мнение 
Здрасти, може би темата е а раздел Академия, оправих се ;) Промених #device ADC=16 за да връща резултата в 16 битов INT и после делих на 1023 (макс. стойност) и температурата излезе почти точна. Малкото разминаване от няколко десети оправих като просто коригирах резултата, който се извежда на LCD .


Чет Фев 15, 2007 8:30 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 06, 2005 3:08 pm
Мнения: 98
Местоположение: София
Мнение 
Дааа... Обаче се оказва, че не е така. Сега при промяна на околната температура с 5 градуса/C, показанията се променят с 0.1....


Чет Фев 15, 2007 8:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Пробвай с едно (float) пред read_adc()

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Фев 15, 2007 10:19 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Чет Окт 06, 2005 3:08 pm
Мнения: 98
Местоположение: София
Мнение 
Здрасти, сложих (float), но нищо не се промени. Отново мери през 0.5 C.

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


Чет Фев 15, 2007 11:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Ако използваш 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.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Фев 16, 2007 12:55 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Съб Май 27, 2006 12:42 am
Мнения: 14
Мнение 
Ако мериш няколко пъти (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" ;)


Сря Фев 28, 2007 8:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Toва статистическо увеличаване на рарешаващата способност на АЦП е хитринка, която се получава благодарение на шумовете на сигнала и на самото АЦП. Аз също съм ползват тази хватка, но практиката ми показва, че е ефективна само за увеличаване на разрешаващата способност с 1 разряд. Не ми се вярва от 10 битово АЦП да се получи 14 битово.

_________________
Две плюс две е приблизително равно на четири. Факт!


Сря Фев 28, 2007 9:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Цитат:
Как може да се направи да работи с точност 0.1C ?


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


Сря Фев 28, 2007 10:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Не ми се искаше да засягам въпроса с точността на измерване, но ще подкрепя жичката. Може и да се направи показанието да се изменя през 0.1 градуса, но това едва ли ще е вярно. Калибрирането на такъв термометър е сериозен проблем. Виж - за домашно ползване става. 8)

_________________
Две плюс две е приблизително равно на четири. Факт!


Сря Фев 28, 2007 11:18 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

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


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


Чет Мар 01, 2007 12:16 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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

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

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

_________________
Две плюс две е приблизително равно на четири. Факт!


Чет Мар 01, 2007 10:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Точно 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)

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Мар 01, 2007 11:44 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Пирев, тебе съм те признал в много отношения. С това твое ново качество, би бил безценен инструмент в която и да е сериозна метрологична служба. Даже съм чувал от докторите, че аналният метод е по-точен от метода под мишницата и с него вероятно би хванал и стотна от градуса. Но това вероятно ще се докаже от компетентните специалисти след многобройни тестове. :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)

_________________
Две плюс две е приблизително равно на четири. Факт!


Пет Мар 02, 2007 9:36 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 26 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 31 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни