Фев 082020
 

Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение Эдуард » 21 янв 2017, 23:32

Разрешающая способность датчика температуры DS18B20 может быть задана в регистре конфигурации. Возможны варианты: 9, 10, 11 и 12 битов.

От этого параметра зависит точность измерения температуры. Но при повышении разрешения увеличивается и время измерения. Для каждой конкретной задачи лучше выбирать свою разрешающую способность датчика.

Регистр конфигурации загружается при включении питания из внутреннего EEPROM датчика DS18B20. Можно, конечно, программировать EEPROM датчика в устройстве, к которому он подключен, но это лишняя операция, занимающая время и ресурсы. Практичнее запрограммировать конфигурацию датчика отдельно.

Для этого я написал не большую программу. Она загружается в плату Arduino UNO R3 и получается простой программатор.

Датчик DS18B20 подключается по такой схеме.
ProgDs18b20_5.PNG
ProgDs18b20_5.PNG (6.53 КБ) 4417 просмотров

Я выбрал выводы, для того чтобы датчик можно было просто вставить в соседние контакты разъема платы. Туда же вставляется резистор сопротивлением 4,3 кОм.
ProgDs18b20_4.JPG

ProgDs18b20_3.JPG

Загружается программа в плату. Открывается монитор последовательного порта Arduino IDE. Скорость 9600 бод.
Программа в цикле считывает состояние датчика: температуру и разрешающую способность (в разрядах).
ProgDs18b20_1.PNG

Для программирования необходимо послать команду:

  • D=0 , для установки разрешения 9 бит;
    D=1 , для установки разрешения 10 бит;
    D=2 , для установки разрешения 11 бит;
    D=3 , для установки разрешения 12 бит.

В окне монитора должно появиться сообщение ”Programming” и произойти собственно программирование. После этого будут отображаться новые данные разрешения датчика.
ProgDs18b20_2.PNG

Все остальные команды программа проигнорирует.
Вот скетч программы.

КОД: ВЫДЕЛИТЬ ВСЁ

// программирование датчика DS18B20
#include <OneWire.h>

OneWire sensDls (13); // датчик подключен к выводу 13

byte buffData[9]; // буфер данных
float temperature; // измеренная температура

void setup() {
Serial.begin(9600); // инициализируем порт, 9600 бод
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
}

void loop() {

// перезагрузка данных из EEPROM
sensDls.reset(); // сброс шины
sensDls.write(0xCC, 0); // пропуск ROM
sensDls.write(0xB8, 0); // запись EEPROM
delay(20);

// чтение данных из датчика
sensDls.reset(); // сброс шины
sensDls.write(0xCC, 0); // пропуск ROM
sensDls.write(0x44, 0); // инициализация измерения
delay(900); // пауза 0,9 сек
sensDls.reset(); // сброс шины
sensDls.write(0xCC, 0); // пропуск ROM
sensDls.write(0xBE, 0); // команда чтения памяти датчика
sensDls.read_bytes(buffData, 9); // чтение памяти датчика, 9 байтов

if ( OneWire::crc8(buffData, 8) == buffData[8] ) { // проверка CRC
// данные правильные
Serial.print(«T= «);
Serial.print((float)((int)buffData[0] | (((int)buffData[1]) << 8)) * 0.0625 + 0.03125);

Serial.print(» Digits= «);
if ( (buffData[4] & 0x60) == 0) Serial.println(«9»);
else if ( (buffData[4] & 0x60) == 0x20) Serial.println(«10»);
else if ( (buffData[4] & 0x60) == 0x40) Serial.println(«11»);
else if ( (buffData[4] & 0x60) == 0x60) Serial.println(«12»);
}

else {
// ошибка CRC
Serial.println(«Read error»);
}

// проверка данных для программирования
if( Serial.available() != 0) {
delay(10);

if( Serial.available() == 5) {
// все правильно, 5 байтов

if ( (Serial.read() == ‘D’) && (Serial.read() == ‘=’) ) {

char x = Serial.read();
if ( (x == ‘0’) || (x == ‘1’)|| (x == ‘2’)|| (x == ‘3’) ) {

// программирование
// загрузка данных в ОЗУ
sensDls.reset(); // сброс шины
sensDls.write(0xCC, 0); // пропуск ROM
sensDls.write(0x4E, 0); // запись памяти
sensDls.write(0, 0); // TL
sensDls.write(0, 0); // TH

if (x == ‘0’) sensDls.write(0x1F, 0);
else if (x == ‘1’) sensDls.write(0x3F, 0);
else if (x == ‘2’) sensDls.write(0x5F, 0);
else if (x == ‘3’) sensDls.write(0x7F, 0);
delay(20);

// загрузка данных в EEPROM
sensDls.reset(); // сброс шины
sensDls.write(0xCC, 0); // пропуск ROM
sensDls.write(0x48, 0); // запись EEPROM


delay(50);
Serial.println("Programming");
}
else {
// ошибка
while (true) { if (Serial.read() == 0xffff) break;}
}
}
else {
// не правильно
while (true) { if (Serial.read() == 0xffff) break;}
}
}
else {
// не правильно
while (true) { if (Serial.read() == 0xffff) break;}
}
}
}

Понравилось? Поделитесь:

:

Sorry, the comment form is closed at this time.