Dieses Blog durchsuchen

Keithley2000 Tischmultimeter
Ein alter Begleiter im Bereich Messgeräte ist das Tischmultimeter von Keithley. In unseren Labors  werden vorwiegend die Typen der 2000er Serie eingesetzt. Es gibt sie in unterschiedlichen Ausstattungsvarianten betreffend der Schnittstellen zur Aussenwelt. Hier ist GBIP-Bus natürlich ein Standard, ebenso wie RS232. Die neueren Geräte besitzen mittlerweile ein LAN Interface mit dem eine Kommunikation über das InternetProtokoll möglich ist. Über jede dieser Schnittstellen kann über "Standard Commands for Programmable Instruments" (SCPI) mit dem Gerät kommuniziert werden. In diesem Beispiel werde ich das Keithley 2000 über Matlab ansteuern und zyklisch über einen längeren Zeitraum Messwerte auslesen, diese in Matlab speichern und schlußendlich in einem Plot ausgeben - quasi einen simplen Datalogger konfigurieren. Der Zweck dieses Aufbaus ist es, den Spannungsverlauf (bzw. auch Strom) eines Akkus bzw. Batterie eines Low-Energie Device zu erfassen.
Rückseite des Keithley 2000



GPIB Interface (IEEE488)



RS232 Schnittstelle

In diesem Beispiel werde ich die serielle Datenübertragung per klassischer RS232 Schnittstelle verwenden, da diese für meine Anwendung vollkommen ausreicht. Zudem kann ich mir die Installation der Treiberpakete für das GPIP-USB Interface ersparen. :) Da viele der aktuellen Rechner und Laptops auch keine RS232 Ports mehr haben, muß ein USB-RS232 Adapter (beispielsweise FTDI232 etc.) her.

USB-RS232 Adaper am Keithley2000


Ist die Verbindung zwischen dem Multimeter und dem Rechner hergestellt, kann, wie in diesem Beispiel, über ein Matlabscript kommuniziert werden. Dem Keithley muß nur mehr mitgeteilt werden, dass es über die serielle Schnittstelle "sprechen" soll. Die folgenden Code-Schnipsel zeigen, wie man einfach über SCPI Daten auslesen kann:


1:   %serialObject = instrfind('Type', 'serial', 'Port', 'COM26', 'Tag', '');  
2:   serialObject = serial('COM26','BaudRate',19200, 'DataBits',8);    
3:  % if isempty(serialObject)  
4:  %   serialObject = serial('COM26','BaudRate',19200, 'DataBits',8);  
5:  % else  
6:  %   fclose(serialObject);  
7:  %   serialObject = serialObject(1)  
8:  % end  
9:    
10:    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
11:    %  
12:    % Sourcemeter 2000 setup  
13:    %  
14:    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
15:    fopen(serialObject)  
16:    s.InputBufferSize = 5000;  
17:    fprintf(serialObject,'*RST');  
18:    fprintf(serialObject,'*CLS');  
19:    
20:    time = now;  
21:    voltage = 0;  
22:  %%   
23:    figureinstanz = figure('NumberTitle','off',...  
24:      'Name','Spannungslogg',...  
25:      'Color',[0 0 0],'Visible','off');  
26:    plotinstanz = plot(voltage,time,'Color','red');  
27:    
28:    %% Messzeit und evtl Messintervall  
29:    stoptime = 10; %60 seconds  
30:    timeInterval = 1; % nix brauch ma jetzt  
31:    
32:    % Messgeraet einstellen  
33:    fprintf(serialObject,':INIT:CONT OFF;:ABOR');  
34:    %fprintf(serialObject,':FORM:DATA ASCII');  
35:    %fprintf(serialObject,':SENS:FUNC "VOLT:DC"');  
36:    %fprintf(serialObject,':SENS:VOLT:DC');  
37:    %fprintf(serialObject,':SENS:VOLT:PROT 4');  
38:    %fprintf(serialObject,':SENS:CURR:RANG:AUTO ON');  
39:    %fprintf(serialObject,':SENS:VOLT:DC:RANGE 10');  
40:    %fprintf(serialObject,':FORM:ELEM VOLT');  
41:      
42:      
43:      
44:  %   %fprintf(serialObject,':TRAC:COUN 1');   
45:  %   %fprintf(serialObject,':TRAC:FEED:CONT NEV');   
46:  %     
47:  %   fprintf(serialObject,':TRAC:CLE');  
48:  %     
49:  %   fprintf(serialObject,':TRAC:POIN 10');  
50:  %   fprintf(serialObject,'TRAC:FEED:SENS');  
51:  %   fprintf(serialObject,'TRAC:FEED:CONT NECT');  
52:  %   fprintf(serialObject,'TRIG:COUN 10');  
53:  %   fprintf(serialObject,':OUTP ON');  
54:  %     
55:  %   fprintf(serialObject,':INIT');  
56:  %   fprintf(serialObject,':TRACE:DATA?');  
57:      
58:      
59:      
60:      
61:      %% Daten abholen  
62:    count = 1; voltage(1)=4  
63:    tic;  
64:    time=toc;  
65:    % while time<=stoptime  
66:    while voltage>=1.5    
67:  %     fprintf(serialObject,':INIT');  
68:  %     fprintf(serialObject,':TRAC:FEED SENS');  
69:  %     fprintf(serialObject,':TRAC:DATA?');   
70:  %  
71:      fprintf(serialObject,':READ?');  
72:      voltage(count) = fscanf(serialObject,'%f');  
73:      time(count) = toc;  
74:      set(plotinstanz,'YData',voltage,'XData',time);  
75:      set(figureinstanz,'Visible','on');  
76:      pause(timeInterval);  
77:      count = count +1;  
78:    end  
79:      
80:    figure(1);  
81:    plot(time,voltage);  
82:    grid on; hold on;  
83:    xlabel('Zeit [s]'); ylabel('Batteriespannung [V]')  
84:    title(Spannungsverlauf Batterie 3V Lithium (2032 mit Modul) im default mode');  
85:      
86:  % fprintf(serialObject,':OUTP OFF');  
87:    %% Put the instrument in local mode  
88:    fprintf(serialObject,'SYSTEM:LOCAL');  
89:    fclose(serialObject);  
Wie so ein Datalog dann aussieht ist in der folgenden Grafik dargestellt. Hier ist der Spannungsverlauf einer nahezu entladenen Batterie bis zum Abschalten des Verbrauchers über die Zeit aufgezeichnet worden.