DS18B20 یک سنسور دما دیجیتال است که از یک زمان بندی باس برای برقراری ارتباط با میزبان استفاده می کند. فقط 1 سیم برای تکمیل خواندن داده های دما مورد نیاز است;
DS18B20 دارای شماره سریال محصول 64 بیتی داخلی برای شناسایی آسان است. چندین سنسور DS18B20 را می توان به آن متصل کرد 1 سیم, و از طریق احراز هویت 64 بیتی, اطلاعات دما جمع آوری شده از سنسورهای مختلف را می توان به طور جداگانه خواند.
مقدمه ای بر DS18B20
2.1 ویژگی های اصلی DS18B20
1. تبدیل و خروجی دما کاملا دیجیتال.
2. ارتباطات داده تک باس پیشرفته.
3. تا وضوح 12 بیت, با دقت تا 0.5± درجه سانتیگراد.
4. حداکثر چرخه کاری در وضوح 12 بیت است 750 هزارم ثانیه.
5. حالت کار انگلی را می توان انتخاب کرد.
6. محدوده دمای تشخیص -55 درجه سانتیگراد تا +125 درجه سانتیگراد است (–۶۷ درجه فارنهایت تا ۲۵۷+ درجه فارنهایت).
7. EEPROM داخلی, عملکرد زنگ محدودیت دما.
8. 64-رام فتولیتوگرافی بیتی, شماره سریال محصول داخلی, مناسب برای اتصال چند ماشین.
9. انواع فرم های بسته بندی, سازگاری با سیستم های سخت افزاری مختلف.
2.2 عملکرد پین DS18B20
زمین ولتاژ GND;
DQ تک گذرگاه داده;
ولتاژ منبع تغذیه VDD;
پین خالی NC;
2.3 اصل کار و کاربرد DS18B20
تشخیص دمای DS18B20 و خروجی داده دیجیتال به طور کامل روی یک تراشه یکپارچه شده است, بنابراین توانایی ضد تداخل قوی تری دارد. یک چرخه کاری آن را می توان به دو بخش تقسیم کرد, یعنی تشخیص دما و پردازش داده ها.
18B20 دارای سه نوع منبع حافظه است. آنها هستند: حافظه ROM فقط خواندنی, برای ذخیره کد DS18B20ID استفاده می شود; اولین 8 بیت ها کد سری تک خطی هستند (کد DS18B20 19H است), زیر 48 بیت ها شماره سریال منحصر به فرد تراشه هستند; آخرین 8 بیت ها کد CRC هستند (بررسی افزونگی) از موارد فوق 56 بیت ها. داده ها در زمان تولید تنظیم می شوند و توسط کاربر قابل تغییر نیستند. DS18B20 در مجموع 64 بیت های رام.
ثبت اطلاعات رم, برای محاسبه داخلی و دسترسی به داده ها استفاده می شود, داده ها پس از قطع برق از بین می روند, DS18B20 در مجموع 9 بایت رم, هر بایت است 8 بیت ها. بایت های اول و دوم اطلاعات ارزش داده پس از تبدیل دما هستند; بایت سوم و چهارم تصویر آینه ای EEPROM کاربر است (معمولاً برای ذخیره سازی مقدار هشدار دما استفاده می شود). با تنظیم مجدد برق، مقدار آن به روز می شود. بایت پنجم تصویر آینه ای سومین EEPROM کاربر است. 6, 7هفتم, و 8 بایت ثبت تعداد هستند, که به گونه ای طراحی شده اند که به کاربران امکان می دهد وضوح دمای بالاتری را بدست آورند. آنها همچنین واحدهای ذخیره موقت برای تبدیل و محاسبه دمای داخلی هستند. نهمین بایت کد CRC اولی است 8 بایت ها. EEPROM یک حافظه غیر فرار است که برای ذخیره داده ها استفاده می شود که باید برای مدت طولانی ذخیره شوند, مقادیر هشدار دمای بالا و پایین, و داده های تایید. DS18B20 در مجموع 3 بیت های EEPROM, و تصاویر آینه ای در RAM برای تسهیل عملکرد کاربر وجود دارد.
DS18B20 به طور پیش فرض در حالت وضوح 12 بیت کار می کند. داده های 12 بیتی به دست آمده پس از تبدیل در دو رم 8 بیتی DS18B20 ذخیره می شود. (دو بایت اول). اولین 5 بیت های باینری بیت های علامت هستند. اگر دمای اندازه گیری شده بیشتر از 0, اینها 5 بیت ها هستند 0. فقط مقدار اندازه گیری شده را در ضرب کنید 0.0625 برای بدست آوردن دمای واقعی. اگر دما کمتر از 0, اینها 5 بیت ها هستند 1. مقدار اندازه گیری شده باید معکوس شود, اضافه شده توسط 1, و سپس ضرب می شود 0.0625 برای بدست آوردن دمای واقعی. یا از عملیات بیت برای استخراج دما استفاده کنید: ارقام اعشار پایین تر را اشغال می کنند 4 بیت ها, و بیت های بالایی بیت های عدد صحیح هستند (اعداد منفی در نظر گرفته نمی شوند).
2.4 جدول دستورالعمل رام چیپ DS18B20
1. رام را بخوانید [33اچ] (کلمه فرمان هگزادسیمال در پرانتز است).
این دستور به کنترلر باس اجازه می دهد تا ROM 64 بیتی DS18B20 را بخواند. این دستورالعمل فقط زمانی قابل استفاده است که فقط یک DS18B20 در اتوبوس وجود داشته باشد. اگر بیش از یک متصل باشد, تضاد داده ها در طول ارتباط رخ می دهد.
2. رام را وصل کنید [55اچ]
این دستورالعمل توسط یک شماره سریال 64 بیتی صادر شده توسط کنترلر دنبال می شود. هنگامی که چندین DS18B20 در اتوبوس وجود دارد, فقط تراشه ای با همان شماره سریال صادر شده توسط کنترلر می تواند پاسخ دهد, و سایر تراشه ها منتظر تنظیم مجدد بعدی خواهند بود. این دستورالعمل برای اتصال تک تراشه و چند تراشه مناسب است.
3. رام را رد کنید [CCH]
این دستورالعمل باعث می شود تراشه به کد رام پاسخ ندهد. در مورد یک اتوبوس, از این دستورالعمل می توان برای صرفه جویی در زمان استفاده کرد. اگر این دستورالعمل زمانی که چند تراشه به هم متصل هستند استفاده می شود, تضاد داده ها رخ خواهد داد, منجر به خطا می شود.
4. جستجو در رام [F0H]
بعد از اینکه تراشه مقدار دهی اولیه شد, دستورالعمل جستجو اجازه می دهد تا ROM 64 بیتی همه دستگاه ها با حذف زمانی که چندین تراشه به گذرگاه متصل هستند شناسایی شود..
5. جستجوی زنگ هشدار [هر کدام]
در مورد تراشه های متعدد, دستورالعمل جستجوی تراشه زنگ هشدار فقط به تراشه هایی پاسخ می دهد که شرایط هشدار دمای بالاتر از TH یا کمتر از TL را دارند.. تا زمانی که تراشه خاموش نباشد, وضعیت هشدار تا زمانی که دما دوباره اندازه گیری شود و به شرایط هشدار نرسد حفظ می شود.
6. Scratchpad را بنویسید [4EH]
این دستورالعمل نوشتن داده در RAM است. دو بایت داده ای که متعاقباً نوشته می شود در آدرس ذخیره می شود 2 (TH رم زنگ هشدار) و آدرس 3 (TL رم زنگ هشدار). فرآیند نوشتن را می توان با یک سیگنال تنظیم مجدد خاتمه داد.
7. Scratchpad را بخوانید (خواندن اطلاعات از RAM) [BEH]
این دستورالعمل داده ها را از RAM می خواند, شروع از آدرس 0 و تا آدرس 9, تکمیل خواندن کل داده های RAM. تراشه به سیگنال ریست اجازه می دهد تا فرآیند خواندن را خاتمه دهد, این است, بایت های غیر ضروری بعدی را می توان نادیده گرفت تا زمان خواندن را کاهش دهد.
8. Scratchpad را کپی کنید (داده های RAM را در EEPROM کپی کنید) [48اچ]
این دستورالعمل دادههای RAM را در EEPROM ذخیره میکند تا در صورت قطع برق، دادهها از بین نرود.. از آنجایی که تراشه مشغول پردازش ذخیره سازی EEPROM است, هنگامی که کنترلر یک شکاف زمانی برای خواندن ارسال می کند, خروجی های اتوبوس “0”, و زمانی که کار ذخیره سازی به پایان رسید, اتوبوس خروجی خواهد داشت “1”.
در حالت کار انگلی, یک کشش قوی باید بلافاصله پس از صدور این دستورالعمل استفاده شود و حداقل 10MS برای حفظ عملکرد تراشه حفظ شود..
9. T را تبدیل کنید (تبدیل دما) [44اچ]
پس از دریافت این دستورالعمل, تراشه تبدیل دما را انجام می دهد و مقدار دمای تبدیل شده را در آدرس های 1 و 2 RAM ذخیره می کند.. از آنجایی که تراشه مشغول پردازش تبدیل دما است, هنگامی که کنترلر یک شکاف زمانی برای خواندن ارسال می کند, خروجی های اتوبوس “0”, و زمانی که کار ذخیره سازی به پایان رسید, اتوبوس خروجی خواهد داشت “1”. در حالت کار انگلی, یک کشش قوی باید بلافاصله پس از صدور این دستورالعمل استفاده شود و حداقل 500MS برای حفظ عملکرد تراشه حفظ شود..
10. EEPROM را به یاد بیاورید (مقدار هشدار در EEPROM را در RAM کپی کنید) [B8H]
این دستورالعمل مقدار هشدار در EEPROM را به بایت های 3 و 4 در RAM کپی می کند.. از آنجایی که تراشه مشغول پردازش کپی است, هنگامی که کنترلر یک شکاف زمانی برای خواندن ارسال می کند, خروجی های اتوبوس “0”, و زمانی که کار ذخیره سازی به پایان رسید, خروجی های اتوبوس “1”. علاوه بر این, این دستورالعمل زمانی که تراشه روشن و ریست می شود به طور خودکار اجرا می شود. در این روش, دو بیت بایت زنگ در RAM همیشه تصویر آینه ای از داده ها در EEPROM خواهد بود.
11. منبع تغذیه را بخوانید (سوئیچ حالت کار) [B4H]
پس از صدور این دستورالعمل, فاصله زمانی خواندن صادر می شود, و تراشه کلمه وضعیت قدرت خود را برمی گرداند. “0” حالت قدرت انگلی است و “1” حالت قدرت خارجی است.
2.5 نمودار زمان بندی DS18B20
2.5.1 دیاگرام رابطه بازنشانی و پاسخ DS18B20
قبل از هر ارتباط باید یک تنظیم مجدد انجام شود. زمان تنظیم مجدد, زمان انتظار, و زمان پاسخ باید به شدت با توجه به زمان برنامه ریزی شود.
فاصله زمانی خواندن و نوشتن DS18B20: خواندن و نوشتن داده DS18B20 توسط بیت پردازش فاصله زمانی و کلمه فرمان برای تبادل اطلاعات تأیید می شود..
2.5.2 داده ها را بنویسید 0 و داده ها 1 به DS18B20
در 15uS اول فاصله زمانی داده نوشتن, اتوبوس باید توسط کنترلر پایین کشیده شود, و سپس زمان نمونه برداری تراشه برای داده های گذرگاه خواهد بود. زمان نمونه برداری 15~60uS است. اگر کنترلر در طول زمان نمونه برداری، اتوبوس را به سمت بالا بکشد, یعنی نوشتن “1”, و اگر کنترلر اتوبوس را پایین بکشد, یعنی نوشتن “0”.
هر بیت انتقال باید دارای بیت شروع سطح پایین حداقل 15uS باشد, و داده های بعدی “0” یا “1” باید در 45uS تکمیل شود.
زمان انتقال کل بیت باید در 60 تا 120 uS نگه داشته شود, در غیر این صورت نمی توان ارتباط عادی را تضمین کرد.
توجه داشته باشید: DS18B20 داده ها را از بیت کم می خواند و می نویسد.
2.5.3 خواندن داده ها 0 و داده ها 1 از DS18B20
زمان نمونه برداری از کنترل در طول فاصله زمانی خواندن باید دقیق تر باشد. در طول فاصله زمانی خواندن, میزبان همچنین باید سطح پایین حداقل 1uS تولید کند تا شروع زمان خواندن را نشان دهد. سپس, در 15uS پس از آزاد شدن اتوبوس, DS18B20 بیت داده داخلی را ارسال می کند. در این زمان, اگر کنترل متوجه شد که اتوبوس بالا است, یعنی خواندن “1”, و اگر اتوبوس کم باشد, یعنی خواندن داده ها “0”. قبل از خواندن هر بیت, کنترل کننده یک سیگنال شروع اضافه می کند.
توجه داشته باشید: بیت داده باید در 15uS از شروع شکاف خواندن خوانده شود تا از ارتباط صحیح اطمینان حاصل شود.
در حین برقراری, 8 بیت از “0” یا “1” به عنوان بایت استفاده می شود, و خواندن یا نوشتن بایت از بیت پایین شروع می شود.
2.5.4 ترتیب دمای خواندن یک بار (فقط یک DS18B20 در اتوبوس)
1. ارسال سیگنال تنظیم مجدد
2. تشخیص سیگنال پاسخ
3. ارسال 0xCC
4. ارسال 0x44
5. ارسال سیگنال تنظیم مجدد
6. تشخیص سیگنال پاسخ
7. 0xcc بنویس
8. 0xbe بنویس
9. حلقه 8 بار برای خواندن بایت پایین دما
10. حلقه 8 بار برای خواندن بایت بالا دما
11. داده های دمایی 16 بیتی را ترکیب و پردازش کنید
3. کد درایور
3.1 DS18B20.c
#شامل بودن “ds18b20.h”
/*
تابع: مقداردهی اولیه DS18B20
اتصال سخت افزاری: PB15
*/
void ds18b20_init(باطل)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->CRH&=0x0FFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //کشش
}
/*
تابع: بررسی کنید که آیا دستگاه DS18B20 وجود دارد یا خیر
ارزش برگشتی: 1 یعنی دستگاه وجود ندارد 0 یعنی دستگاه عادی است
*/
u8 DS18B20_CheckDevice(باطل) //حاوی پالس تنظیم مجدد, پالس تشخیص
{
DS18B20_OUTPUT_MODE();//به حالت خروجی راه اندازی کنید
DS18B20_OUT=0; //ایجاد پالس تنظیم مجدد
DelayUs(750); //سطح پایین 750us را ایجاد کنید
DS18B20_OUT=1; //اتوبوس آزاد
DelayUs(15); //منتظر پاسخ DS18B20 باشید
اگر(DS18B20_CleckAck())//تشخیص نبض وجود
{
بازگشت 1;
}
بازگشت 0;
}
/*
تابع: تشخیص وجود پالس دستگاه DS18B20
ارزش برگشتی: 1 خطا را نشان می دهد 0 طبیعی را نشان می دهد
*/
u8 DS18B20_CleckAck(باطل)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//به حالت ورودی راه اندازی کنید
در حالی که(DS18B20_IN&&cnt<200) //منتظر پالس وجود پاسخ DS18B20 باشید
{
DelayUs(1);
cnt++;
}
اگر(cnt>= 200)بازگشت 1; //خطا
cnt=0;
در حالی که((!DS18B20_IN)&&cnt<240) //صبر کنید تا DS18B20 اتوبوس را آزاد کند
{
DelayUs(1);
cnt++;
}
اگر(cnt>=240)بازگشت 1; //خطا
بازگشت 0;
}
/*
تابع: یک بایت بنویس
ابتدا کمی نوشتن را یاد بگیرید.
*/
void ds18b20_writebyte(u8 cmd)
{
u8 i;
DS18B20_OUTPUT_MODE(); //به حالت خروجی راه اندازی کنید
برای(i=0;من<8;i++)
{
DS18B20_OUT=0; //ایجاد فاصله زمانی نوشتن (شروع بنویس)
DelayUs(2);
DS18B20_OUT=cmd&0x01; //ارسال بیت داده واقعی
DelayUs(60); //منتظر تکمیل نوشتن باشید
DS18B20_OUT=1; //اتوبوس را رها کنید و برای انتقال بعدی آماده شوید
cmd>>=1; //به ارسال بیت بعدی داده ادامه دهید
}
}
/*
تابع: یک بایت بخوانید
ابتدا کمی خواندن را یاد بگیرید.
*/
u8 DS18B20_ReadByte(باطل)
{
u8 i,داده=0;
برای(i=0;من<8;i++)
{
DS18B20_OUTPUT_MODE(); //به حالت خروجی راه اندازی کنید
DS18B20_OUT=0; //ایجاد فاصله زمانی خواندن (شروع را بخوانید)
DelayUs(2);
DS18B20_OUT=1; //اتوبوس آزاد
DS18B20_INPUT_MODE(); //به حالت ورودی راه اندازی کنید
DelayUs(8); //منتظر خروجی داده DS18B20 باشید
داده ها>>=1; //کمی بالا را پر کنید 0, پیش فرض است 0
اگر(DS18B20_IN) داده ها|=0x80;
DelayUs(60);
DS18B20_OUT=1; //اتوبوس آزاد, منتظر خواندن بیت بعدی اطلاعات باشید
}
داده ها را برگرداند;
}
/*
تابع: داده های دمایی DS18B20 را یک بار بخوانید
ارزش برگشتی: داده های دما خوانده شده
وضعیت در نظر گرفته شده است: تنها یک DS18B20 به اتوبوس متصل است
*/
u16 DS18B20_ReadTemp(باطل)
{
دمای u16=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //ارسال پالس ریست, تشخیص نبض
ds18b20_writebyte(0XCC); //از تشخیص توالی ROM صرفنظر کنید
ds18b20_writebyte(0x44); //تبدیل دما را شروع کنید
//صبر کنید تا تبدیل دما کامل شود
در حالی که(ds18b20_readbyte()!=0xFF){}
DS18B20_CheckDevice(); //ارسال پالس ریست, تشخیص نبض
ds18b20_writebyte(0XCC); //از تشخیص توالی ROM صرفنظر کنید
ds18b20_writebyte(0xbe); //دما را بخوانید
temp_L=DS18B20_ReadByte(); //داده های دمای پایین را بخوانید
temp_H=DS18B20_ReadByte(); //داده های دمای بالا را بخوانید
temp=temp_L|(temp_H<<8); //دمای سنتز شده
بازگرداندن;
}
3.2 DS18B20.h
#ifndef DS18B20_H
#DS18B20_H را تعریف کنید
#شامل بودن “stm32f10x.h”
#شامل بودن “sys.h”
#شامل بودن “تاخیر.h”
#شامل بودن “ds18b20.h”
#شامل بودن “usart.h”
/*رابط بسته*/
//DS18B20 را در حالت ورودی راه اندازی کنید
#DS18B20_INPUT_MODE را تعریف کنید() {GPIOB->CRH&=0x0FFFFFF;GPIOB->CRH|=0x80000000;}
//DS18B20 را در حالت خروجی راه اندازی کنید
#DS18B20_OUTPUT_MODE را تعریف کنید(){GPIOB->CRH&=0x0FFFFFF;GPIOB->CRH|=0x30000000;}
//خروجی پورت IO DS18B20
#DS18B20_OUT PBout را تعریف کنید(15)
//ورودی پورت IO DS18B20
#DS18B20_IN PBin را تعریف کنید(15)
//اعلام عملکرد
u8 DS18B20_CleckAck(باطل);
u8 DS18B20_CheckDevice(باطل);
void ds18b20_init(باطل);
u16 DS18B20_ReadTemp(باطل);
u8 DS18B20_ReadByte(باطل);
void ds18b20_writebyte(u8 cmd);
#endif
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 عملکرد تاخیر
/*
تابع: تاخیر در ما
*/
DelayUs را باطل کنید(بین ما)
{
#ifdef _SYSTICK_IRQ_
int i,j;
برای(i=0;iVAL=0; //مقدار شمارنده CNT
SysTick->LOAD=9*ما; //9 به معنی 1 ماست
SysTick->CTRL|=1<<0; //شروع تایمر
انجام دهید
{
tmp=SysTick->CTRL; //وضعیت را بخوانید
}در حالی که((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->VAL=0; //مقدار شمارنده CNT
SysTick->CTRL&=~(1<<0); //تایمر را خاموش کنید
#endif
};i++)>
3.4 main.c برای خواندن دما با DS18B20 تماس بگیرید و آن را در پورت سریال چاپ کنید
#شامل بودن “stm32f10x.h”
#شامل بودن “ds18b20.h”
u8 DS18B20_ROM[8]; //کد رام 64 بیتی DS18B20 را ذخیره کنید
int اصلی(باطل)
{
دمای u16;
USARTx_Heat(USART1,72,115200);//راه اندازی پورت سریال 1
ds18b20_init(); //مقداردهی اولیه DS18B20
/*1. کد رام 64 بیتی DS18B20*/ را بخوانید
//ارسال پالس ریست, تشخیص نبض وجود
در حالی که(DS18B20_CheckDevice())
{
چاپی(“دستگاه DS18B20 وجود ندارد!\حرف”);
تاخیر خانم(500);
}
//دستور خواندن کد رام 64 بیتی را ارسال کنید
ds18b20_writebyte(0x33);
//کد رام 64 بیتی را لوپ خوانده است
برای(i=0;من<8;i++)
{
DS18B20_ROM[من]= DS18B20_ReadByte();
چاپی(“DS18B20_ROM[%د]=0x%X\n”,من,DS18B20_ROM[من]);
}
در حالی که(1)
{
/*2. برای شروع تبدیل دما، همه DS18B20 را به طور همزمان در اتوبوس کار کنید*/
DS18B20_CheckDevice(); //ارسال پالس ریست, تشخیص نبض
ds18b20_writebyte(0XCC); //از تشخیص توالی ROM صرفنظر کنید
ds18b20_writebyte(0x44); //تبدیل دما را شروع کنید (اجازه دهید تمام DS18B20 روی گذرگاه دما را تبدیل کنند)
تاخیر خانم(500); //منتظر بمانید تا تمام تبدیلهای دمایی DS18B20 در خط تکمیل شود
/*3. خواندن هدفمند تنها از دمای هر DS18B20*/
DS18B20_CheckDevice(); //ارسال پالس ریست, تشخیص نبض
ds18b20_writebyte(0x55); //برای مطابقت با رام دستور ارسال کنید
برای(i=0;من<8;i++) //ارسال کد 64 بیتی
{
ds18b20_writebyte(DS18B20_ROM[من]);
}
ds18b20_writebyte(0xbe); //دما را بخوانید
temp=DS18B20_ReadByte(); //داده های درجه حرارت پایین را بخوانید
دما|=DS18B20_ReadByte()<<8; //داده های درجه حرارت بالا را بخوانید
چاپی(“temp1=%d.%d\n”,دما>>4,دما&0xF);
چاپی(“temp2=%f\n”,دما*0.0625);
تاخیر خانم(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







