Robotic Scope Probe

Probing an arbitrary number of test points on a PCBA via the Lager API was one of the bigger challenges we faced when designing the Lager platform. Most oscilloscopes are limited to 2 or 4 channels of waveforms. But only being able to probe up to 4 waveforms was too limiting for our purpose.

Our initial solution was to design an analog multiplexer using the Maxim MAX1466 multiplexer. We stacked 4 of these chips, and we were able to create a configurable 32:1, 16:2 or 8:4 MUX (i.e. 32 test points to a single scope channel, 16 test points that go to 2 channels simultaneously, or 8 test points that go to 4 channels simultaneously.)

Custom Lager MUX Board

Although our design turned out ok, we still had some issues. For example we had limited bandwidth (20MHz) which is an order of magnitude less than the bandwidth of the oscilloscope. Another issue was the wire length between the PCBA, our analog MUX, and scope probe. The increased impedance was non-trivial, and could have a pretty big effect on the waveform.

Next we looked into buying professionally built, off the shelf, analog switches. These are actually quite common in the telecommunications world, and can easily handle bandwidths into the GHz range, with almost no crosstalk. However, they are very expensive. A 6:1 telecommunications switch can run you a few thousand dollars. This was unfortunately a non-starter, because scaling this would be too expensive.

We then had a crazy idea. What if instead of bringing the waveforms to the oscilloscope probe via an analog mux, we brought the scope probe directly to the PCBA itself. So we started playing around with robotic arms, until we eventually landed on our solution.

The way it works is when we instrument a new board we gather the {% c-line %}x,y{% c-line-end %} location of each test point. A user can then enable a test point by name (e.g. {% c-line %}3V3{% c-line-end %}) either from the terminal, or from a python script.


{% c-block language="bash" %}
% lager analog 3V3 enable --dut 191
% lager analog 3V3 measure vavg --dut 191
{% c-block-end %}


{% c-block language="python" %}
from import Net, NetType

v33_net = Net('3V3', type=NetType.Analog, setup_function=setup_3v3, teardown_function=teardown_ch)
volt = v33_net.measurement.voltage_average(display=False)
{% c-block-end %}

Doing it this way requires accessible test points, but it opens up a whole new world of test automation.

Reach out to learn more about Lager's hardware test automation platform.

Try One Month Free