eddy_em: (Default)
[personal profile] eddy_em
Постепенно код для контроллера термодатчиками обрастает новыми функциями. Пока что он умеет лишь включать-выключать питание датчиков, вычислять температуры 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. Жаль, что не выйдет сделать полноценного теста в широком диапазоне температур — для этого нужен нормальный термостат, дюралевая плита в пенопластовом ящике, залитая жидким азотом, не дает нормальной стабилизации температуры по всей своей поверхности.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 30th, 2025 02:49 pm
Powered by Dreamwidth Studios