Optronic Laboratories 740A/D Spectrometer

Getting a 1990 vintage spectrometer running on something more modern than MS-DOS

Public Chat
Similar projects worth following
Picked up this old scanning monochromator system that was used by SITe CCD to test the quantum efficiency of the CCDs they made.

So about three years ago a friend and I picked up this old scanning monochromator that was used by SITe and Tektronix to test the quantum efficiency of their CCDs. Basically they treated the CCD as a giant photodiode and measured the current produced compared to the wavelength of light hitting it. This consisted of the following from Optronic Laboratories, now Gooch and Housego

OL 65DS Constant Current Source - Lamp driver

OL740-20D/UV  UV/Visible Dual Source attachment -Deuterium and Tungsten light source

OL740-1C Automatic Wavelenth Drive - What controls the monochromator 

OL 730A Radiometer/Photometer - Basically a picoammeter.

OL 740A/D Optical Radation Measurement System - The whole thing.

Uniblitz shutter controller

Leading Edge 386SX25 PC with DOS, BASIC,  and Windows 3.0

And a cart that it all went together on. 

This had all been sitting since SITe shut down. The PC actually works and booted once I replaced the BIOS battery and set the hard drive cylinders and sectors. It has Win 3.0 but the program runs under DOS in BASIC. Good thing the computer worked because I would have had hell of a time getting this thing going again since manuals are completely non-existant. 

So the plan is to get this thing working with something more modern than DOS because it is a pain the butt to get files on/off and just to deal with the software in general. 


The BASIC program that ran the spectrometer.

