/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Agilent34970AChannel.java
* Written by Tom O'Neill.
*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.simulation.test;
/**
* Class for reading a voltage level on a single channel of an Agilent 34970A
* data acquisition/switch unit.
*/
public class Agilent34970AChannel implements VoltageReadable {
/** The Agilent34970A device to measure the voltage on */
private final Agilent34970A dvm;
/** Channel of power supply that supplies the voltage */
private final int channel;
/** Name of signal connected to the channel */
public final String name;
private String voltageRange = "DEF";
private String voltageResolution = "DEF";
/** Number of power line cycles to integrate over. Default is 10. */
private String voltageNPLC = "10";
/** Identifier for measurement function during previous read */
private int lastFunction = FUNCTION_UNDEFINED;
/**
* Value when the function must be configured before a measurement can be
* made. Occurs before first measurement, and after a change in
* configuration.
*/
public static final int FUNCTION_UNDEFINED = -1;
public static final int FUNCTION_VOLTAGE = 0;
public static final int FUNCTION_CURRENT = 1;
/**
* Creates an object to read voltages on a single channel of an Agilent
* 34970A data acquisition unit, using the device-independent
* VoltageReadable interface.
*
* @param channelName
* name of signal on this channel of the Agilent 34970A
* @param dvmName
* <code>gpibconf</code> identifier for the Agilent 34970A
* @param channel
* Channel number of the Agilent 34970A to measure on
*/
public Agilent34970AChannel(String channelName, String dvmName, int channel) {
this.name = channelName;
dvm = new Agilent34970A(dvmName);
this.channel = channel;
}
/**
* @param voltageRange
* The voltageRange to set.
*/
public void setVoltageRange(String voltageRange) {
this.voltageRange = voltageRange;
if (lastFunction == FUNCTION_VOLTAGE)
lastFunction = FUNCTION_UNDEFINED;
}
/**
* @return Returns the voltageRange.
*/
public String getVoltageRange() {
return voltageRange;
}
/**
* @param voltageResolution
* The voltageResolution to set.
*/
public void setVoltageResolution(String voltageResolution) {
this.voltageResolution = voltageResolution;
if (lastFunction == FUNCTION_VOLTAGE)
lastFunction = FUNCTION_UNDEFINED;
}
/**
* @return Returns the voltageResolution.
*/
public String getVoltageResolution() {
return voltageResolution;
}
/**
* Set the number of power line cycles to integrate the voltage measurement
* over. Can greatly speed up the measurement, at the cost of accuracy.
*
* @param voltageNPLC
* The voltageNPLC to set.
*/
public void setVoltageNPLC(String voltageNPLC) {
this.voltageNPLC = voltageNPLC;
if (lastFunction == FUNCTION_VOLTAGE)
lastFunction = FUNCTION_UNDEFINED;
}
/**
* @return Returns the voltageNPLC.
*/
public String getVoltageNPLC() {
return voltageNPLC;
}
/**
* Measure voltage on this channel using the measurement parameters
* specified by the methods {@link #setVoltageRange},
* {@link #setVoltageResolution}, and {@link #setVoltageNPLC}. For fast
* but possibly inaccurate measurements, choose {@link #setVoltageRange}
* <tt>("DEF")</tt>,{@link #setVoltageResolution}<tt>("MAX")</tt>,
* and {@link #setVoltageNPLC}<tt>(0.02)</tt>.
*
* @return voltage measured on this channel, in Volts
*/
public float readVoltage() {
if (lastFunction != FUNCTION_VOLTAGE || dvm.lastChannel != channel) {
System.out.println("Configuring voltage on channel " + channel);
dvm.write("CONF:VOLT:DC " + getVoltageRange() + ","
+ getVoltageResolution() + ", (@" + channel
+ ");:VOLT:DC:NPLC " + getVoltageNPLC() + ", (@" + channel
+ ")");
}
dvm.write("READ?");
dvm.lastChannel = channel;
lastFunction = FUNCTION_VOLTAGE;
return dvm.readFloat(40);
}
/**
*
*/
private long timeReadVoltage() {
long startTime = java.lang.System.currentTimeMillis();
for (int ind = 0; ind < 200; ind++) {
System.out.println(readVoltage());
}
long endTime = java.lang.System.currentTimeMillis();
System.out.println("dt = " + (endTime - startTime));
return (endTime - startTime);
}
/**
*
*/
private void measureReadVoltageTimes() {
System.out.println("Default 4-digit:");
setVoltageResolution("MAX");
setVoltageNPLC("1");
long defaultTime = timeReadVoltage();
setVoltageResolution("MAX");
setVoltageNPLC("0.02");
System.out.println("Fast:");
long fastTime = timeReadVoltage();
System.out.println("MAX resolution times for 200 reads,"
+ " as function of NPLC:");
System.out.println("1.00: " + defaultTime);
System.out.println("0.02: " + fastTime);
}
/**
* Unit tests, prints current as function of voltage for channel 1. Should
* disconnect supply from any chips before waiting.
*
* @param args
* Ignored
*/
public static void main(String[] args) {
Infrastructure.gpibControllers = new int[] { 1 };
Agilent34970AChannel channel = new Agilent34970AChannel("test",
"HP34970", 101);
Agilent34970AChannel channel2 = new Agilent34970AChannel("test2",
"HP34970", 102);
System.out.println(channel.name + ": " + channel.readVoltage());
System.out.println(channel2.name + ": " + channel2.readVoltage());
channel2.measureReadVoltageTimes();
}
}