eddy_em: (Костерок)
[personal profile] eddy_em
Итак, с подключением датчиков я более-менее разобрался: подал всем на "+" питание +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 средняя температура

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

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


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. 23rd, 2025 07:46 am
Powered by Dreamwidth Studios