bas - 77.36 kB - 11/22/2020 at 11:43


  • Order Sorting Filters

    Jerry Biehlera day ago 0 comments

    The order sorting filters prevent second and third order reflections from the gratings from interfering with the output. They are long pass filters, one around the 350nn range as well as 600nm range, some have filters higher and lower, this one has one down in the deeper UV as well as a spot for one in the NIR area. And thats why I was getting such a sharp cut off at 1115nm, there was no filter installed, just a blank black aluminum disc. The wheel uses standard 1" filters, I had a bunch of different ones in the NIR range so I checked them out on the spectrometer. Unfortunately they were all notch filters like this one here:

    It is rated for 880nm and a 20nm pass which is pretty dead on. 

    Earlier this year I picked up a little Acton SpectraPro150 from the tektronics company store, it is a little unit maybe about 8"on a side and is controlled by an on-board serial or GPIB port. On a later visit I found the order sorting filter wheel that went with it and picked up that too. Someone added a 900nm long pass filter to that (and marked what they had added) at some point. That sounded like just what I needed so i popped it out and put it in the beam path to check it out before installing it.

    Yep, exactly what it said it was. So it is now installed in the filter.

    Now I need to figure out how to do baseline subtraction. Its harder than I thought it was going to be and have not have had any luck finding out what kind of math I need to handle that. 

  • Opening it up

    Jerry Biehlera day ago 0 comments

    After reading a research paper where they were looking at using one of these unit and the mention of bad drive belts in the wavelength drive I popped the monochromator off the table and pulled off the cover. Pretty neat design:

    The wavelength is selected bu moving a delrin nut aiming a ground thread rod, that moves a bracket that holds a glass plat which a cam follower runs against and rotates the gratings, the two gratings are coupled with tensioned steel cables for zero backlash. At the bottom of the threaded shaft is the encoder which sends the position signal back to the wavelength controller and next to that is a 10 turn pot on a gear. 

    That took me a bit to figure out, it's what controls the order sorting filter. I had known the filter was operated separately from the wavelength controller, I had figured there were just maybe some opto interrupters or something that controlled the position. Nope, they used a 10 turn pot which feeds into the board at the bottom. That board has a quad comparator and measure the voltage of the wiper and as it passes each set point set by the grey trimmers it selects the next filter position. There is a little stepper motor that belt drives the filter wheel which just keeps rotating until a magnet in the wheel travels over a reed switch for whichever position was selected. Simple!

    The drive is accomplished by the Vexta stepper at the top, it is driven by the board at the bottom by what looks like a very simple unipolar stepper design. The motor has two o-rings on an aluminum pulley with a cam mechanism that engages it against a knurled wheel when you want to drive it with the control. Good thing I did pop it open, there was not much left of the o-rings.

    So I replaced the rings and took some Krytox 240AC and greased the gears and popped it back together, it does run a little more smoothly now.

  • Putting it all back together

    Jerry Biehler2 days ago 0 comments

    Now that it works I need to put it all back together. I took the adapter boards and covered the solder connections with tape so they dont short on anything and put a piece of 3M scotchlok on there if I want to mount them. The DB-25 connectors on the control boxes also used bail restraints instead of jack screws so I had to pop open the boxed to replace the bails with standoffs for the jackscrews. 

    Here is inside the radiometer, you can see the little reed relays for the range selection. nothing terribly complex. :

    The wavelength controller, one thing I notice is there is not power semiconductors for the motor, so I am guessing that is all in the monochromator unit itself.

    Finally here is the USB DIO unit and adapter boards.

  • Writing the program

    Jerry Biehler3 days ago 0 comments

    I mentioned in the Vacuum System project that LabVIEW has quite a learning curve, since then I am working a job where I have used it a couple times to build test fixtures and even taken all of the official LabVIEW courses. And I still have issues wrapping my head around it. A lot of times it is throwing things at the screen and see if it works, lol.

    Anyway with the basic program in hand I read through it and just recreated the same program in labview, i managed to find someone that already had a library for LV that handled the 8 bit to BCD conversion I needed so that greatly simplified things. While I was waiting for the corrected boards to show up I went ahead and wrote sections of code to replicate the front panel buttons on the wavelength control and also made a "Go To" state machine loop that allowed me to type in a wavelength and it would go to it. It determines if the Go To wavelength is below or above the current wavelength and then determined how fast it should approach that point based on how far away it was. The spectrometer always approaches the set point from below, so say we set it to 400nm and we are at 500nm, the drive will drive it at high speed to 397nm, stop and then creep slowly to 400nm and stop. If the spectrometer is at 300nm it drives fast to 398nm and then creeps slowly to 400nm and stops. If it is at 397nm it just creeps slowly to the set point.

    Once the new adapter boards showed up I gave it a try and both the spectrometer control and the radiometer readout worked with only a bug each. The state machine did not fare so well, I goofed on some of the comparisons and had to fix that but it was not too bad.

    Next I tackled saving files. Oh boy this was more difficult that it should have been, I probably spent 6 hours trying to get it to save files all the while heading down a dead end path, it just kept dumping data into files even of the machine was not scanning. It all came down to using a value(signaling) tag to trigger the save but it did not operate like I thought. I spent hours thinking I had a signal noise issue and it was just my lack of understanding how it worked. I found out I just needed to have the save inside a state machine, so that means I need to do the next part, the actual scan control.

    For this part I wanted to set the beginning and end wavelengths as well as the interval at which it scans. Also open the shutter and close it at the end of the scan. This took a couple evenings of writing and debugging and tweeting to get it to work like I like, it reuses a lot of the code from the Go To program and then expands on it. 

    Works like this:

    Goes to the start wavelength as before


    opens the shutter,

    waits a programmable dwell period

    saves the radiometer value

    looks to see how far the next increment is to determine how fast it should move

    repeat stop, dwell, save, and increment until it hits the end point set.

    The UI is a mess and I am still tweaking things but it works pretty well now. 

    Here is a link to data from a scan, the little blip at 600 nm is from the order sorting filter kicking in.

  • Random Pics

    Jerry Biehler3 days ago 0 comments

    Some Random Pics

  • Finally doing something with it.

    Jerry Biehler3 days ago 0 comments

    It's a really nice unit, dual grating with gratings on each turret for UV and Visible spectrum. With the current setup it is good for about 200nm to 1115nm. The Du lamp handles 200-400nm and the tungsten covers the rest. It also has the 740-4P Off Axis Telescope.

    So the whole 386 and DOS/BASIC makes it a real pain to use, plus the program is pretty dedicated to doing the QE tests and I really dont want to learn basic to run it plus I would still have to deal with the ISA IO card it runs from,

    So i decided to make a new controller. For the hardware interface I ended up going with an Advantech USB-4751 48-Channel TTL Digital I/O USB Data Acquisition Module. It is pretty much the card inside of the old PC but in USB form. It uses two 50 PIN Opto-22 style ribbon connectors instead of the 40 pin headers on the ISA card. To transition to the DB-25 for the boxes I designed a small board that handles the transition from ribbon to DB-25. I did this in Altium since I use it for work. 

    Of course one cannot make a board without screwing it up. And boy did I! Every connection was wrong. Somehow I managed to get the order of pins wrong on the 50 pin header and then the footprint I used in Altium for the DB-25 was totally wrong. So I literally did not get one pin right. So I fix that and send of another order to JLCPCB and a week later I get good boards. 

    So now that the hardware is "Done" I tackle the hardware. I cant program worth a damn so I use LabVIEW which I also use for work. The advantech DIO device has good LabVIEW drivers that make it pretty easy to build an interface. Well, compared to the first unit I picked up from SeaLevel, it was an older unit and didn't have any really labview drivers and I really didn't feel like figuring it out so I picked up the Advantech. $111 shipped, not bad!

  • Reverse Engineering the BASIC Program

    Jerry Biehler3 days ago 0 comments

    I uploaded a copy of the BASIC program that ran the system. The important part was this, which I annotated what it did. With this Information and finding the interface to the spectrometer is a 48 line DIO board I was able to figure out what lines did what. 

    1110 P1CW = 528: P1C = 529: P1B = 530: P1A = 531
    1120 P2CW = 532: P2C = 533: P2B = 534: P2A = 535
    1130 OUT P1CW, 147: OUT P2CW, 147
    1140 HIMASK = 240: LOMASK = 15 '240 is 11110000 15 is 00001111'
    9110 '
    9115 IF SRCE% <> 1 THEN GOSUB 11000: RETURN  ' skip this sub if alt input (QE STATION)
    9120 FOR I = 1 TO 450 * ms: NEXT I
    9130 PORT2A = INP(P2A): PORT2B = INP(P2B): PORT2C = INP(P2C)
    9140 DATAREADY = ((PORT2C AND 8) / 8) 'Bit 3'
    9150 IF DATAREADY = 1 THEN 9130
    9180 PORT2C1 = PORT2C AND 1 'Bit 0'
    9190 EXPONENT = ((PORT2C AND 4) / 4) 'Check Bit 2, gives a 1 if high this is for exponents over 9'
    9200 POWER = -(EXPONENT * 10 + PORT2ALO) 'if bit 3 high, add 10 to exponent from bits 3-0
    9210 MANTISSA = PORT2C1 * 1 + PORT2BHIGH * .1 + PORT2BLO * .01 + PORT2AHIGH * .001
    9220 s = MANTISSA * (10 ^ POWER): RETURN
    9230 '
    '9240 ' -------------------------------- 9 -------------------------------------
    '9250 '
    '9260 ' SUBROUTINE (9): Read 740-1C wavelength
    '9270 '
    '9280 PORT1A = INP(P1A): PORT1B = INP(P1B): PORT1C = INP(P1C)
    '9310 PORT1C3 = PORT1C AND 3
    '9320 W1 = (PORT1C3 * 1000 + PORT1BHIGH * 100 + PORT1BLO * 10 + PORT1AHIGH * 1 + PORT1ALO * .1)
    '9330 RETURN
    SUB GOTOWAVE (lambda)
         L1 = 400
     OUT P1C, 112: OUT P1C, 240  ' fast/neutral
     CALL ioread(W1) 'GOSUB 9260 ' SUBROUTINE (9): Read wavelength
     IF W1 < L1 - 11 THEN GOTO forw ELSE GOTO revrs
    revrs: OUT P1C, 192: OUT P1C, 224: OUT P1C, 240   ' reverse/start/neutral
     FOR I = 1 TO 10 * ms: NEXT I' delay loop
     WHILE W1 > L1 - 11
     CALL ioread(W1) ' GOSUB 9260 ' SUBROUTINE (9): Read wavelength
    forw: OUT P1C, 128: OUT P1C, 224: OUT P1C, 240   ' forward/start/neutral
     FOR I = 1 TO 10 * ms: NEXT I' delay loop
     WHILE W1 < L1 - 1.4
     CALL ioread(W1) ' GOSUB 9260 ' SUBROUTINE (9): Read wavelength
     OUT P1C, 208: OUT P1C, 240  ' slow/neutral
     WHILE W1 < L1
     CALL ioread(W1) '  GOSUB 9260 ' SUBROUTINE (9): Read wavelength
     OUT P1C, 160: OUT P1C, 240  ' stop/neutral

    So from this we see that the output of both the spectrometer control and the radiometer use BCD outputs and the wavelength control is commanded by the high nibble on the Port C of the controller. Ringing out the cable I find the pinouts for the two DB-25s on the boxes.

    Spectrometer pinouts 
    Port C Bit 1 is for negative

    DB-24    IOCard.  Port/Bit
    1 21 A0
    2 22 A1
    3 23 A2
    4 24 A3
    5 25 A4
    6 26 A5
    7 27 A6
    8 28 A7
    9 13 B0
    10 14 B1
    11 15 B2
    12 16 B3
    13 17 B3
    14 18 B5
    15 19 B6
    16 20 B7
    17 11 C0
    18  31 C1
    19 12 C2
    20 32 C3
    21 9 C4
    22 29 C5
    23 10 C6
    24 30 C7
    25 40 GND

    And from the program we see that these are the control signals. The sequence is direction, speed or both, followed by start and the sequence is ended with "neutral" which just pushes the pins to a high idle state. 

    Port C Bits 7-0, Function, Hex, Dec
    11110000 Neutral (used after commands) F0 240
    11000000 Reverse C0 192
    10000000 Forward 80 128
    11100000 Start E0 224
    01110000 Fast 70 112
    11010000 Slow D0 208
    10100000 Stop A0 160

    I had this figured out about three years ago. And then like half my projects it just sat.

View all 7 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates