DS18B20, ana bilgisayarla iletişim kurmak için tek bir veri yolu zamanlaması kullanan bir dijital sıcaklık sensörüdür. Sadece 1 Sıcaklık verisi okumasını tamamlamak için kabloya ihtiyaç vardır;
DS18B20, kolay tanımlama için yerleşik bir 64 bit ürün seri numarasına sahiptir. Birden fazla DS18B20 sensörü bağlanabilir 1 Tel, ve 64 bit kimlik doğrulama yoluyla, farklı sensörlerden toplanan sıcaklık bilgileri ayrı ayrı okunabilir.
DS18B20'ye Giriş
2.1 DS18B20'nin ana özellikleri
1. Tamamen dijital sıcaklık dönüşümü ve çıkışı.
2. Gelişmiş tek veri yolu veri iletişimi.
3. 12 bit'e kadar çözünürlük, ±0,5 santigrat dereceye kadar doğrulukla.
4. 12 bit çözünürlükte maksimum çalışma döngüsü 750 milisaniye.
5. Parazit çalışma modu seçilebilir.
6. Algılama sıcaklığı aralığı –55° C ~+125° C (–67° F ~+257° F).
7. Dahili EEPROM, sıcaklık limiti alarm fonksiyonu.
8. 64-bit fotolitografi ROM, yerleşik ürün seri numarası, çoklu makine bağlantısı için uygun.
9. Çeşitli ambalaj formları, farklı donanım sistemlerine uyum sağlama.
2.2 DS18B20 pin işlevi
GND voltajı topraklaması;
DQ tek veri yolu;
VDD güç kaynağı voltajı;
NC boş pin;
2.3 DS18B20 çalışma prensibi ve uygulaması
DS18B20 sıcaklık algılama ve dijital veri çıkışı tek bir çip üzerinde tamamen entegre edilmiştir, bu yüzden daha güçlü bir anti-parazit yeteneğine sahiptir. Bir çalışma döngüsü iki bölüme ayrılabilir, yani sıcaklık tespiti ve veri işleme.
18B20'nin üç tür bellek kaynağı vardır. Bunlar: ROM salt okunur bellek, DS18B20ID kodunu saklamak için kullanılır; ilk 8 bitler tek satırlık seri kodudur (DS18B20 kodu 19H), aşağıdaki 48 bitler çipin benzersiz seri numarasıdır; son 8 bitler CRC kodudur (fazlalık kontrolü) yukarıdakilerin 56 bitkiler. Veriler üretim sırasında ayarlanır ve kullanıcı tarafından değiştirilemez. DS18B20'nin toplamı vardır 64 ROM parçaları.
RAM veri kaydı, dahili hesaplama ve veri erişimi için kullanılır, elektrik kesintisinden sonra veriler kaybolur, DS18B20'nin toplamı vardır 9 bayt RAM, her bayt 8 bitkiler. Birinci ve ikinci bayt, sıcaklık dönüşümünden sonraki veri değeri bilgisidir; üçüncü ve dördüncü baytlar kullanıcının EEPROM'unun ayna görüntüsüdür (sıcaklık alarm değeri depolaması için yaygın olarak kullanılır). Güç sıfırlandığında değeri yenilenecektir. Beşinci bayt, kullanıcının üçüncü EEPROM'unun ayna görüntüsüdür. 6., 7bu, ve 8. baytlar sayım kayıtlarıdır, Kullanıcıların daha yüksek sıcaklık çözünürlüğü elde etmelerini sağlayacak şekilde tasarlanmıştır. Bunlar aynı zamanda dahili sıcaklık dönüşümü ve hesaplaması için geçici depolama birimleridir.. 9. bayt ilk baytın CRC kodudur. 8 bayt. EEPROM, uzun süre saklanması gereken verileri depolamak için kullanılan kalıcı bir bellektir, üst ve alt sıcaklık alarm değerleri, ve doğrulama verileri. DS18B20'nin toplamı vardır 3 EEPROM parçaları, ve kullanıcının çalışmasını kolaylaştırmak için RAM'de ayna görüntüleri vardır.
DS18B20 varsayılan olarak 12 bit çözünürlük modunda çalışır. Dönüşümden sonra elde edilen 12 bitlik veriler, DS18B20'nin iki adet 8 bitlik RAM'inde saklanır. (ilk iki bayt). İlk 5 İkilideki bitler işaret bitleridir. Ölçülen sıcaklık şundan büyükse: 0, bunlar 5 bitler 0. Sadece ölçülen değeri şununla çarpın: 0.0625 gerçek sıcaklığı elde etmek için. Sıcaklık daha düşükse 0, bunlar 5 bitler 1. Ölçülen değerin ters çevrilmesi gerekiyor, tarafından eklendi 1, ve sonra çarpılır 0.0625 gerçek sıcaklığı elde etmek için. Veya sıcaklığı çıkarmak için bit işlemini kullanın: ondalık basamaklar alt kısmı kaplar 4 bitkiler, ve üstteki bitler tamsayı bitlerdir (Negatif sayılar dikkate alınmaz).
2.4 DS18B20 çip ROM talimat tablosu
1. ROM'u oku [33H] (onaltılık komut sözcüğü köşeli parantez içindedir).
Bu komut, veri yolu denetleyicisinin DS18B20'nin 64 bit ROM'unu okumasını sağlar. Bu komut yalnızca veriyolunda yalnızca bir DS18B20 olduğunda kullanılabilir.. Birden fazla bağlıysa, iletişim sırasında veri çakışmaları meydana gelecektir.
2. ROM'u bağla [55H]
Bu talimatın ardından denetleyici tarafından verilen 64 bitlik bir seri numarası gelir.. Otobüste birden fazla DS18B20 olduğunda, yalnızca denetleyici tarafından verilen seri numarasıyla aynı seri numarasına sahip çip yanıt verebilir, ve diğer çipler bir sonraki sıfırlamayı bekleyecek. Bu talimat tek çipli ve çok çipli bağlantı için uygundur.
3. Gemi odası [CCH]
Bu talimat çipin ROM koduna yanıt vermemesini sağlar. Tek otobüs durumunda, bu talimat zamandan tasarruf etmek için kullanılabilir. Bu talimat birden fazla çip bağlandığında kullanılırsa, veri çakışmaları meydana gelecek, hatalara yol açan.
4. ROM'da ara [F0H]
Çip başlatıldıktan sonra, arama talimatı, veri yoluna birden fazla çip bağlandığında tüm cihazların 64 bit ROM'unun eleme yoluyla tanımlanmasına olanak tanır.
5. Alarm Arama [HER BİRİ]
Birden fazla çip olması durumunda, alarm çipi arama talimatı yalnızca sıcaklığın TH'den yüksek veya TL'den düşük alarm koşulunu karşılayan çiplere yanıt verir. Çip kapatılmadığı sürece, sıcaklık tekrar ölçülüp alarm durumuna ulaşılana kadar alarm durumu sürdürülecektir.
6. Karalama Defteri Yaz [4EH]
Bu, RAM'e veri yazma talimatıdır. Daha sonra yazılan iki baytlık veri şu adreste saklanacaktır: 2 (Alarm RAM'inin TH'si) ve adres 3 (TL alarm RAM'i). Yazma işlemi bir sıfırlama sinyali ile sonlandırılabilir.
7. Scratchpad'i okuyun (RAM'den veri oku) [BEH]
Bu talimat RAM'den veri okuyacaktır, adresten başlayarak 0 ve adrese kadar 9, tüm RAM verilerinin okunmasının tamamlanması. Çip, sıfırlama sinyalinin okuma sürecini sonlandırmasını sağlar, yani, sonraki gereksiz baytlar okuma süresini azaltmak için göz ardı edilebilir.
8. Scratchpad'i kopyala (RAM verilerini EEPROM'a kopyala) [48H]
Bu komut, RAM'deki verileri EEPROM'a kaydeder, böylece güç kapatıldığında veriler kaybolmaz.. Çip EEPROM depolama işlemiyle meşgul olduğundan, denetleyici bir okuma zamanı aralığı gönderdiğinde, otobüs çıkışları “0”, ve depolama işi tamamlandığında, otobüs çıkacak “1”.
Parazit çalışma modunda, Bu talimatın yayınlanmasından hemen sonra güçlü bir çekme kullanılmalı ve çipin çalışmasını sürdürmek için en az 10 MS süreyle sürdürülmelidir..
9. T'yi dönüştür (sıcaklık dönüşümü) [44H]
Bu talimatı aldıktan sonra, çip bir sıcaklık dönüşümü gerçekleştirecek ve dönüştürülen sıcaklık değerini RAM'in 1. ve 2. adreslerinde saklayacak. Çip sıcaklık dönüştürme işlemiyle meşgul olduğundan, denetleyici bir okuma zamanı aralığı gönderdiğinde, otobüs çıkışları “0”, ve depolama işi tamamlandığında, otobüs çıkacak “1”. Parazit çalışma modunda, Bu talimatın yayınlanmasından hemen sonra güçlü bir çekme kullanılmalı ve çip çalışmasını sürdürmek için en az 500 MS süreyle sürdürülmelidir..
10. EEPROM'u geri çağır (EEPROM'daki alarm değerini RAM'e kopyalayın) [B8H]
Bu komut EEPROM'daki alarm değerini RAM'in 3. ve 4. baytlarına kopyalar.. Çip kopyalama işlemiyle meşgul olduğundan, denetleyici bir okuma zamanı aralığı gönderdiğinde, otobüs çıkışları “0”, ve depolama işi tamamlandığında, otobüs çıkışları “1”. Ek olarak, çip açıldığında ve sıfırlandığında bu talimat otomatik olarak yürütülecektir. Böylece, RAM'deki iki alarm bayt biti her zaman EEPROM'daki verilerin ayna görüntüsü olacaktır..
11. Güç Kaynağını Okuyun (Çalışma Modu Anahtarı) [B4H]
Bu talimat yayınlandıktan sonra, bir okuma süresi aralığı verilir, ve çip güç durumu kelimesini döndürecek. “0” asalak güç durumudur ve “1” harici güç durumudur.
2.5 DS18B20 Zamanlama Şeması
2.5.1 DS18B20 Sıfırlama ve Yanıt İlişki Şeması
Her iletişimden önce sıfırlama yapılmalıdır. Sıfırlama zamanı, bekleme süresi, ve yanıt süresi, zamanlamaya göre sıkı bir şekilde programlanmalıdır..
DS18B20 okuma ve yazma zaman aralığı: DS18B20 veri okuma ve yazma, bilgi alışverişi için zaman aralığı işleme biti ve komut sözcüğü ile onaylanır.
2.5.2 Veri yaz 0 ve veriler 1 DS18B20'ye
Veri yazma zaman aralığının ilk 15 uS'sinde, otobüsün kontrolör tarafından aşağı çekilmesi gerekiyor, ve sonra veri yolu verileri için çip örnekleme zamanı olacaktır. Örnekleme süresi 15~60uS. Kontrolör örnekleme süresi boyunca veri yolunu yükseğe çekerse, yazmak demek “1”, ve eğer kontrolör veriyolunu alçak seviyeye çekerse, yazmak demek “0”.
Her iletim biti en az 15uS'lik düşük seviyeli bir başlangıç bitine sahip olmalıdır, ve sonraki veriler “0” veya “1” 45uS içinde tamamlanmalıdır.
Tüm bitin iletim süresi 60~120uS'de tutulmalıdır, aksi takdirde normal iletişim garanti edilemez.
Not: DS18B20 düşük bitten veri okur ve yazar.
2.5.3 Veri okuma 0 ve veriler 1 DS18B20'den
Okuma süresi aralığı sırasında kontrolün örnekleme zamanı daha doğru olmalıdır. Okuma süresi boşluğu sırasında, Ana bilgisayarın ayrıca okuma süresinin başlangıcını belirtmek için en az 1uS'lik düşük bir seviye oluşturması gerekir.. Daha sonra, Otobüs serbest bırakıldıktan 15uS sonra, DS18B20 dahili veri bitini gönderecektir. Şu anda, kontrol veriyolunun yüksek olduğunu tespit ederse, okumak anlamına geliyor “1”, ve eğer otobüs alçaksa, veri okumak anlamına gelir “0”. Her bir parçayı okumadan önce, denetleyici bir başlatma sinyali ekler.
Not: Doğru iletişimi sağlamak için veri biti, okuma aralığının başlangıcından itibaren 15uS içerisinde okunmalıdır..
İletişim sırasında, 8 biraz “0” veya “1” bayt olarak kullanılır, ve baytın okunması veya yazılması düşük bitten başlar.
2.5.4 Sıcaklığı bir kez okuma sırası (otobüste yalnızca tek bir DS18B20)
1. Sıfırlama sinyali gönder
2. Yanıt sinyalini tespit et
3. 0xCC gönder
4. 0x44 gönder
5. Sıfırlama sinyali gönder
6. Yanıt sinyalini tespit et
7. 0xcc yaz
8. 0xbe yaz
9. Döngü 8 sıcaklığın düşük baytını okuma süreleri
10. Döngü 8 sıcaklığın yüksek baytını okuma süreleri
11. 16 bitlik sıcaklık verilerini sentezleyin ve işleyin
3. Sürücü kodu
3.1 DS18B20.c
#katmak “ds18b20.h”
/*
İşlev: DS18B20 başlatma
Donanım bağlantısı: PB15
*/
void ds18b20_init(geçersiz)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->CRH&=0x0FFFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //Çekişme
}
/*
İşlev: DS18B20 cihazının mevcut olup olmadığını kontrol edin
Dönüş değeri: 1 cihazın mevcut olmadığı anlamına gelir 0 cihazın normal olduğu anlamına gelir
*/
u8 DS18B20_CheckDevice(geçersiz) //Sıfırlama darbesi içerir, algılama darbesi
{
DS18B20_OUTPUT_MODE();//Çıkış moduna başlat
DS18B20_ÇIKIŞ=0; //Sıfırlama darbesi oluştur
GecikmeBiz(750); //750us düşük seviye üret
DS18B20_ÇIKIŞ=1; //Otobüsü serbest bırak
GecikmeBiz(15); //DS18B20 yanıtını bekleyin
eğer(DS18B20_CleckAck())//Varoluş darbesini tespit et
{
geri dönmek 1;
}
geri dönmek 0;
}
/*
İşlev: DS18B20 cihazının varlık darbesini tespit edin
Dönüş değeri: 1 hatayı gösterir 0 normal olduğunu gösterir
*/
u8 DS18B20_CleckAck(geçersiz)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//Giriş moduna başlat
sırasında(DS18B20_IN&&cnt<200) //DS18B20 yanıt varlığı darbesini bekleyin
{
GecikmeBiz(1);
cnt++;
}
eğer(cnt>=200)geri dönmek 1; //hata
cnt=0;
sırasında((!DS18B20_IN)&&cnt<240) //DS18B20'nin otobüsü serbest bırakmasını bekleyin
{
GecikmeBiz(1);
cnt++;
}
eğer(cnt>=240)geri dönmek 1; //hata
geri dönmek 0;
}
/*
İşlev: Bir bayt yaz
Önce biraz yazmayı öğren.
*/
void ds18b20_writebyte(u8 cmd)
{
u8 ben;
DS18B20_OUTPUT_MODE(); //Çıkış moduna başlat
için(ben=0;Ben<8;I ++)
{
DS18B20_ÇIKIŞ=0; //Yazma süresi boşluğu oluştur (yazmaya başla)
GecikmeBiz(2);
DS18B20_OUT=cmd&0x01; //Gerçek veri bitini gönder
GecikmeBiz(60); //Yazmanın tamamlanmasını bekleyin
DS18B20_ÇIKIŞ=1; //Otobüsü bırakın ve bir sonraki iletim için hazırlanın
cmd>>=1; //Sonraki veri bitini göndermeye devam et
}
}
/*
İşlev: Bir bayt oku
Önce biraz okumayı öğren.
*/
u8 DS18B20_ReadByte(geçersiz)
{
u8 ben,veri=0;
için(ben=0;Ben<8;I ++)
{
DS18B20_OUTPUT_MODE(); //Çıkış moduna başlat
DS18B20_ÇIKIŞ=0; //Okuma süresi boşluğu oluştur (okumaya başla)
GecikmeBiz(2);
DS18B20_ÇIKIŞ=1; //Otobüsü serbest bırak
DS18B20_INPUT_MODE(); //Giriş moduna başlat
GecikmeBiz(8); //DS18B20 veri çıkışını bekleyin
veri>>=1; //Yüksek biti şununla doldurun: 0, varsayılan: 0
eğer(DS18B20_IN) veri|=0x80;
GecikmeBiz(60);
DS18B20_ÇIKIŞ=1; //Otobüsü serbest bırak, sonraki veri bitini okumayı bekle
}
verileri döndür;
}
/*
İşlev: DS18B20'nin sıcaklık verilerini bir kez okuyun
Dönüş değeri: sıcaklık verileri okundu
Dikkate alınan durum: Veri yoluna bağlı yalnızca bir DS18B20 var
*/
u16 DS18B20_ReadTemp(geçersiz)
{
u16 sıcaklığı=0;
u8 temp_H,sıcaklık_L;
DS18B20_CheckDevice(); //Sıfırlama darbesi gönder, nabzı tespit etmek
Ds18b20_writebyte(0XCC); //ROM dizisi algılamayı atla
Ds18b20_writebyte(0x44); //Sıcaklık dönüşümünü başlat
//Sıcaklık dönüşümünün tamamlanmasını bekleyin
sırasında(Ds18b20_readbyte()!=0xFF){}
DS18B20_CheckDevice(); //Sıfırlama darbesi gönder, nabzı tespit etmek
Ds18b20_writebyte(0XCC); //ROM dizisi algılamayı atla
Ds18b20_writebyte(0Xbe); //Sıcaklığı oku
temp_L=DS18B20_ReadByte(); //Düşük sıcaklık verilerini okuyun
temp_H=DS18B20_ReadByte(); //Yüksek sıcaklık verilerini okuyun
sıcaklık=temp_L|(sıcaklık_H<<8); //Sentezlenen sıcaklık
dönüş sıcaklığı;
}
3.2 DS18B20.h
#ifndef DS18B20_H
#DS18B20_H'yi tanımlayın
#katmak “stm32f10x.h”
#katmak “sistem.h”
#katmak “gecikme.h”
#katmak “ds18b20.h”
#katmak “Usart.h”
/*Paket arayüzü*/
//DS18B20'yi giriş moduna başlatın
#DS18B20_INPUT_MODE'u tanımlayın() {GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x80000000;}
//DS18B20'yi çıkış moduna başlat
#DS18B20_OUTPUT_MODE'u tanımlayın(){GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x30000000;}
//DS18B20 IO bağlantı noktası çıkışı
#DS18B20_OUT PBout'u tanımlayın(15)
//DS18B20 IO bağlantı noktası girişi
#DS18B20_IN PBin'i tanımlayın(15)
//İşlev bildirimi
u8 DS18B20_CleckAck(geçersiz);
u8 DS18B20_CheckDevice(geçersiz);
void ds18b20_init(geçersiz);
u16 DS18B20_ReadTemp(geçersiz);
u8 DS18B20_ReadByte(geçersiz);
void ds18b20_writebyte(u8 cmd);
#endif
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Gecikme fonksiyonu
/*
İşlev: Bizdeki gecikme
*/
geçersiz DelayUs(bizimle)
{
#ifdef _SYSTICK_IRQ_
ben,J;
için(ben=0;iVAL=0; //CNT sayaç değeri
SysTick->YÜK=9*biz; //9 1us anlamına gelir
SysTick->CTRL|=1<<0; //Zamanlayıcıyı başlat
Yapmak
{
tmp=SysTick->CTRL; //Durumu oku
}sırasında((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->DEĞ=0; //CNT sayaç değeri
SysTick->CTRL&=~(1<<0); //Zamanlayıcıyı kapat
#endif
};I ++)>
3.4 main.c Sıcaklığı okumak ve seri porta yazdırmak için DS18B20'yi arayın
#katmak “stm32f10x.h”
#katmak “ds18b20.h”
u8 DS18B20_ROM[8]; //DS18B20'nin 64 bit ROM kodunu saklayın
int ana(geçersiz)
{
u16 sıcaklığı;
USARTx_Heat(USART1,72,115200);//Seri portun başlatılması 1
Ds18b20_init(); //DS18B20 başlatma
/*1. DS18B20*/'nin 64 bit ROM kodunu okuyun
//Sıfırlama darbesi gönder, varoluş darbesini tespit etmek
sırasında(DS18B20_CheckDevice())
{
baskı(“DS18B20 cihazı mevcut değil!\N”);
GecikmeMs(500);
}
//64 bit ROM kodunu okumak için komutu gönderin
Ds18b20_writebyte(0x33);
//Döngü 64 bit ROM kodunu okur
için(ben=0;Ben<8;I ++)
{
DS18B20_ROM[Ben]= DS18B20_ReadByte();
baskı(“DS18B20_ROM[%D]=0x%Xn”,Ben,DS18B20_ROM[Ben]);
}
sırasında(1)
{
/*2. Sıcaklığı dönüştürmeye başlamak için veri yolu üzerindeki tüm DS18B20'yi aynı anda çalıştırın*/
DS18B20_CheckDevice(); //Sıfırlama darbesi gönder, nabzı tespit etmek
Ds18b20_writebyte(0XCC); //ROM dizisi algılamayı atla
Ds18b20_writebyte(0x44); //Sıcaklık dönüşümünü başlat (otobüsteki tüm DS18B20'lerin sıcaklığı dönüştürmesine izin verin)
GecikmeMs(500); //Hattaki tüm DS18B20 sıcaklık dönüşümlerinin tamamlanmasını bekleyin
/*3. Her DS18B20*/'nin sıcaklığının tek hedefli okunması
DS18B20_CheckDevice(); //Sıfırlama darbesi gönder, nabzı tespit etmek
Ds18b20_writebyte(0x55); //ROM'u eşleştirmek için komut gönder
için(ben=0;Ben<8;I ++) //64 bit kod gönder
{
Ds18b20_writebyte(DS18B20_ROM[Ben]);
}
Ds18b20_writebyte(0Xbe); //Sıcaklığı oku
sıcaklık=DS18B20_ReadByte(); //Düşük dereceli sıcaklık verilerini okuyun
sıcaklık|=DS18B20_ReadByte()<<8; //Yüksek dereceli sıcaklık verilerini okuyun
baskı(“temp1=%d.%dn”,sıcaklık>>4,sıcaklık&0xF);
baskı(“temp2=%fn”,sıcaklık*0,0625);
GecikmeMs(500);
}
}
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt







