Pfeiffer Full Range Gauges

Vendors who sell surplus

Pfeiffer Full Range Gauges

Postby Jerry » Mon Mar 17, 2014 1:27 pm

http://www.ebay.com/itm/BALZERS-PKR-250 ... 1281691191

I offered 50, they countered $100, I countered $75 and got one.

These are nice gauges, they read from atmosphere to UHV, the ion portion switches on when it gets down to that level. The output is a log/lin analog signal. I wrote an arduino program to handle the signal for the ion only version. I will modify it for these gauges.
Jerry
 
Posts: 573
Joined: Sun Jul 18, 2010 12:07 am
Location: Beaverton, OR

Re: Pfeiffer Full Range Gauges

Postby Doug Coulter » Mon Mar 17, 2014 3:46 pm

A couple of us here use their PKR-251, which I believe is quite similar. A very nice gage. The only hassle with the 251 is the output is logged. So you have to exponentiate it with various fudge factors in an equation to get a real reading out of it. Minor unless you have a low-rez a/d to read it.
Posting as just me, not as the forum owner. Everything I say is "in my opinion" and YMMV -- which should go for everyone without saying.
User avatar
Doug Coulter
 
Posts: 3515
Joined: Wed Jul 14, 2010 7:05 pm
Location: Floyd county, VA, USA

Re: Pfeiffer Full Range Gauges

Postby Jerry » Mon Mar 17, 2014 4:36 pm

Doug Coulter wrote:A couple of us here use their PKR-251, which I believe is quite similar. A very nice gage. The only hassle with the 251 is the output is logged. So you have to exponentiate it with various fudge factors in an equation to get a real reading out of it. Minor unless you have a low-rez a/d to read it.


I think it is just an update in the electronics, it uses the same repair kit as the 251.

I am using the teensy with 10 bit in, easily enough resolution. I got this to stick on the little turbo on my pressure reduction system so I know when it is OK to turn on the RGA.

-Jerry
Jerry
 
Posts: 573
Joined: Sun Jul 18, 2010 12:07 am
Location: Beaverton, OR

Re: Pfeiffer Full Range Gauges

Postby chrismb » Mon Mar 17, 2014 5:19 pm

For interest, I seem to recall I have pinned up photos of the innards of my PKR-251 somewhere here (when the linear power supply I was using to power it blew a transistor and ran 60V into it - the directional protection diode did its stuff and blew, and all was fine again once replaced).

I got mine for ~$15. :)
chrismb
 
Posts: 620
Joined: Thu Aug 05, 2010 6:32 pm

Re: Pfeiffer Full Range Gauges

Postby Jerry » Mon Mar 17, 2014 5:28 pm

Yeah, I remember seeing that. You never finished that thread and was wondering what the outcome was.
Jerry
 
Posts: 573
Joined: Sun Jul 18, 2010 12:07 am
Location: Beaverton, OR

Re: Pfeiffer Full Range Gauges

Postby chrismb » Mon Mar 17, 2014 5:30 pm

Really? Oh, yes, I fitted a new transorb, slightly the wrong package size but fit for the job, and managed to get it all back together, and just taped it up with insulation tape (because you have to physically break the plastic cage all the boards sit in to get it out - 'not a serviceable part' I think they call it!! :D We service anything here, 'non-serviceable' or otherwise! )
chrismb
 
Posts: 620
Joined: Thu Aug 05, 2010 6:32 pm

Re: Pfeiffer Full Range Gauges

Postby Doug Coulter » Mon Mar 17, 2014 5:41 pm

Here's the code for the crucial math in my 4d plot program - changes a/d input to millibars:

$c = 10**((1.667*$a2*$calfactor*2.013)-11.33); # pressure

$a2 is the a/d input - it's that 10 to the (rest of math)....that makes things look bad.
The 2.013 is because to get the output into a 5v range, I needed a divide by two in hardware, and the 1% resistors didn't quite match. Calfactor is derived by sampling a reference diode to compensate a/d full scale changes due to 5v changing (the data aq box is USB powered). It's 12 bits, and still not that great, frankly. Gets really "notchy" like the Pfeiffer controller does, which is also 12 bits. Cramming 12 (1e3 mbar to 1e-9) decades into a little less than 10v range...via an analog log = issues.
But yeah, for a mass spec...not a problem, just that it's only good to about 2 digit accuracy, almost (notchy, not all the numbers in two digits exist) and the right exponent is good enough for that.

