DS18B20 — це цифровий датчик температури, який використовує синхронізацію однієї шини для зв’язку з хостом. Тільки 1 Для завершення зчитування даних про температуру потрібен дріт;
DS18B20 має вбудований 64-розрядний серійний номер продукту для легкої ідентифікації. Можна підключити кілька датчиків DS18B20 1 Дріт, і через 64-розрядну автентифікацію, інформацію про температуру, зібрану з різних датчиків, можна зчитувати окремо.
Знайомство з DS18B20
2.1 Основні характеристики DS18B20
1. Повністю цифрове перетворення та вихід температури.
2. Розширена передача даних по одній шині.
3. Роздільна здатність до 12 біт, з точністю до ±0,5 градусів Цельсія.
4. Максимальний робочий цикл при роздільній здатності 12 біт становить 750 мілісекунд.
5. Можна вибрати паразитний режим роботи.
6. Діапазон температур виявлення –55°C ~+125°C (–67°F ~+257°F).
7. Вбудований EEPROM, функція сигналізації обмеження температури.
8. 64-розрядна фотолітографія ROM, вбудований серійний номер продукту, зручний для підключення кількох машин.
9. Різні форми упаковки, адаптуватися до різних апаратних систем.
2.2 Функція контакту DS18B20
Земля напруги GND;
DQ одна шина даних;
Напруга живлення VDD;
NC порожній штифт;
2.3 Принцип роботи та застосування DS18B20
Виявлення температури DS18B20 і вихід цифрових даних повністю інтегровані в одну мікросхему, тому він має сильнішу здатність проти перешкод. Його один робочий цикл можна розділити на дві частини, а саме визначення температури та обробка даних.
18B20 має три форми ресурсів пам'яті. Вони є: ПЗП, використовується для зберігання коду DS18B20ID; перший 8 біти є однорядковим послідовним кодом (Код DS18B20 – 19H), наступне 48 біти є унікальним серійним номером мікросхеми; останній 8 біти є кодом CRC (перевірка надмірності) з перерахованого вище 56 шматочки. Дані встановлюються під час виробництва і не можуть бути змінені користувачем. DS18B20 має загальну кількість 64 біти ПЗУ.
Регістр даних RAM, використовується для внутрішніх розрахунків і доступу до даних, дані втрачаються після збою живлення, DS18B20 має загальну кількість 9 байтів оперативної пам'яті, кожен байт є 8 шматочки. Перший і другий байти є інформацією про значення даних після перетворення температури; третій і четвертий байти є дзеркальним відображенням EEPROM користувача (зазвичай використовується для зберігання значення тривоги температури). Його значення буде оновлено після скидання живлення. П'ятий байт є дзеркальним відображенням третього EEPROM користувача. 6-й, 7тис, і 8-й байт є регістрами підрахунку, які розроблені, щоб дозволити користувачам отримати вищу температурну роздільну здатність. Вони також є тимчасовими накопичувачами для перетворення та розрахунку внутрішньої температури. 9-й байт - це CRC-код першого 8 байтів. EEPROM - це енергонезалежна пам'ять, яка використовується для зберігання даних, які потрібно зберігати протягом тривалого часу, верхнє та нижнє значення сигналізації температури, та дані перевірки. DS18B20 має загальну кількість 3 біти EEPROM, і є дзеркальні зображення в оперативній пам'яті для полегшення роботи користувача.
DS18B20 за замовчуванням працює в режимі роздільної здатності 12 біт. 12-бітні дані, отримані після перетворення, зберігаються в двох 8-бітних ОЗУ DS18B20 (перші два байти). Перший 5 біти в двійковій системі є знаковими. Якщо виміряна температура перевищує 0, ці 5 біти є 0. Просто помножте виміряне значення на 0.0625 щоб отримати фактичну температуру. Якщо температура нижче ніж 0, ці 5 біти є 1. Виміряне значення потрібно інвертувати, додав 1, а потім помножити на 0.0625 щоб отримати фактичну температуру. Або використовуйте бітову операцію для отримання температури: десяткові знаки займають нижній 4 шматочки, а верхні біти є цілими бітами (від'ємні числа не враховуються).
2.4 Таблиця інструкцій ПЗП мікросхеми DS18B20
1. Читайте ПЗУ [33H] (шістнадцяткове командне слово в квадратних дужках).
Ця команда дозволяє контролеру шини читати 64-розрядне ПЗУ DS18B20. Цю інструкцію можна використовувати лише тоді, коли на шині є лише один DS18B20. Якщо підключено більше одного, під час спілкування виникатимуть конфлікти даних.
2. atch ROM [55H]
Ця інструкція супроводжується 64-бітним серійним номером, виданим контролером. Якщо в шині є кілька DS18B20, може реагувати тільки мікросхема з таким же серійним номером, як і той, який видав контролер, а інші чіпи чекатимуть наступного скидання. Ця інструкція підходить для однокристального і багатокристального підключення.
3. Пропустити ROM [CCH]
Ця інструкція змушує чіп не реагувати на код ПЗУ. У випадку з одним автобусом, цю інструкцію можна використовувати для економії часу. Якщо ця інструкція використовується, коли підключено кілька мікросхем, виникнуть конфлікти даних, що призводить до помилок.
4. Пошук ПЗУ [F0H]
Після ініціалізації чіпа, інструкція пошуку дозволяє ідентифікувати 64-розрядне ПЗУ всіх пристроїв шляхом виключення, коли кілька чіпів підключено до шини.
5. Пошук сигналізації [КОЖЕН]
У випадку з кількома мікросхемами, інструкція пошуку мікросхеми сигналізації відповідає лише на мікросхеми, які відповідають умові тривоги температури вище TH або нижче TL. Поки мікросхема не вимкнена, стан тривоги зберігатиметься до тих пір, поки температура не буде виміряна знову, і умова тривоги не буде досягнута.
6. Напишіть Scratchpad [4EH]
Це інструкція для запису даних в оперативну пам'ять. Два байти записаних даних будуть збережені за адресою 2 (TH сигналізації RAM) і адресу 3 (TL сигналізації RAM). Процес запису може бути припинений сигналом скидання.
7. Читайте Scratchpad (читати дані з оперативної пам'яті) [BEH]
Ця інструкція зчитує дані з оперативної пам'яті, починаючи з адреси 0 і до адреси 9, завершення читання всіх даних RAM. Мікросхема дозволяє сигналу скидання припинити процес читання, тобто, наступні непотрібні байти можна ігнорувати, щоб скоротити час читання.
8. Копіювати Scratchpad (скопіювати дані RAM в EEPROM) [48H]
Ця інструкція зберігає дані в ОЗУ в EEPROM, щоб дані не були втрачені після вимкнення живлення. Оскільки мікросхема зайнята обробкою пам'яті EEPROM, коли контролер надсилає часовий інтервал для читання, виходи шини “0”, і після завершення роботи зі зберігання, автобус виведе “1”.
У паразитному режимі роботи, сильне підтягування має бути використано відразу після видачі цієї інструкції та підтримуватися протягом принаймні 10 мс для підтримки роботи чіпа.
9. Перетворення Т (перетворення температури) [44H]
Після отримання цієї інструкції, чіп виконає перетворення температури і збереже перетворене значення температури в 1-й і 2-й адресах оперативної пам'яті. Оскільки мікросхема зайнята обробкою перетворення температури, коли контролер надсилає часовий інтервал для читання, виходи шини “0”, і після завершення роботи зі зберігання, автобус виведе “1”. У паразитному режимі роботи, сильне підтягування має бути використано одразу після виходу цієї інструкції та підтримуватися протягом принаймні 500 мс для підтримки роботи мікросхеми.
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
У перші 15 мкс часу запису даних, автобус повинен бути знижений контролером, і тоді це буде час вибірки мікросхеми для даних шини. Час вибірки 15~60uS. Якщо контролер тягне шину високо протягом часу вибірки, це означає писати “1”, і якщо контролер тягне шину низько, це означає писати “0”.
Кожен біт передачі повинен мати початковий біт низького рівня принаймні 15 мкс, і наступні дані “0” або “1” має бути завершено протягом 45uS.
Час передачі всього біта має бути 60~120 мкс, інакше нормальний зв'язок не може бути гарантований.
Примітка: DS18B20 читає і записує дані з молодшого біта.
2.5.3 Читання даних 0 і дані 1 від DS18B20
Час вибірки контролю під час проміжку часу зчитування має бути більш точним. Під час розриву часу читання, хост також повинен генерувати низький рівень принаймні 1uS, щоб вказати початок часу читання. Потім, через 15uS після звільнення автобуса, DS18B20 надішле біт внутрішніх даних. В цей час, якщо контроль виявить, що шина висока, це означає читання “1”, а якщо автобус низький, це означає читання даних “0”. Перед читанням кожного біта, контролер додає сигнал запуску.
Примітка: Біт даних має бути прочитаний протягом 15 мкс від початку проміжку зчитування, щоб забезпечити правильний зв’язок.
Під час спілкування, 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
*/
недійсний DS18B20_Init(недійсний)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->ЦРЛ&=0x0FFFFFFF;
GPIOB->ЦРЛ|=0x30000000;
GPIOB->ODR|=1<<15; //Підтягування
}
/*
функція: Перевірте, чи існує пристрій DS18B20
Повернене значення: 1 означає, що пристрій не існує 0 значить апарат нормальний
*/
u8 DS18B20_CheckDevice(недійсний) //Містить імпульс скидання, імпульс виявлення
{
DS18B20_РЕЖИМ_ВИВЕДЕННЯ();//Ініціалізація в режим виведення
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_РЕЖИМ_ВИВЕДЕННЯ(); //Ініціалізація в режим виведення
для(i=0;i<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;i<8;i++)
{
DS18B20_РЕЖИМ_ВИВЕДЕННЯ(); //Ініціалізація в режим виведення
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); //Пропустити виявлення послідовності ПЗУ
DS18B20_WriteByte(0x44); //Почніть перетворення температури
//Дочекайтеся завершення перетворення температури
поки(DS18B20_ReadByte()!=0xFF){}
DS18B20_CheckDevice(); //Надіслати імпульс скидання, визначити пульс
DS18B20_WriteByte(0xCC); //Пропустити виявлення послідовності ПЗУ
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”
#включити “затримка.ч”
#включити “ds18b20.h”
#включити “usart.h”
/*Інтерфейс пакета*/
//Переведіть DS18B20 у режим введення
#визначте DS18B20_INPUT_MODE() {GPIOB->ЦРЛ&=0x0FFFFFFF;GPIOB->ЦРЛ|=0x80000000;}
//Ініціалізуйте DS18B20 у вихідний режим
#визначте DS18B20_OUTPUT_MODE(){GPIOB->ЦРЛ&=0x0FFFFFFF;GPIOB->ЦРЛ|=0x30000000;}
//Вихід порту IO DS18B20
#визначте DS18B20_OUT PBout(15)
//Вхід порту IO DS18B20
#визначити DS18B20_IN PBin(15)
//Оголошення функції
u8 DS18B20_CleckAck(недійсний);
u8 DS18B20_CheckDevice(недійсний);
недійсний DS18B20_Init(недійсний);
u16 DS18B20_ReadTemp(недійсний);
u8 DS18B20_ReadByte(недійсний);
void DS18B20_WriteByte(u8 cmd);
#endif
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Функція затримки
/*
функція: Затримка в нас
*/
недійсні DelayUs(int us)
{
#ifdef _SYSTICK_IRQ_
int i,j;
для(i=0;iVAL=0; //Значення лічильника CNT
SysTick->НАВАНТАЖЕННЯ=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-розрядний код ROM DS18B20
int main(недійсний)
{
u16 темп;
USARTx_Heat(USART1,72,115200);//Ініціалізація послідовного порту 1
DS18B20_Тепло(); //Ініціалізація DS18B20
/*1. Прочитайте 64-розрядний код ПЗУ DS18B20*/
//Надіслати імпульс скидання, виявити пульс існування
поки(DS18B20_CheckDevice())
{
printf(“Пристрій DS18B20 не існує!\п”);
DelayMs(500);
}
//Надішліть команду для читання 64-розрядного коду ПЗУ
DS18B20_WriteByte(0x33);
//Цикл читання 64-розрядного коду ПЗУ
для(i=0;i<8;i++)
{
DS18B20_ROM[i]= DS18B20_ReadByte();
printf(“DS18B20_ROM[%d]=0x%Xn”,i,DS18B20_ROM[i]);
}
поки(1)
{
/*2. Одночасно запустіть усі DS18B20 на шині, щоб почати перетворення температури*/
DS18B20_CheckDevice(); //Надіслати імпульс скидання, визначити пульс
DS18B20_WriteByte(0xCC); //Пропустити виявлення послідовності ПЗУ
DS18B20_WriteByte(0x44); //Почніть перетворення температури (нехай всі DS18B20 на шині перетворюють температуру)
DelayMs(500); //Дочекайтеся завершення всіх перетворень температури DS18B20 на лінії
/*3. Єдине цільове зчитування температури кожного DS18B20*/
DS18B20_CheckDevice(); //Надіслати імпульс скидання, визначити пульс
DS18B20_WriteByte(0x55); //Надіслати команду для відповідності ПЗУ
для(i=0;i<8;i++) //Надіслати 64-бітний код
{
DS18B20_WriteByte(DS18B20_ROM[i]);
}
DS18B20_WriteByte(0xBE); //Прочитайте температуру
temp=DS18B20_ReadByte(); //Зчитування даних про температуру нижчого порядку
темп|=DS18B20_ReadByte()<<8; //Зчитування даних високої температури
printf(“temp1=%d.%dn”,темп>>4,темп&0xF);
printf(“temp2=%fn”,температура*0,0625);
DelayMs(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







