#1 2015-07-10 14:51:33

CollSpack
Учасник
Зареєстрований: 2015-07-10
Повідомлень: 5

Как повысить скорость снятия температуры с датчика DS18B20?

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

Для примера есть следующий код. Программа снимает температуру с двух датчиков и выдает количество затраченного времени для 9, 10, 11 и 12 bit разрешения.
Используются библиотеки OneWire и DallasTemperature.

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress insideThermometer =  {0x28, 0xFA, 0xAB, 0x8C, 0x06, 0x00, 0x00, 0xFA};
DeviceAddress outsideThermometer = {0x28, 0x17, 0x1C, 0x8C, 0x06, 0x00, 0x00, 0x87};

void setup() {
  Serial.begin(9600);
  sensors.begin();
}

//Мигнуть диодом 100000 раз и вывести инфо о времени исполнения
void loop() {
  double temp1;
  double temp2;
  unsigned long start ;
  unsigned long i ;

  Serial.print("requestTemperaturesByAddress + getTempC test, 12 bit: ") ;
  sensors.setResolution(insideThermometer,  12);
  sensors.setResolution(outsideThermometer, 12);
  start = millis() ;
  for (i = 0 ; i < 10 ; i++)
  {
    sensors.requestTemperaturesByAddress(insideThermometer);
    temp1 = sensors.getTempC(insideThermometer);
    sensors.requestTemperaturesByAddress(outsideThermometer);
    temp2 = sensors.getTempC(outsideThermometer);
  }
  Serial.print(millis() - start) ;
  Serial.println(" msec (10 calls)") ;
  delay(2000);

  Serial.print("requestTemperaturesByAddress + getTempC test, 11 bit: ") ;
  sensors.setResolution(insideThermometer,  11);
  sensors.setResolution(outsideThermometer, 11);
  start = millis() ;
  for (i = 0 ; i < 10 ; i++)
  {
    sensors.requestTemperaturesByAddress(insideThermometer);
    temp1 = sensors.getTempC(insideThermometer);
    sensors.requestTemperaturesByAddress(outsideThermometer);
    temp2 = sensors.getTempC(outsideThermometer);
  }
  Serial.print(millis() - start) ;
  Serial.println(" msec (10 calls)") ;
  delay(2000);

  Serial.print("requestTemperaturesByAddress + getTempC test, 10 bit: ") ;
  sensors.setResolution(insideThermometer,  10);
  sensors.setResolution(outsideThermometer, 10);
  start = millis() ;
  for (i = 0 ; i < 10 ; i++)
  {
    sensors.requestTemperaturesByAddress(insideThermometer);
    temp1 = sensors.getTempC(insideThermometer);
    sensors.requestTemperaturesByAddress(outsideThermometer);
    temp2 = sensors.getTempC(outsideThermometer);
  }
  Serial.print(millis() - start) ;
  Serial.println(" msec (10 calls)") ;
  delay(2000);

  Serial.print("requestTemperaturesByAddress + getTempC test, 9 bit: ") ;
  sensors.setResolution(insideThermometer,  9);
  sensors.setResolution(outsideThermometer, 9);
  start = millis() ;
  for (i = 0 ; i < 10 ; i++)
  {
    sensors.requestTemperaturesByAddress(insideThermometer);
    temp1 = sensors.getTempC(insideThermometer);
    sensors.requestTemperaturesByAddress(outsideThermometer);
    temp2 = sensors.getTempC(outsideThermometer);
  }
  Serial.print(millis() - start) ;
  Serial.println(" msec (10 calls)") ;
  delay(2000);
}

Что из этого имеем:
requestTemperaturesByAddress + getTempC test, 12 bit: 16166 msec (10 calls) -  808,3 msec на снятие температуры с 1 датчика
requestTemperaturesByAddress + getTempC test, 11 bit: 8666 msec (10 calls)   -  433,3 msec на снятие температуры с 1 датчика
requestTemperaturesByAddress + getTempC test, 10 bit: 4927 msec (10 calls)   -  246.35 msec на снятие температуры с 1 датчика
requestTemperaturesByAddress + getTempC test, 9 bit: 3046 msec (10 calls)     -  152,3 msec на снятие температуры с 1 датчика

Необходимо добиться чтобы при разрешении в 12 bit температура измерялась намного быстрее.
Прошу помощи!

Неактивний

#2 2015-07-10 15:59:57

CollSpack
Учасник
Зареєстрований: 2015-07-10
Повідомлень: 5

Re: Как повысить скорость снятия температуры с датчика DS18B20?

Подсказали на другом форуме:

В библиотеке можно подправить
      // Wait a fix number of cycles till conversion is complete (based on IC datasheet)
      switch (*bitResolution)
      {
        case 9:
          delay(94);
          break;
        case 10:
          delay(188);
          break;
        case 11:
          delay(375);
          break;
        case 12:
        default:
          delay(750);
          break;
      }

Сменил задержку до 100 мсек. Полет нормальный, прибор быстро набирает температуру и быстро стабилизирует ее до максимальных +/-0,06 градуса.

Температуру вроде бы показывает правильную. Интересно, как повлияло на работу программы датчика такое изменение температуры.

Неактивний

#3 2015-07-13 11:34:56

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Как повысить скорость снятия температуры с датчика DS18B20?

то что подправили - время ожидания до полного цикла измерения температуры )   // Wait a fix number of cycles till conversion is complete (based on IC datasheet)
ставьте защиту на данные ( например скользящее среднее,  и сравнение результата с ним,  но это плохо повлияет на работу ) , будут  выбросы  ( вероятно ) , а что греете? если 1 Гц не хватает?
может нагревательный механизм поправите ( уменьшить мощность?)?
ПИДом стабилизируете?

Неактивний

#4 2015-07-18 23:30:32

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Как повысить скорость снятия температуры с датчика DS18B20?

покажите результаты, интересно  ведь

"возюкался" когда то такой темой

test_stable.png

видел работу "буржуйских" объектов, впечатляет качество реализации, но и цена была не "детская" )
как Ваши успехи?

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму