Фев 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;}
}
}
}

QR Code - Take this post Mobile!
Use this unique QR (Quick Response) code with your smart device. The code will save the url of this webpage to the device for mobile sharing and storage.
Понравилось? Поделитесь:

:

Sorry, the comment form is closed at this time.