Вторник, 16.04.2024, 15:47
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Изучаем AVR

Подключение датчика температуры DS18B20

DS18B20 цифровой термометр с программируемым разрешением, от 9 до 12–bit, которое может сохраняться в EEPROM памяти прибора. DS18B20 обменивается данными по 1-Wire шине и при этом может быть как единственным устройством на линии так и работать в группе. Все процессы на шине управляются центральным микропроцессором.
Диапазон измерений от –55°C до +125°C и точностью 0.5°C в диапазоне от –10°C до +85°C. В дополнение, DS18B20 может питаться напряжением линии данных ("parasite power”), при отсутствии внешнего источника напряжения.
Каждый DS18B20 имеет уникальный 64-битный последовательный код, который позволяет, общаться с множеством датчиков DS18B20 установленных на одной шине. Такой принцип позволяет использовать один микропроцессор, чтобы контролировать множество датчиков DS18B20, распределенных по большому участку. Приложения, которые могут извлечь выгоду из этой особенности, включают системы контроля температуры в зданиях, и оборудовании или машинах, а так же контроль и управление температурными процессами.

DS18B20 — цифровой термометр с весьма большими возможностями. Для того, чтобы ускорить понимание как же управлять данным датчиком, мы поставим перед собой наиболее простую задачу. Задача: измерить температуру используя 1 датчик DS18B20.

Схема подключения DS18B20:



Учимся общаться с DS18B20:



Шаг 1: Последовательность инициализации состоит из импульса сброса, переданного устройством управления шиной, сопровождаемым импульсом присутствия, переданными подчиненным устройством. Импульс присутствия позволяет устройству управления шиной знать, что подчиненные устройство присутствует на шине и готово к работе.



Шаг 2: Есть пять команд ROM, и каждая команда 8 битов длиной. Главное устройство должно передать соответствующую команду ROM перед передачей команды функции DS18B20. В нашем случае т.к мы используем 1-ин датчик, главное устройство может использовать команду, чтобы обратиться ко всем устройствам на шине одновременно . Например, главное устройство может заставить, чтобы все DS18B20 (датчики температуры) на шине, начали одновременно температурные преобразования. Для этого необходимо выдать на шину команду Пропуска ROM [CCh] сопровождаемую командой Температурного преобразования [44h].

SEARCH ROM [F0h] — (ПОИСК ROM) - позволяет устройству управления определять номера и типы подчиненных устройств.
READ ROM [33h] - Эта команда позволяет устройству управления шиной читать ROM подчиненного устройства (если подключено больше чем одно подчиненное устройство на шине, произойдет конфликт на уровне данных).
MATCH ROM [55h] Соответствие ROM [55h] - позволяет устройству управления шиной обращаться к определенному подчиненному устройству на шине.
SKIP ROM [CCh] Пропуск ROM [CCh] - чтобы обратиться ко всем устройствам на шине одновременно.
ALARM SEARCH [ECh] Поиск Тревоги [ECh] - Эта команда позволяет главному устройству определять, какие DS18B20-сы испытали сигнальное состояние.

Шаг 3: После того, как устройство управления шиной обработало команду ROM, чтобы обратиться к конкретному DS18B20 на шине (в нашем случае он один), с которым оно желает связаться, устройство управления может формировать одну из команд функции DS18B20. Эти команды позволяют выполнить функции записи или чтения оперативной памяти DS18B20, инициализировать температурные преобразования или определить режим электропитания.



Слоты времени — чтения/записи:



#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define SKIP_ROM 0xCC // Пропустить индентификацию
#define CONVERT_T 0×44 // Измерить температуру
#define READ_SCRATCHPAD 0xBE // Прочитать измеренное

//определяем порт и бит к которому подключено устройство
#define OWI_PORT PORTD
#define OWI_DDR DDRD
#define OWI_PIN PIND
#define OWI_BIT 0

#define OWI_LOW OWI_DDR |= 1<<OWI_BIT//притягиваем шину к 0
#define OWI_HIGH OWI_DDR &= ~(1<<OWI_BIT)//отпускаем шину

//функция определяет есть ли устройство на шине
char OWI_find(void)
{
char SR0=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char device;
OWI_LOW; //притягиваем шину к 0
_delay_us(485);//ждем минимум 480мкс
OWI_HIGH;//отпускаем шину
_delay_us(65);//ждем минимум 60мкс и смотрим что на шине

if((OWI_PIN & (1<<OWI_BIT)) ==0×00)//смотрим есть ли ответ
device = 1; //на шине есть устройство
else
device = 0; //на шине нет устройства
SREG=SR0;//возвращаем первонач знач регистра
_delay_us(420);//ждем оставшееся время до 480мкс
return device;
}

// функция отправляет бит на устройство
void OWI_write_bit (char bit)
{
char SR1=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
OWI_LOW;//логический «0″
_delay_us(2);
if(bit) OWI_HIGH; //отпускаем шину
_delay_us(65);
OWI_HIGH; //отпускаем шину
SREG=SR1;//возвращаем первонач знач регистра
}

//функция посылает байт на устройство
void OWI_write_byte(unsigned char c)
{
char i;
for(i = 0; i < 8; i++)//в цикле посылаем побитно
{
if((c & (1<<i)) == 1<<i)//если бит=1 посылаем 1
OWI_write_bit(1);
else//иначе посылаем 0
OWI_write_bit(0);
}
}

//функция чтения одного бита
char OWI_read_bit (void)
{
char SR2=SREG;//сохраняем значение регистра
cli(); //запрещаем прерывания
char OWI_rbit; //переменная хранения бита
OWI_LOW;//логический «0″
_delay_us(2);
OWI_HIGH; //отпускаем шину
_delay_us(13);
OWI_rbit=(OWI_PIN & (1<<OWI_BIT));//читаем бит
_delay_us(45);//задержка до окончания тайм-слота
SREG=SR2;//возвращаем первонач знач регистра
return OWI_rbit;
}

//функция читает один байт с устройства 1-wire
unsigned char OWI_read_byte()
{
char data=0,i;
for(i = 0; i < 8; i++) //в цикле смотрим что на шине и сохраняем значение
data|= OWI_read_bit()<<i;//читаем очередной бит
return data;
}

//функция преобразует полученные с датчика 18b20 данные в температуру
int  temp_18b20()
{
unsigned char B;
unsigned int ds18_temp=0;
if(OWI_find()==1)//если есть устройство на шине
{
OWI_write_byte(SKIP_ROM);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем
OWI_write_byte(CONVERT_T);//преобразовать температуру
_delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
OWI_find();//снова посылаем Presence и Reset
OWI_write_byte(SKIP_ROM);
OWI_write_byte(READ_SCRATCHPAD);//передать байты ведущему(у 18b20 в первых двух содержится температура)

B = OWI_read_byte(); //читаем бит LS
ds18_temp = OWI_read_byte(); //читаем бит MS
ds18_temp = (ds18_temp<<8)|B;//уладываем биты в последовательности MS потом LS
}
// else return можно сделать возврат числа что датчика нет
return ds18_temp;//возвращаем int (MS,LS)
}

//перевод инф от temp_18b20() в удобный вид
char convert (unsigned int td)
{
char dat=td>>4;//сдвиг и отсечение старшего байта
return dat;// (знак,2в6,2в5,2в4,2в3,2в2,2в1,2в0)
}

int main (void)
{
DDRD=0×00;
PORTD=0×00;
char T=0;

DDRA=0xFF;
while(1)
{ T=convert(temp_18b20());
PORTA=T;
}
}
Категория: Изучаем AVR | Добавил: Alex (20.01.2014)
Просмотров: 3089 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024