DS18B20 yanlış ölçüyor

Başlatan serdararikan, 15 Temmuz 2014, 19:00:34

serdararikan

önceleri inanmamıştım ama gerçekten ds18b20 normalden 2-3 derece daha fazla ölçüyor.bununla ilgili çalışması olan arkadaş varmı?

baran123

Ben yaptım ama hiç gerçekteki sıcaklık ile kontrol etmedim cok göze batan bir fark yok gibi kodlarda veya kutuphanende problem olabilir sıcaklık olcumunu bu hobi malzemelerinde en iyi sht yapıyor dıye bılıyorum aklında bulunsun ama tahmınm o kadarda bır hata payı olabilir.

LukeSkywalker

Şu ana kadar gördüklerim doğru ölçüyorlardı. Civalı termometre ile karşılaştırdım.

serdararikan

örnek bir kodunuz varmı ??

header dosyası
#include<htc.h>

#define	TRIS_W	TRISEbits.TRISE1
#define	WIRE	PORTEbits.RE1

#define _XTAL_FREQ	64000000L

unsigned char SicaklikTam,SicaklikOndalik;
bit Sing;

extern void TempRead(void);

extern unsigned char onwire_reset(void);
extern unsigned char onwire_read_bit(void);
extern void onwire_write_bit(unsigned char veri);
extern unsigned char onwire_read_byte(void);
extern void onwire_write_byte(unsigned char data);
extern void DS18B20Init(void);



c dosyası
#include"DS1820.h"

unsigned char onwire_reset(void)
{
	unsigned char sonuc;
	WIRE=0;
	TRIS_W=0;
	__delay_us(500);
	TRIS_W=1;
	__delay_us(70);
	sonuc=WIRE;
	__delay_us(500);
	return (sonuc);
}

unsigned char onwire_read_bit(void)
{
	unsigned char veri;

	WIRE=0;
	TRIS_W=0;
	__delay_us(5);
	TRIS_W=1;
	__delay_us(10);
	if(WIRE)	veri=1;
	else		veri=0;	
	__delay_us(60);
	return (veri);
}

void onwire_write_bit(unsigned char veri)
{
	if(veri)
	{
		TRIS_W=0;
		WIRE=0,
		__delay_us(5);
		TRIS_W=1;
		__delay_us(60);
	}
	else
	{
		TRIS_W=0;
		WIRE=0,
		__delay_us(60);
		TRIS_W=1;
	}
}

unsigned char onwire_read_byte(void)
{
	unsigned char i,veri=0,bitler=1,tmp;
	for(i=0;i<8;i++)
	{
		tmp = onwire_read_bit();
		if(tmp == 1) 	veri|=bitler;
		bitler<<=1;
	}
	return veri;	
}

void onwire_write_byte(unsigned char data)
{
	unsigned char bitler=1,i;
	for(i=0;i<8;i++)
	{
		if(data & bitler)		onwire_write_bit(1);
		else 					onwire_write_bit(0);
		bitler<<=1;
	}
}

void DS18B20Init(void)
{
	while(onwire_reset());
	onwire_write_byte(0xCC);
	onwire_write_byte(0x4E);	
	onwire_write_byte(0x00);
	onwire_write_byte(0x00);
	onwire_write_byte(0b00011111);	//9bit çözünürlük
	while(onwire_reset());
}

void TempRead(void)
{
	unsigned char sayi1,sayi2;
	Sing = 0;
	while(onwire_reset());
	onwire_write_byte(0xCC);
	onwire_write_byte(0x44);
	for(char i=0;i<10;i++) __delay_ms(10);     //for(char i=0;i<75;i++) __delay_ms(10);
	while(onwire_reset());
	onwire_write_byte(0xCC);
	onwire_write_byte(0xBE);

	sayi2=onwire_read_byte();
	sayi1=onwire_read_byte();

	while(onwire_reset());

	SicaklikOndalik=0;
	SicaklikTam = (sayi1 << 4) + (sayi2 >> 4);
	if(SicaklikTam & 0x80)
	{
		Sing = 1;
		SicaklikTam = 0xff - SicaklikTam;
		sayi2 = ((sayi2 & 0x0F) ^ 0x0F) + 1;
		//if(sayi2 & 0x10) SicaklikTam++;
	}
	if(sayi2 & 0x08)	SicaklikOndalik = 50;
	if(sayi2 & 0x04)	SicaklikOndalik+= 25;
	if(sayi2 & 0x02)	SicaklikOndalik+= 12;
	if(sayi2 & 0x01)	SicaklikOndalik+=  6;
}


benim kullandığım kod bu


serdararikan

devreyi reel olarak denediniz yani??

LukeSkywalker

:) Güvenemediniz sanırım.  Hiç görmediysem en az 10 tane bu verdiğim dosyanın hayata geçmiş halini gördüm. Üstad bu sensör 3 derece gibi büyük bir farkla ölçüm yapıyor olsa adamlar piyasaya sürüp kendilerini rezil ederler mi? Dallas gibi bir firmadan bahsediyoruz. "The DS18B20 communicates over a 1-Wire bus that by definition requires only one data line (and ground) for communication with a central microprocessor. It has an operating temperature range of -55°C to +125°C and is accurate to ±0.5°C over the range of -10°C to +85°C"

serdararikan

Alıntı yapılan: LukeSkywalker - 15 Temmuz 2014, 20:32:54
Üstad bu sensör 3 derece gibi büyük bir farkla ölçüm yapıyor olsa adamlar piyasaya sürüp kendilerini rezil ederler mi? Dallas gibi bir firmadan bahsediyoruz.

aynen sizin gibi düşündüğüm için hatayı kendimde arıyorum.ancak verdiğiniz kod ile kendi kodumu karşılaştırdığımda aynı şeyleri yaptığımızı görüyorum.bugun benim termometre dahil 5 cihaz ile aynı ortamda ölçüm yaptık.sensor kutuda değildi bu arada.ve benimki diğerlerinin hepsinden 2 derece fazla ölçtü

quarko

Diğer 5 cihazın doğru ölçtüğü ne malum. Bence bir kalibratör ile denemelisin. Eğer diğer cihazların doğruluğundan emin isen önce onları kalibratör ile kontrol et sonra kendi cihazını o cihazlarlar kıyasla. Birde artık dallas firması kalmadı. DS18B20 artık maxim ic nin bir ürünü :)
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

LukeSkywalker

#9
Basindaki ds dallas firmasinin tasarimi oldugunu gosteriyor. Yoksa elektronikle ilgilenen çogu kisi maxim ve dallas hikayesini biliyordur.

mesaj birleştirme:: 15 Temmuz 2014, 22:45:57

http://en.m.wikipedia.org/wiki/Dallas_Semiconductor
Ayrica hala eski tasarim urunlerde dallas markasi kullaniliyormuş.

minicihazlar

Sensör eğer pcb üzerinde ise ve diğer devre elemanlarına yakınsa onların yaydığı ısıdan dolayı böyle bir durum oluşabiliyor. Benim ilk denememde pcb üzerinde ve işlemciye çok yakın koymuştum ve böyle hatalı okumalar olmuştu.