Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

Контроллер термодатчиков

Постепенно код для контроллера термодатчиками обрастает новыми функциями. Пока что он умеет лишь включать-выключать питание датчиков, вычислять температуры 16-ти датчиков и работать в режиме непрерывного сканирования, выдавая данные через USART. Вот такая получилась штука:


Вблизи хорошо видно отсутствие разъемов под RJ-45:

потому что сначала развел и заказал плату, а потом получил разъемы, которые оказались совершенно несовместимыми с посадочными местами под них. Также не надо было подтяжки I2C делать от питания логики, благо, дорожки питания логики и питания датчиков идут недалеко, при помощи скальпеля и проволочной перемычки проблему можно решить. USB пока только для питания (его оставлю напоследок, т.к. не горит), с CAN тоже еще не разбирался (а вот это нужно сделать поскорей).
Вот так на экране выглядят показания в режиме сканирования. Нули возникли из-за плохого контакта (вообще, их быть не должно: если датчика нет или возникла временная проблема с коннектом с ним, должно выводиться -31000, то бишь -310.00°C; если же возникла ошибка преобразования температуры, должно быть -30000). Надо будет разобраться в режиме отладки, на каком этапе могут возникать нули.

Для тестирования я не стал писать функцию, т.к. это вообще однократная задача, поэтому оформил простенькие m-файлы вроде
XX=dlmread('testsensors_2');
time = XX(:,1) / 1000;
time -= time(1);
XX(:,1)=[];
XX /= 100;
plot(time, XX);
legend("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16");
xlabel("time, s"); ylabel("T, {}^\\circ{}C");
plotgr("2nd_test_b");

diffs=XX-median(XX,2);
plot(time, diffs);
legend("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16");
xlabel("time, s"); ylabel("\\Delta{}T, {}^\\circ{}C");
plotgr("2nd_test_b_diffmed");

А для сохранения графиков у меня есть старая рабочая функция:
function plotgr(nm)
    h = gcf();
    TL = get(gca, 'ticklength');
    set(gca, 'ticklength', TL*1.5);
    set(gca, 'linewidth', 3);
    H = 8; W = 12;
    lg = findobj(h, "type","axes", "Tag","legend");
    set(lg, "FontSize", 16);
    set(gca, 'fontsize', 16);
    set(get(gca(), "xlabel"), 'fontsize', 16);
    set(get(gca(), "ylabel"), 'fontsize', 16);
    set(h,'PaperUnits','inches')
    set(h,'PaperOrientation','landscape');
    set(h,'PaperSize',[W,H]);
    set(h,'PaperPosition',[0,0,W,H]);
    print(h, '-dpdf', sprintf("%s.pdf",  nm));
    print(h, '-dpng', sprintf("%s.png", nm));
endfunction

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

Переворачивание свертка не помогло, похоже, этот датчик как-то криво откалибровали.
Без него у оставшихся тринадцати разброс относительно медианной температуры был вполне вменяемым:

Дальше я взял третью пару, показания которой были ближе всего к медианным (на графике номера 5 и 6) и вставил ее в нулевой разъем (т.е. теперь это будут датчики 1 и 2), а в остальные разъемы вставил оставшиеся датчики. Вот что получилось:

Все-таки, я напутал с нумерацией и вставил другую пару — где разброс был довольно большим (почти ±0.1°C).
После обеда из дома притащил еще пару датчиков (они так и лежали в рюкзаке вместе с наколенным "показометром", как в субботу померил температуру зеркала, так и не выложил) и вставил их в последний разъем:

Вообще какая-то ерунда выходит: в середине пусто, а показания тяготеют к двум группировкам сверху и снизу. На разности с медианой:

Возможно, это из-за того, что термодатчики еще не стабилизировались по температуре — все-таки, у меня очень дохленькая теплоизоляция (несколько слоев полиэтилена, жестяная банка из-под кофе, пупырчатый полиэтилен в один слой и тряпочка-очковтирательница).
В любом случае, показания очень хорошо укладываются в желаемую точность не хуже 0.1°C. Жаль, что не выйдет сделать полноценного теста в широком диапазоне температур — для этого нужен нормальный термостат, дюралевая плита в пенопластовом ящике, залитая жидким азотом, не дает нормальной стабилизации температуры по всей своей поверхности.
Tags: octave, stm32, термодатчики
Subscribe
promo eddy_em august 17, 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 3 comments