Как повысить скорость снятия температуры с датчика 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); }
Что из этого имеем:
При 12 bit - 808,3 msec на снятие температуры с 1 датчика
При 11 bit - 433,3 msec на снятие температуры с 1 датчика
При 10 bit - 246.35 msec на снятие температуры с 1 датчика
При 9 bit - 152,3 msec на снятие температуры с 1 датчика
Необходимо добиться чтобы при разрешении в 12 bit температура измерялась намного быстрее.
Прошу помощи!
Вопрос? А зачем ганять цикл?
Почитайте даташит, при 12битном разрешении датчику нужно 750 милисекунд на то, что бы померять температуру.
Но нет никакой необходимости делать все это последовательно, можно сначала указать обоим датчикам мерять температуру, а потом через 750мсек считать с обоих, так у Вас выйдет не ~800мсек на датчик, а ~800мсек на все датчики.
Ну и плюс к тому учтите, что если Вы будете очень часто обращаться к датчику, то он начнет несколько нагреваться (так как будет постоянно работать) и в итоге показывать несколько завышенную температуру.
Необходимо добиться чтобы при разрешении в 12 bit температура измерялась намного быстрее.
Намного быстрее не получится. В даташите указано:
К тому же, насколько помню, при слишком частом опросе сам ds18b20 немного нагревается и температура будет выдаваться завышенной.
Большое спасибо!
Сменил задержку до 100 мсек. Полет нормальный, прибор быстро набирает температуру и быстро стабилизирует ее до максимальных +/-0,06 градуса.
Температуру вроде бы показывает правильную. Интересно, как повлияло на работу программы датчика такое изменение температуры.
Большое спасибо!
Сменил задержку до 100 мсек. Полет нормальный, прибор быстро набирает температуру и быстро стабилизирует ее до максимальных +/-0,06 градуса.
...
Температуру вроде бы показывает правильную. Интересно, как повлияло на работу программы датчика такое изменение температуры.
Повлияло так, что теперь он показывает температуру от одного из предыдущих измерений. Если у Вас температура меняется не быстро, то все будет ок, а если быстро, то у Вас скоро что-нибудь отломается. С тем же успехом эту задержку можно вообще убрать.
0.06....... вроде-бы...
Кто у вас является поверочным -образцовым прибором?
А вы знаете что для поверки обычных приборов рекомендуется класс поверочного в десять раз выше поверяемого,
а для точных- хотя-бы раза в два-три.
А как вы решили проблемму инерции нагревателя?
Выбег при отключении и провал после включения?
А время реакции термометра на изменение температуры?
А саморазогрев датчика от частых измерений?
И всё это в 0.06 вкладывается? При его погрешности 0.5 ( но типикал конечно лучше - 0.1)
Поверьте. мне самому интересно.
График разогрева и регулирования нарисовать cможете?
И, кстати, вы можете его и ещё чаще опрашивать, наверное.
Только если он после команды "начать преобразование" не успеет его завершить
вы получите результат предыдущей коверсии
Производитель в даташите пишет, что при 12-битном разрешении датчику нужно 750 милисекунд на измерение.
Горе-инженеру надо побыстрее, поэтому задержку в библиотеке без страха и сомнения режем до 100.
Аплодисменты.
Производитель в даташите пишет, что при 12-битном разрешении датчику нужно 750 милисекунд на измерение.
Горе-инженеру надо побыстрее, поэтому задержку в библиотеке без страха и сомнения режем до 100.
Аплодисменты.
Самое интересное, что скорее всего для тех задач, которые стоят перед топикстартеров все те проблемы, которые из-за этого вылезли сейчас несущественны. Ну и что, что датчик показывает температуру секундной давности, все равно наверняка температура изменяется относительно медленно, да и в действительности такая точность нужна лишь для того, что бы чувствовать свою крутость и осведомленность в том, насколько точно он знает .
И эти люди думают что я троль?
Какая вам разница то? Меряет?! Ну и горн пионерский ему в седалище. Завтра он всех в школе научит как быстро мерять и без всяких pid добиваться точности температуры 0,06 градуса, даже если термометр измеряет всего 0,5 градуса точность.
Да вам просто завидно. :Р
Погрешность +/-0.06 градуса я беру из учета разрешения датчика. У него шаг 0.06 градуса. Был бы шаг 0,005 градуса то он бы так и держал температуру благодаря формуле. Хотя согласен что он может брехать на +/-0,5 (при -10 до +80) и еще меньше +/-0,1 при меньшем диапазоне.
До калибровки еще далеко, прибор на стадии разработки и отладки.
Калибровку пока не знаю чем делать, смотрю в сторону калибровки в жидкости с использованием телесного градусника. Но пока этот вопрос я не поднимал.
Проблема инерции нагрева и влияние температуры окружающей среды компенсируется очень хитро-мудрой формулой над которой я работал все свободное время более 2 недель. Формула является универсальной и может держать температуру в любом значении динамично подстраиваясь под необходимую температуру и внешние факторы(шумы). Так же метод регулирования температуры у меня не совсем стандартный, пока его вывел - 3 раза переписывал формулу. Я не использовал ПИД регулятор, а вывел абсолютно новую формулу.
После предварительного нагрева включается режим поддержки температуры, который дает небольшие колебания температуры в течении 5-15 секунд пока формула подстраивает поправочные коэффициенты.
Время реакции термометра компенсируется скоростью снятия температуры и плавным выходом на необходимую температуру.
Саморазогрев датчика войдет в дальнейшие поправки в формулу при его обнаружении после прогонки. По даташиту ток во время снятия температуры доходит аж до 1,5 mA.
Снял видео работы прибора. Температуру снимает очень быстро, на сколько точно - не проверял, но это войдет в калибровку. График делать впадло, на динамику нагрева сами можете глянуть в видео.
https://youtu.be/-Pang3m0SBI
А в точках отстоящих на 1-2-3-5см на плоскости мерять не пробовали? Далее, разброс температуры по высоте? Влияние внешних воздействий?
Еще один физикоматематический гений?
А в точках отстоящих на 1-2-3-5см на плоскости мерять не пробовали? Далее, разброс температуры по высоте? Влияние внешних воздействий?
Еще один физикоматематический гений?
да че нам пиды всякие... даешь ардуино из бересты
Ищу такой пример... пока не получается "запараллелить"... С использованием только #include <OneWire.h>
Ищу такой пример... пока не получается "запараллелить"... С использованием только #include <OneWire.h>
Поиском пробовали пользоваться?
http://arduino.ru/forum/programmirovanie/pochistil-sketch-primera-raboty...