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

Вопросы по средствам измерения температуры
Эдуард
Администратор
Сообщения: 399
Зарегистрирован: 30 окт 2016, 20:53

Программирование регистра конфигурации датчика температуры 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 КБ) 2545 просмотров


Я выбрал выводы, для того чтобы датчик можно было просто вставить в соседние контакты разъема платы. Туда же вставляется резистор сопротивлением 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;}
    }     
  }   
}


Аватара пользователя
Witmarkthogy
Сообщения: 2
Зарегистрирован: 25 янв 2017, 22:10

Программирование регистра кон…

Сообщение Witmarkthogy » 04 фев 2017, 02:24

Спасибо за ответ. Т.е. я могу быть уверенным, что значение регистра будет новым уже при сканировании следующей после mov-а строки??

Jamessat
Сообщения: 1
Зарегистрирован: 17 май 2017, 11:16

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

Сообщение Jamessat » 01 июн 2017, 07:34

У меня тоже там разъм, но только датчика температуры почему то нет. И в салоне нигде не показывает температуру. Может кто сам ставил датчик температуры?


Вернуться в «Датчики температуры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей