/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: Pst3202Channel.java * Written by Tom O'Neill, Sun Microsystems. * * Copyright (c) 2004 Sun Microsystems and Static Free Software * * 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 setting a voltage level supplied by a single channel of an Instek * PST-3202 programmable DC power supply, using the device-independent interface * {@link PowerChannel}. * <P> * This class should now be instantiated from a {@link Model#createPowerChannel(String, String, int, int, String)} */ public class Pst3202Channel extends PowerChannel { /** * The Instek PST-3202 programmable DC power supply that provides the * voltage level in question */ private final Pst3202 supply; /** Channel of power supply that supplies the voltage */ private final int channel; /** * Creates an object to control a PST-3202 power supply using the methods of * the device-independent PowerChannel abstract class. * <P> * Instead of this, you should use * {@link Model#createPowerChannel(String, String, int, int, String)}. * I have left it public for backwards compatability. * * @param channelName * name of signal on this channel of the power supply * @param supplyName * <code>gpibconf</code> identifier for the power supply * @param channel * Channel of the supply to control */ public Pst3202Channel(String channelName, String supplyName, int channel) { Pst3202.checkChannel(channel); this.name = channelName + " (" + supplyName + " channel " + channel + ")"; supply = new Pst3202(supplyName); this.channel = channel; logInit("Initialized Pst3202Channel " + this.name); } /** @return Returns the name of the Pst3202 */ public String getSupplyName() { return supply.getName(); } /** * @return Returns the channel number within the Pst3202 device. */ public int getChannel() { return channel; } /** * Returns string indicating state of the channels */ public String getState() { return supply.getState(channel); } /** * Reads back the voltage provided by this channel of the power supply. * * @return voltage drawn over this channel, in Volts */ public float readVoltage() { logOther("Reading voltage on " + getName()); return this.supply.readVoltage(this.channel); } /** * Set the channel's voltage to the value provided * * @param volts * new voltage for the channel, in Volts */ public void setVoltageNoWait(float volts) { logSet("Pst3202Channel setting voltage on " + getName() + " to " + volts + " V"); if (this.supply.setVoltage(this.channel, volts) == false) { try { Thread.sleep(1000); } catch (InterruptedException _) { } if (this.supply.setVoltage(this.channel, volts) == false) { Infrastructure.fatal(this.getName() + " power supply error setting voltage " + volts); } } } public void waitForVoltage(float setVolts) { if (supply.isDisabled()) return; super.waitForVoltage(setVolts); } /** * Get the channel's voltage setpoint * * @return voltage setpoint for the channel, in Volts */ public float getVoltageSetpoint() { logOther("Reading voltage setpoint on " + getName()); return this.supply.getVoltageSetpoint(this.channel); } /** * Returns voltage resolution of power supply. * * @return voltage resolution of power supply */ public float getVoltageResolution() { logOther("Getting voltage resolution on " + getName()); return Pst3202.getVoltageResolution(this.channel); } /** * Reads back the current provided by this channel of the power supply. * * @return current drawn over this channel, in Amps */ public float readCurrent() { logOther("Reading current on " + getName()); return this.supply.readCurrent(this.channel); } /** * Set the channel's current limit to the value provided * * @param amps * new current limit for the channel, in Amps */ public void setCurrent(float amps) { logSet("Setting current limit on " + getName() + " to " + amps); supply.setCurrent(channel, amps); } /** * Get the channel's current setpoint * * @return current setpoint for the channel, in Amps */ public float getCurrentSetpoint() { logOther("Reading current setpoint on " + getName()); return supply.getCurrentSetpoint(this.channel); } /** * 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 }; Pst3202Channel channel1 = new Pst3202Channel("chan1", "hPst3202", 1); Pst3202Channel channel2 = new Pst3202Channel("chan2", "hPst3202", 2); Pst3202Channel channel3 = new Pst3202Channel("chan3", "hPst3202", 3); System.out.println("Voltage setpoints: " + channel1.getVoltageSetpoint() + ", " + channel2.getVoltageSetpoint() + ", " + channel3.getVoltageSetpoint()); System.out.println("Voltages read: " + channel1.readVoltage() + ", " + channel2.readVoltage() + ", " + channel3.readVoltage()); System.out.println("Current limits: " + channel1.getCurrentSetpoint() + ", " + channel2.getCurrentSetpoint() + ", " + channel3.getCurrentSetpoint()); System.out.println("Currents read: " + channel1.readCurrent() + ", " + channel2.readCurrent() + ", " + channel3.readCurrent()); channel3.setCurrent(2.0f); System.out.println("Chan 1 resolution: " + channel1.getVoltageResolution() + " V"); System.out.println("Chan 2 resolution: " + channel2.getVoltageResolution() + " V"); System.out.println("Chan 3 resolution: " + channel3.getVoltageResolution() + " V"); if (false) { int nsweep = 0; do { for (float volts = 1.0f; volts < 1.85f; volts += 0.01f) { channel1.setVoltageNoWait(volts); channel3.setVoltageWait(volts); channel1.waitForVoltage(volts); System.out.print(nsweep + ", " + volts + " V; "); System.out.println(channel1.getState()); } nsweep++; } while (true); } } }