It also reads right around factor of two high on things like deuterium. It's in the manual.
Posting as just me, not as the forum owner. Everything I say is "in my opinion" and YMMV -- which should go for everyone without saying.
User avatar
Doug Coulter
 
Posts: 3515
Joined: Wed Jul 14, 2010 7:05 pm
Location: Floyd county, VA, USA

Re: Pfeiffer Full Range Gauges

Postby Jerry » Mon Mar 17, 2014 11:58 pm

I •think• this is the final code for the arduino I used, It also handled the sampling valves on the system and handled turning on/off both pumps plus shut the valves in an overpressure. This is just for the standard IKR series ion gauge.

Code: Select all

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(PIN_D0, PIN_B7, PIN_B3, PIN_B2, PIN_B0, PIN_B1);
const int numReadings = 10;
int readings[numReadings];      // the readings from the analog input
int index = 0;                  // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average
int decade;
int inputPin = 9;
int exponent;
float torr;
float pa;
float volts;
float pressure;
float significand;
float x;
int error;
int state = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin
int state1 = HIGH;      // the current state of the output pin
int reading1;           // the current reading from the input pin
int previous1 = LOW;    // the previous reading from the input pin
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long time1 = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers
int state2 = HIGH;      // the current state of the output pin
int reading2;           // the current reading from the input pin
int previous2 = LOW;    // the previous reading from the input pin
long time2 = 0;         // the last time the output pin was toggled
int state3 = HIGH;      // the current state of the output pin
int reading3;           // the current reading from the input pin
int previous3 = LOW;    // the previous reading from the input pin
long time3 = 0;         // the last time the output pin was toggled
int state4 = HIGH;      // the current state of the output pin
int reading4;           // the current reading from the input pin
int previous4 = LOW;    // the previous reading from the input pin
long time4 = 0;         // the last time the output pin was toggled
int stateo = HIGH;      // the current state of the output pin
int readingo;           // the current reading from the input pin
int previouso = LOW;    // the previous reading from the input pin
long timeo = 0;
int mvenab;
int pvenab;
int override = LOW;
int overridden = LOW;
void setup()
{
  // initialize serial communication with computer:
  Serial.begin(9600);   

  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;
  pinMode (PIN_F4, OUTPUT);  //Turbo Pump
  pinMode (PIN_F5, OUTPUT);  //Fore Pump
  pinMode (PIN_F0, OUTPUT);  //Main Valve
  pinMode (PIN_F1, OUTPUT);  //Probe Valve
  pinMode (PIN_D2, INPUT_PULLUP);  //Override Input
  pinMode (PIN_C7, INPUT_PULLUP);  //Main Valve Input
  pinMode (PIN_C6, INPUT_PULLUP);  //Probe Valve Input
  pinMode (PIN_D3, INPUT_PULLUP);  //Turbo In
  pinMode (PIN_D6, INPUT_PULLUP);  //Fore In
  pinMode (PIN_D1, INPUT_PULLUP);  //Mode Switch
  lcd.begin(24, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  // Print a message to the LCD.
  lcd.print("FP:   TP:   MV:   PV:");   

}

void loop() {
  reading = digitalRead(PIN_D3); // Turbo Control
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
    time = millis();   
  }
  digitalWrite(PIN_F5, state);
  previous = reading;
  reading1 = digitalRead(PIN_D6); // Fore Control
  if (reading1 == HIGH && previous1 == LOW && millis() - time1 > debounce) {
    if (state1 == HIGH)
      state1 = LOW;
    else
      state1 = HIGH;
    time1 = millis();   
  }
  previous1 = reading1;
  digitalWrite(PIN_F4, state1);
  if (state == 0) {
    lcd.setCursor(10, 0);
    lcd.print(byte(0x95));
  }
  else {
    lcd.setCursor(10, 0);
    lcd.print(byte(0x94));
  }
  if (state1 == 0) {
    lcd.setCursor(4, 0);
    lcd.print(byte(0x95));
  }
  else {
    lcd.setCursor(4, 0);
    lcd.print(byte(0x94));
  }
  reading2 = digitalRead(PIN_D1); // Pressure Mode Switch
  if (reading2 == HIGH && previous2 == LOW && millis() - time2 > debounce) {
    if (state2 == HIGH)
      state2 = LOW;

    else
      state2 = HIGH;

    time2 = millis();   
  }
  previous2 = reading2;
 

  // subtract the last reading:
  total= total - readings[index];         
  // read from the sensor: 
  readings[index] = analogRead(inputPin);
  // add the reading to the total:
  total= total + readings[index];       
  // advance to the next position in the array: 
  index = index + 1;                   

  // if we're at the end of the array...
  if (index >= numReadings)             
    // ...wrap around to the beginning:
    index = 0;                           

  // calculate the average:
  average = total / numReadings;
  volts = average * .0097;   
  if (state2 == 0)  torr = volts - 2.1249;
  else torr = volts - 2;
  x = torr - 1.5;
  decade = floor(x);
  exponent = decade - 7;
  significand = pow(10,(x - decade));


  //Serial.println(x); 
  Serial.println(volts);
  Serial.println(average);
  //Serial.println(decade);
  //Serial.println(significand);
  if (volts >= 1.8 && volts <= 8.5) {
    lcd.setCursor(4, 1);
    // Print a message to the LCD.
    lcd.print("e");
    lcd.setCursor(0, 1);
    lcd.print(significand);
    lcd.setCursor(5, 1);
    lcd.print(exponent);
    error = 0;
    if (state2 == 0) {

    lcd.setCursor(7, 1);
    lcd.print(" Torr");
  }
  else {
    lcd.setCursor(7, 1);
    lcd.print(" mBar");
  }
  }
  else {
    if (volts > 8.5) {
      lcd.setCursor(0, 1);
      lcd.print(" Overrange     ");
      error = 1;
    }
    if (volts < 1.8 && volts > 0.5) {
      lcd.setCursor(0, 1);
      lcd.print(" Underrange     ");
      error = 0;
    }
    if (volts < 0.5) {
      lcd.setCursor(0, 1);
      lcd.print("Sensor Error   ");
      error = 1;
    }
  }

  if (volts < 6.5 && error == 0) pvenab = 1;
  else pvenab = 0; 
  if (volts < 6.5 && error == 0) mvenab = 1;
  else mvenab = 0;
  readingo = digitalRead(PIN_D2); // Overridee Switch
  if (readingo == HIGH && previouso == LOW && millis() - timeo > debounce) {
    if (stateo == HIGH)
      stateo = LOW;   
    else
      stateo = HIGH;   
    timeo = millis();   
  }
  previouso = readingo;
  stateo = override;
  reading3 = digitalRead(PIN_C7); // Main Valve Switch
  if (reading3 == HIGH && previous3 == LOW && millis() - time3 > debounce) {
    if (state3 == HIGH)
      state3 = LOW;   
    else
      state3 = HIGH;   
    time3 = millis();   
  }
  previous3 = reading3;
  //if (mvenab == 0 && override == 1) overridden = 1;
  if (override == HIGH || mvenab == 1) digitalWrite(PIN_F0, state3);
  else {
    digitalWrite(PIN_F0, LOW);
    state3 = 0;
  }
  reading4 = digitalRead(PIN_C6); // Probe Valve Switch
  if (reading4 == HIGH && previous4 == LOW && millis() - time4 > debounce) {
    if (state4 == HIGH)
      state4 = LOW;   
    else
      state4 = HIGH;     
    time4 = millis();   
  }
  previous4 = reading4;
  if (pvenab == 1) digitalWrite(PIN_F1, state4);
  else {
    digitalWrite(PIN_F1, LOW);
    state4 = 0;
  }
  if ( state3 == HIGH && override == LOW) {
    lcd.setCursor(16,0);
    lcd.print(byte(0x3D));
  }
  else {
    if (state3 == HIGH && mvenab == 1) {
      lcd.setCursor(16,0);
      lcd.print(byte(0x88));
    }
    else {
      lcd.setCursor(16,0);
      lcd.print(byte(0x8D));
    }
  }
  if (state4 == HIGH) {
    lcd.setCursor(22,0);
    lcd.print(byte(0x3D));
  }
  else {
    lcd.setCursor(22,0);
    lcd.print(byte(0x8D));
  }


  delay(50);
}



Jerry
 
Posts: 573
Joined: Sun Jul 18, 2010 12:07 am
Location: Beaverton, OR


Return to Surplus

Who is online

Users browsing this forum: No registered users and 1 guest

cron