Калибровка ZacWire датчиков TSic-506
Nov. 26th, 2013 03:44 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Итак, с подключением датчиков я более-менее разобрался: подал всем на "+" питание +3.3В; "минусы" подключил к ногам МК (пока что использовал ноги для аналогового мультиплексора), работающим в пушпульном режиме; ноги "data" термодатчиков через диоды (Шоттки у меня пока нет, поэтому воткнул какие-то советские с неплохим прямым падением) — к общей шине. В итоге, если сразу же после команды задания адреса на мультиплексор дать команду чтения шины ZacWire, как раз успеваешь считать первую порцию данных (потом уже читать бесполезно: вероятность наткнуться на начало пакета == процентов 10).
Термостата у меня нет, поэтому поступил так: остудил большую дюралевую плиту в морозилке и накрыл ею (через полиэтиленовую прослойку, чтобы от КЗ и конденсата защититься) термодатчики. Стабилизировались они довольно быстро. Для чтения данных я написал простенький консольный клиент (т.к. вручную из com брать hex-данные и конвертировать их в градусы Цельсия совершенно не хотелось — тех четырех сотен контрольных точек я бы точно не получил).
Итак, после логгирования данных в течение почти двух часов, я получил довольно-таки приличную картинку:
Невооруженным глазом заметно, что разница показаний убывает с ростом температур, т.е. теоретически получается, что можно вычислить коэффициенты преобразования показаний термодатчиков в "реальную температуру" и тем самым добиться минимальной ошибки. Практически оно так и оказалось (по крайней мере, на данном участке в 10°C, с более широким разбросом пока калиброваться нет желания: я уверен, что квадратичная аппроксимация на всем интервале от -10°C до +60°C даст приемлемые результаты).
Вот текст "тестилки" на октаве:
Сначала я вычислил среднюю температуру и построил зависимости показаний всех термодатчиков от нее. Туда же воткнул линейные аппроксимации.
По линейным аппроксимациям разностей показаний датчиков и средней температуры
T = Taver * K + A
можно восстановить "реальную" температуру:
Tcorr = (T - A) / (1 + K).
В итоге на графике "скорректированные температуры" vs "время" все три температуры почти неразличимо слились в одну линию. Поэтому опять-таки делаем график разностей между скорректированной и средней температурами:
Получились очень даже приличные результаты.
Думаю, если набрать несколько десятков этих датчиков и по-человечески в термостате их прокалибровать во всем рабочем диапазоне температур, то их показания будут верны с точностью не хуже пяти сотых градуса!!! Правда, возможно, для всего диапазона линейная аппроксимация не подойдет и придется делать квадратичную.
Термостата у меня нет, поэтому поступил так: остудил большую дюралевую плиту в морозилке и накрыл ею (через полиэтиленовую прослойку, чтобы от КЗ и конденсата защититься) термодатчики. Стабилизировались они довольно быстро. Для чтения данных я написал простенький консольный клиент (т.к. вручную из com брать hex-данные и конвертировать их в градусы Цельсия совершенно не хотелось — тех четырех сотен контрольных точек я бы точно не получил).
Итак, после логгирования данных в течение почти двух часов, я получил довольно-таки приличную картинку:
Невооруженным глазом заметно, что разница показаний убывает с ростом температур, т.е. теоретически получается, что можно вычислить коэффициенты преобразования показаний термодатчиков в "реальную температуру" и тем самым добиться минимальной ошибки. Практически оно так и оказалось (по крайней мере, на данном участке в 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
Сначала я вычислил среднюю температуру и построил зависимости показаний всех термодатчиков от нее. Туда же воткнул линейные аппроксимации.
По линейным аппроксимациям разностей показаний датчиков и средней температуры
T = Taver * K + A
можно восстановить "реальную" температуру:
Tcorr = (T - A) / (1 + K).
В итоге на графике "скорректированные температуры" vs "время" все три температуры почти неразличимо слились в одну линию. Поэтому опять-таки делаем график разностей между скорректированной и средней температурами:
Получились очень даже приличные результаты.
Думаю, если набрать несколько десятков этих датчиков и по-человечески в термостате их прокалибровать во всем рабочем диапазоне температур, то их показания будут верны с точностью не хуже пяти сотых градуса!!! Правда, возможно, для всего диапазона линейная аппроксимация не подойдет и придется делать квадратичную.