Перейти к содержанию

Датчик DS 18B 20, при отключении иногда продолжает показывать старую температуру


Рекомендуемые сообщения

Датчик DS 18B20, при отключении иногда продолжает показывать старую температуру, может кто сталкивался? так происходит не всегда, но частенько при отключении датчика

OneWire  ds(A9);				//Датчик температуры
volatile float celsius;        //Текущая температура

void GetTemperature()
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8]; 
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      //Serial.println("CRC is not valid!");
      celsius=0;
      return;
  }
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
     // Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
     // Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
     // Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      celsius=0;
      //Serial.println("Device is not a DS18x20 family device.");
      return;
  } 
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
   
  delay(800);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16;
  }

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Запускать преобразование перед считыванием. Не читать при неизвестном состоянии.
 

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, 3d_killer сказал:

Датчик DS 18B20, при отключении иногда продолжает показывать старую температуру

Вообще то, если датчик не отвечает или отвечает битым кодом, то в вашей функции есть целых 2 фрагмента, которые в этом случае должны устанавливать измеренную температуру в 0 градусов.

if (OneWire::crc8(addr, 7) != addr[7]) 
 { //Serial.println("CRC is not valid!"); 
  celsius=0; 
  return; 
 }

и

default: 
 celsius=0; 
 //Serial.println("Device is not a DS18x20 family device."); 
 return;

Если этого не происходит, то датчик программе отвечает правильно, но новое преобразование не выполняется, хотя запуск преобразования производится при каждом вызове функции. По какой схеме датчик подключен? По 2-х или 3-х проводной? При отключении каких проводов датчик отвечает предыдущим значением? Если отключается только провод питания, то возможно датчик продолжает работать некоторое время на остатках заряда внутреннего конденсатора. При этом его напряжения для работы логики еще хватает, а для АЦП уже нет. В таком случае отключайте информационный провод.

 

Ссылка на комментарий
Поделиться на другие сайты

Датчики DS18B20 менее помехоустойчивые чем датчики DS18S20 и DS1820 (определили опытным путём, их у нас используется очень много).
Для нормальной работы датчика мы стали его полностью отключать (TO92: отключение питания (вывод 3) и перевод вывода данных (вывод 2) в состояние лог.0 (иначе датчик переходит на двухпроводный режим работы)). Непосредственно перед опросом подавали питание. После опроса сразу выключали (у нас технология позволяла работать в таком режиме). Уже более 10 лет нет проблем.

После включения питания (по datasheet): The power-on reset value of the temperature register is +85°C (0000 0101 0101 0000, 0550h). Сначала (сроме CRC) мы определяли равно ли значение 85 град, потом ввели медианный фильтр и проверяем только допустимый диапазон температур с датчика. После нескольких неудачных чтений температуры с датчика (у нас это 8 раз) мы выставляем флаг "Обрыв датчика", но продолжаем запрашивать температуру с отказавшего датчика. В случае ответа продолжаем работать в обычном режиме.
 

Наш выходной каскад для работы с 1-wire

1-wire.png

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...