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

Category:

Калибровка ZacWire датчиков TSic-506

Итак, с подключением датчиков я более-менее разобрался: подал всем на "+" питание +3.3В; "минусы" подключил к ногам МК (пока что использовал ноги для аналогового мультиплексора), работающим в пушпульном режиме; ноги "data" термодатчиков через диоды (Шоттки у меня пока нет, поэтому воткнул какие-то советские с неплохим прямым падением) — к общей шине. В итоге, если сразу же после команды задания адреса на мультиплексор дать команду чтения шины ZacWire, как раз успеваешь считать первую порцию данных (потом уже читать бесполезно: вероятность наткнуться на начало пакета == процентов 10).


Термостата у меня нет, поэтому поступил так: остудил большую дюралевую плиту в морозилке и накрыл ею (через полиэтиленовую прослойку, чтобы от КЗ и конденсата защититься) термодатчики. Стабилизировались они довольно быстро. Для чтения данных я написал простенький консольный клиент (т.к. вручную из com брать hex-данные и конвертировать их в градусы Цельсия совершенно не хотелось — тех четырех сотен контрольных точек я бы точно не получил).

Итак, после логгирования данных в течение почти двух часов, я получил довольно-таки приличную картинку:

Tx
Показания термодатчиков

Невооруженным глазом заметно, что разница показаний убывает с ростом температур, т.е. теоретически получается, что можно вычислить коэффициенты преобразования показаний термодатчиков в "реальную температуру" и тем самым добиться минимальной ошибки. Практически оно так и оказалось (по крайней мере, на данном участке в 10°C, с более широким разбросом пока калиброваться нет желания: я уверен, что квадратичная аппроксимация на всем интервале от -10°C до +60°C даст приемлемые результаты).

Вот текст "тестилки" на октаве:
[time T1 T2 T3] = textread('termout.txt', "%d %f %f %f");
plot(double(time-time(1)), [T1 T2 T3])
title("Temperatures")
xlabel("time, seconds")
ylabel("Tx, \\circ{}C")
legend(["T1"; "T2"; "T3"])
print -dpng Tx.png
print -deps -color Tx.eps
Taver=(T1+T2+T3)/3;
X=[Taver ones(size(T1))];
X\(T1-Taver)
X\(T2-Taver)
X\(T3-Taver)
K = [-0.010484 -0.0027880 0.013272];
A = [0.272829 0.0648528 -0.337681];
plot(Taver,[T1 T2 T3]-Taver, Taver, Taver*K+A)
legend(["dT1"; "dT2"; "dT3"; "-0.010484*T+0.272829"; "-0.0027880*T+0.0648528"; "0.013272*T-0.337681"])
xlabel("T (average), \\circ{}C")
ylabel("Tx - T(average), \\circ{}C")
std((T1-Taver)+K(1)*Taver+A(1))
std((T2-Taver)+K(2)*Taver+A(2))
std((T3-Taver)+K(3)*Taver+A(3))
title("Tx-, std=0.08, 0.02, 0.10")
print -dpng dTx.png
print -deps -color dTx.eps
T1corr = (T1-A(1)) / (1 + K(1));
T2corr = (T2-A(2)) / (1 + K(2));
T3corr = (T3-A(3)) / (1 + K(3));
plot(Taver,[T1corr T2corr T3corr]-Taver)
legend(["T1corr";"T2corr";"T3corr"])
std([T1corr T2corr T3corr]-Taver)
title("Corrected temperatures. std = 0.020, 0.020, 0.015")
xlabel("T (average), \\circ{}C")
ylabel("Txcorr - T(average), \\circ{}C")
print -deps -color dTxcorr.eps
print -dpng dTxcorr.png


Сначала я вычислил среднюю температуру и построил зависимости показаний всех термодатчиков от нее. Туда же воткнул линейные аппроксимации.

dTx
Разности показаний термодатчиков и средней температуры vs средняя температура


По линейным аппроксимациям разностей показаний датчиков и средней температуры
T = Taver * K + A
можно восстановить "реальную" температуру:
Tcorr = (T - A) / (1 + K).
В итоге на графике "скорректированные температуры" vs "время" все три температуры почти неразличимо слились в одну линию. Поэтому опять-таки делаем график разностей между скорректированной и средней температурами:

dTxcorr
Скорректированные разности показания vs средняя температура

Получились очень даже приличные результаты.

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


Tags: octave, stm32, железяки, термодатчики
Subscribe

  • Чем бы таким заменить STM32F072C8T6?

    Полез сейчас на али цены посмотреть, а там… В среднем уже по 600-700 рублей за штучку просят! Вообще охамели. И это - гарантированно БУшные ведь!.. А…

  • Понаблюдал, блин!

    Опять у нас что-то с сетью поломали. Хотел было протестировать, как наша подвесная часть оптоволоконного спектрографа работает, а из дома связь с…

  • Дохлый SSD

    Писал уже о китайском SSD, сдохшем за полтора месяца работы. Вот он, герой: Сегодня у нас опять работы с оптоволоконным спектрографом на цейссе,…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 4 comments