Как измерить температуру воздуха с точностью +/- 0,1С за возможно короткое время?
Здравствуйте,
передо мной стоит задача сделать термостатируемый полугерметичный объём, одной из подзадач является измерение температуры заборного воздуха и воздуха в объёме с точностью 0,1С не реже раза в минуту (хорошо бы каждые 5-10 секунд) на протяжении 0,5-72ч, чтобы работал ПИД. Температура снаружи объёма комнатная (17-30С), внутри объёма 36,6С (в будущем могут быть задачи 30-45, маловероятно 52-53). Поскольку тираж - 1 экз, и бюджет ограничен, в качестве датчиков я взял старые добрые ds18b20, благо их максимальное разрешение 0,0625С и средняя ошибка при основной рабочей температуре -0,2С.
Я хочу решить проблему плытия со временем или при наборе колебаниях температуры (выход на режим, остывание после работы) и базовой (пере)калибровки. Для этого я предполагаю поступить тупо: поставить на входе и в объёме по нескольку датчиков и усреднять показания внутри группы (если удастся считывать показания датчиков более-менее единомоментно, то простое среднее по датчикам, иначе скользящее среднее и фильтр Калмана).
Насколько я понял работу с ds18b20 и 1-wire вообще (и вот это я хочу уточнить особо!), если на шине несколько датчиков, мы должны опрашивать их по очереди, не подавая нового запроса на измерение, пока не выполнен текущий. Если я прав, то опрос каждого датчика займёт 750мс + оверхед протокола, и использовать гроздь датчиков в рамках текущих требований не получится.
Отсюда вопросы:
1. Правильный ли путь точного измерения температуры я выбрал, или Вы посоветуете что-то другое, например, таки откалибровать датчики и перекалибровывать их через определенные интервалы времени?
2. Правильно ли я понял процедуру опроса датчиков, или можно им подать сначала всем (по очереди или всем сразу через SKIP_ROM) команду на измерение, а потом по одном считать?
3. Как повысить скорость опроса в рамках задачи, не сажая каждый датчик на свою ногу микроконтроллера?
1. взять высокоточные датчики температуры. Pt к примеру. калбировать не имея калибровочнго "опорного" датчика бессмысленно.
2. да. сначала разослать сигнал запуска измерения температуры, потом опросить. опрос можно делать не торопясь - данные сохраняются в регистре до след.измерения.
3. использовать источник тока. питание отделить от сигнала. попробовать поработаь на максимальной частоте
1. Это которые терморезисторы с ценой 200-3000 в зависимости от точности и температуры? В качестве референсного датчика могу использовать термостатный градусник полуметровой длины, там риски 0,1 и меньше.
2. Понял, спасибо. Это лучше реализовывать переставляя таймер (на случай немного плавающего времени опроса) или можно по-пионерски через protothreads?
3. Это Вы описываете "каждому датчику свою ногу" или все на одной шине? Если последнее, то мне больше через uart нравится, быстрее и стабильнее ногодрыга.
1. ага, качество стоит денег.
насколько часто ты будешь калибровать датчик по референсному термометру ??
Есть такой параметр "старение" измерительного прибора. т.е. постепенных уход измеренного значения от реального. в ds1820 датчик температуры емнип полупроводниковый переход, старение таких элементов достаточно большое по сравнению с платиновым сопротивлением (в цифрах пардон не скажу) - т.е. через годы работы ds1820 уплывет сильно, а платиновое сопротивление практически нет.
Основа старения чисто физический процесс, и обсчитать его програмного невозможно, и даже если ты поставишь набор датчиков, то они все уплывут в одну сторону (с разной "скоростью") и усреднением ты точности не добьешься.
2. обходишь дски, отправляешь каждому "запуск измерения".
потом ждешь время измерения от первого в очереди датчика
обходишь их в том же порядке, собираешь данные.
3. если у тебя расстояние считанные метры, то сильно не парься. 1wire подразумевает односигнальную шину, на которую может вешаться куча датчиков. при этом питание они могут получать с нее же.
все зависит от реализации в схеме.
1. Спасибо за информацию по старению, я не нашёл информацию по скорости. Калибровать мне не лень ежемесячно, чаще уже перебор - можно в работу влезть и порушить "аптайм".
2. Грамотные люди в этом случае делают мини-планировщик на таймере или как-то иначе?
3. uart мне нравится тем, что он на программном уровне примитивный., общение с ПК я обычно сбрасываю на D-USB, uart свободен остаётся.
1. для одного экземпляра цены не сильно кусачие зависит от требуемых параметров.
пока гуглил, дядюшка али такое подкинул.
кстати есть еще медные и никелевые термосопротивления. ну их датчики сопротивления на основе термопары, мож подойдет по характеристикам ??
2. без таймера тут будет сложно, хотя есть индивиды не любящие внепрограмные средства :).
одно прерывание на запуск измерений, второе на считывание, третье на сброс таймера, к примеру.
3. возми проц с аппаратным 1wire, достаточно распространенный интерфейс. ну или сделай програмно он не сложен.
очень правильная концепция разработки продукта. при этом если провести начальную калибровку датчиков, выяснить отклонение каждого и учтя это (разработав математический аппарат, например на пайтон + нейросеть на raspberry) - тогда можно получить точность и повыше 0.1 градуса. например float можно легко усреднить до 0.01 градуса или ещё выше.
а для (пере)калибровки приложить в комплекте бачок с водой и кипятильником - залив дистиллят можно получить калибровочную температуру в 100 градусов (примерно), а подсыпав соли можно задать любую кастомную температуру (пере)калибровки для использования фильтра Калмана с скользящим окном.
выяснить отклонение каждого и учтя это (разработав математический аппарат, например на пайтон + нейросеть на raspberry)
Простой многоточечной калибровки, фиттинга полиномом 2-3 степени и построение поправочной таблицы (чтобы интерполяцией МК не грузить) думаете не хватит?
Насколько часто нужна перекалибровка? Про калибровку ds18b20 до почти предела его разрешения я читал, а вот насколько часто нужна перекалибровка - регламента не нашёл.
Сергей, конечно же хватит. можно взять полином 4й или седьмой степени, в случае чего.
пацаны то и не знают, ставят термопары. какие-то компенсации, какие-то принудительные обдувы. усилители малошумящие, датчики безинерционные, камеры термоизолированные. пишут какие-то кривые выхода на режим и выдержки - просто бред. всяко лучше поставить 3 ds18 и усреднить калманом чтобы потом пид работал. ставлю виртуальный лайк и подписываюсь на свежие новости.
n12eq3, я рад видеть Вашу едкую иронию, потому что после исходного ответа подумал, что Вы сошли с ума. Приятно ошибиться. На всякий случай замечу, вдруг кто через поиск сюда забредёт, что с помощью нескольких предварительно откалиброванных датчиков можно получить точность показаний выше, чем погрешность единичного откалиброванного датчика, хотя бы через перекрывание доверительных интервалов. Больше датчиков - меньше неопределенность.
При калибровке мы сверяем возвращаемый датчиком показатель с показаниями референсного датчика. Зависимость может быть линейной (kx+b), может быть плавной параболой или гиперболой; чаще используют линейную зависимость. При старении датчика меняются и точность (падает, увы) и k с b, для каждого единичного датчика независимо, т.е. надо перекалибровывать. Для моей задачи получается, что перекалибровывать надо где-то каждые 3-5 недель для сохранения нужной точности изменений, что слишком часто - возьму, как советуют выше, лабораторный датчик.
Полезные ссылки:
1. Базовая статья с letscontrolit про разрешение, аккуратность и калибровку. Есть краткая
2. Более подробно про калибровку на learn.adafruit
3. Как гроздь ds18b20 откалибровали до 0,01С для Leighton telescope - статья
3. История успешного применения грозди ds18b20 в гидрогеологии [1, 2], очень советую прочитать послесловия к статья.
3) Посмотрите в сторону датчиков LM75A, работает по I2C так что можно насадить на неё кучу, разрешающая способность 0.125 градусов (да чуть по хуже но может есть другие) Время преобразования (Temperature conversion) 100 ms
Фиг знает. ds18b20 дают погрешность в градус. Не знаю, как Вы собирались их калибровать.
Если нужна точность в 0,1 градуса, то собирают на мостовых схемах с термосопротивлением Pt100 (1000) или как то так. Дороговато, конечно, зато промышленно.
Ну, или какой-нибудь LMT70, наверное, пойдёт.
Или разобрать электронный градусник (который медицинский) на детали. Там, наверняка, чего-нибудь есть.
---
(датчики и на разные ноги контроллера посадить можно - всё равно протокол программный.)