老的HP34401a没有温度测量功能,在一些情况下使用非常不便。如果有pt100温度探头的话,可以配合做一个高精度温度记录仪,具备鸟枪换炮般的效果。
所需设备和辅材
- HP 34401a 6位半数字万用表
- 铠装pt100温度探头带线
- GPIB线缆
- Agilent 82357B USB - GPIB 转换器
- 冰水混合物
1.如图所示连接好探头和GPIB线缆
2.运行MATLAB,编写程序进行仪器控制,并读取阻值进行转换,铂金电阻阻值与温度的关系如下图所示
为了解决零下的温度,需要求解一个4次方程,为简便期间,使用Matlab进行直接求解。
if(Resi > R0)
% 0 ~ 850℃
% 列出方程系数
coe = [R0*B R0*(A+B) R0-Resi];
% 解方程
result = roots(coe);
% 取第二项解
Temp(1,index) = result(2,1);
else
% -200 ~ 0℃
% 列出方程系数
coe = [R0*C R0*C*(-100) R0*B R0*(A+B) R0-Resi];
% 解方程
result = roots(coe);
% 取第四项解
Temp(1,index) = result(4,1);
end
观察零下的结果会发现,在0 ~ -200范围内,在四个复数根中,只有第四项的虚部是一直为0的,这就是要找的那一项。
3.校准
假设需要更高精度,可以对pt100探头进行校准,方法就是获取0°C时的阻值,实际上可以认为是探头埋入冰水混合物的阻值。
本例子使用的探头放入冰水混合物阻值为100.66Ω。
如下图所示
HP34401A面板显示是这样的
这是采集到的一段烙铁升温和降温曲线,设定温度为480,可能是由于探头并未贴合紧密,烙铁头只有大约200°C的最高温度,最后的室温为25.62°C。
这是测量一段时间冰水混合物的曲线。
完整的测速代码在这里
% HP34401A DMM GPIB温度测试程序
% 1.使用pt100温度探头
% 2.使用后面板
% 3.4线开尔文法测电阻
% 4.使用温度-200 ~ 850
clc;close all;clear all;
%%
inslist = instrfind();
delete(inslist);
v34401a = visa(\'agilent\',\'GPIB0::22::INSTR\');
v34401a.InputBufferSize = 4196*200;
fopen(v34401a);
fprintf(v34401a,\'*IDN?\');
idn = fscanf(v34401a)
%%
% initlize 34401a
fprintf(v34401a,\'*RST\');
fprintf(v34401a,\'*CLS\');
fprintf(v34401a,\'STATus:PRESet\');
fprintf(v34401a,\'*SRE 0\');
fprintf(v34401a,\'*ESE 0\');
fprintf(v34401a,\'CONFigure:FRESistance\');
fprintf(v34401a,\'TRIG:SOUR IMM\');
fprintf(v34401a,\'DISPLAY ON\');
%%
A = 3.9083e-3;
B = -5.775e-7;
C = -4.183e-12;
R0 = 100; %pt100 0度值
N = 1000000;
Temp = zeros(1,N);
%%
p = animatedline;
% 显示起始时间
str = sprintf(\'开始时间:%s\',datestr(datetime(\'now\')));
ht_start = annotation(\'textbox\',\'EdgeColor\',\'none\',\'String\',str,\'Position\',[0.76 0.8 0.1 0.1]);
% 显示当前时间
str = sprintf(\'当前时间:%s\',datestr(datetime(\'now\')));
ht_stop = annotation(\'textbox\',\'EdgeColor\',\'none\',\'String\',str,\'Position\',[0.76 0.75 0.1 0.1]);
xlabel(\'time\');ylabel(\'Temp/℃\');
title(\'温度曲线记录\');
grid on;
for index = 1 : 1 : N
%read lux
fprintf(v34401a,\'READ?\'); % 读取温度
Resi = str2num(fscanf(v34401a)); % 转为double型
if(Resi > R0)
% 0 ~ 850℃
% 列出方程系数
coe = [R0*B R0*(A+B) R0-Resi];
% 解方程
result = roots(coe);
% 取第二项解
Temp(1,index) = result(2,1);
else
% -200 ~ 0℃
% 列出方程系数
coe = [R0*C R0*C*(-100) R0*B R0*(A+B) R0-Resi];
% 解方程
result = roots(coe);
% 取第四项解
Temp(1,index) = result(4,1);
end
% 面板显示当前点温度值,格式[xxx.xx]
str = sprintf(\'DISPLAY:TEXT \'\' %03.02f C\'\'\',Temp(1,index));
fprintf(v34401a,str);
% 动态绘图
addpoints(p,index,Temp(1,index));
axis auto;
% 更新时间
ht_stop.String = sprintf(\'当前时间:%s\',datestr(datetime(\'now\')));
drawnow limitrate
end
%%
% Diconnect from instrument object, obj1.
fclose(v34401a);
% Clean up all objects.
delete(v34401a);
%delete(t1);
烙铁温度数据