Gas station without pumps

2019 January 8

One figure has been giving me grief for a long time

Filed under: Circuits course — gasstationwithoutpumps @ 09:22
Tags: , , ,

There is one figure in my book that has been giving me trouble for a long time:

A Moiré pattern figure for the sampling and aliasing chapter that was giving me trouble.

The figure itself is very simple, and it should have been no trouble at all. I created the figure in hand-written SVG, and all the SVG readers (Inkscape, Preview, and browsers) had no trouble rendering it on the screen. But when Inkscape converted it to PDF (using the Cairo library, I believe), it threw away the black bars in the background. When I asked Inkscape to print the image to PDF, it rotated the image.

For a while, I got away with rerotating the image in Preview and saving the result, but the file got damaged or deleted at some point, and redoing the rotation in Preview no longer worked—pdflatex seemed to have no idea that there was a rotation nor a bounding box any more.  (I think Preview changed when I upgraded the mac OS on my laptop.) This change happened between the 2018 Dec 15 and 2018 Dec 30 releases of the book, so the Dec 30 release had a messed-up figure without my realizing it.

Yesterday evening, I noticed the problem and set about trying to fix it.  Nothing I could do with Inkscape or Preview seemed to work—I either ended up with no black bars or with the image rotated and scaled wrong.  (Viewing the individual image with Preview sometimes worked—but the inclusion by pdflatex was failing in those cases.)

Finally, I decided that since Inkscape was incapable of rendering in PDF the pattern-fill I was using to create the bars, that I would give up on pattern fill to create them.  Instead I used a Python program to generate separate rectangles.  Inkscape had no trouble converting that longer but less sophisticated SVG program to PDF, and I was able to fix the figure.

Because this figure was messed up in the “final” release of 30 Dec 2018, I did a quick re-release last night, fixing this figure and a bunch of typos students had found.  Yesterday was the first day of class, and students have already reported 7 errors in the book (one reported after yesterday’s release, so it is still in the current version at LeanPub).

This year’s class seems to be very diligent, as all the students had the book downloaded by the first day of class, and some had started on the homework.

2019 January 6

OpenScope MZ review: Bode plot

Filed under: Circuits course,Data acquisition — gasstationwithoutpumps @ 14:47
Tags: , , ,

Continuing the review in OpenScope MZ review, I investigated using the OpenScope MZ for impedance analysis (used in both the loudspeaker lab and the electrode lab).

Waveforms Live does not have the nice Impedance Analyzer instrument that Waveforms 3 has, so impedance analysis is more complicated on the OpenScope MZ than on the Analog Discovery 2.  It can be done well enough for the labs of my course, but only with a fair amount of extra trouble.

There is a “Bode Plot” button in Waveforms Live, which performs something similar to the “Network Analyzer” in Waveforms, but it uses only a single oscilloscope channel, so the setup is a little different. I think I know why the Bode plot option uses only one channel, rather than two channels—the microcontroller gets 6.25Msamples/s total throughput, which would only be 3.125Msamples/s per channel if two channels were used. In contrast, the AD2 gets a full 100Msamples/s on each channel, whether one or two is used, so is effectively 32 times faster than the OpenScope MZ.

We still make a voltage divider with the device under test (DUT) and a known reference resistor, and connect the waveform generator across the whole series chain.  Because there is only one oscilloscope channel, we have to do two sweeps: first one with the oscilloscope measuring the input to the series chain (using the “calibrate” button on the Bode panel), then another sweep measuring just across the DUT.  The sweeps are rather slow, taking about a second per data point, so one would probably want to collect fewer data points than with the AD2.  Also there is no short or open compensation for the test fixture, and the frequency range is more limited (max 625kHz).

The resulting data only contains magnitude information, not phase, and can only be downloaded in CSV format with a dB scale.  It is possible to fit a model of the voltage divider to the data, but the gnuplot script is more awkward than fitting the data from the impedance analyzer:

load '../definitions.gnuplot'
set datafile separator comma


undb(db) = 10**(db*0.05)
model(f,R,C) = Zpar(R, Zc(f,C))
div(f,R,C) = divider(Rref, model(f,R,C))

R= 1e3
C= 1e-9
fit log(abs(div(x,R,C))) '1kohm-Ax-Bode.csv' skip 1 u 1:(log(undb($2))) via R,C

set xrange [100:1e6]
set ylabel 'Voltage divider ratio'
plot '1kohm-Ax-Bode.csv' skip 1 u 1:(undb($2)) title 'data', \
      abs(div(x,R,C)) title sprintf("R=%.2fkohm, C=%.2fnF", R*1e-3, C*1e9)

The fitting here results in essentially the same results as the fitting done with the Analog Discovery 2.

Although the Bode plot option makes the OpenScope MZ usable for the course, it is rather awkward and limited—the Analog Discovery 2 is still a much better deal.

2019 January 5

OpenScope MZ review

During the CyberWeek sales I bought myself an OpenScope MZ USB scope from Digilent, to see how it compared with the Analog Discovery 2, which I use frequently.  I particularly wanted to see whether I could recommend it as a low-cost alternative ($89 list) for the AD2 ($279 list, but $179 with academic discount).

I’ve not had a chance to do much testing yet, but the short answer is that I would recommend saving up for the Analog Discovery 2—the OpenScope MZ is nowhere near being a professional instrument, but the AD2 is close.

The first thing I tested was the function generator.  The OpenScope MZ does not have a real DAC, but uses digital output pins and a resistor ladder to generate analog voltages.  The result is a “DAC” that is non-monotonic.  The non-monotonicity can be observed by generating a sawtooth waveform and observing the result with an Analog Discovery 2.

The non-monotonicity is worst when the DAC switches from 0x1ff to 0x200 (from 511 to 512 out of 1024 steps). This was a 3Vpp sawtooth at 10Hz. The OpenScope MZ also has a much larger offset than the AD2.

To get clean measurements, I set the AD2 to average 100 traces.  I also did 16-fold oversampling, so that I could get good time resolution while recording the whole period.

The steps are not of uniform duration, but don’t seem to be a simple pattern of single or double clock pulses:

The step durations vary here from 64µs to 136µs in this small sample, but with 1024 steps in 0.1s, I would expect 97.66µs.

The step heights are not completely consistent either, but seem to average to roughly the right value:

The step size should be 3V/1024=2.93mV, but in this range the average step size is a little high. (but the first step at the bottom left is too small).  The variable duration of the steps is also very visible here.

The speed limitations of the amplifier for the OpenScope’s function generator are also quite clear:

There seems to be a 12V/µs slew rate limitation, and the large step at the end of the sawtooth has a 258ns fall time. By way of contrast, the AD2 has about a 40ns fall time for the same 10Hz ramp up and a slew rate of about 120V/µs.

I found the Analog Discovery 2 falling edge rather interesting—the stepwise descent may be an artifact of recording the waveform with the same instrument used for generating it (so that the oversampling does not work correctly), but it might also indicate that the ramp edge is digitally pre-filtered to keep it from overshooting.

Series-parallel and parallel-series indistinguishable

Filed under: Circuits course — gasstationwithoutpumps @ 00:52
Tags: ,

I was looking at 3-component circuits for the impedance tokens, to make more challenging targets for students to identify than the 2-component RC ones.  Here are two of the circuits I was looking at:

Series-parallel : R1+(R2||C2) and Parallel-series: R4||(R3+C3)

I realized over the past couple of days that these two circuits are indistinguishable with an impedance spectrum, if you don’t know any of the R or C values.

The series-parallel circuit has impedance R_1 + \frac{R_2}{1+j\omega R_2 C2}, which can also be written as \frac{R_1+R_2 + j\omega R_1 R_2 C_2}{1+ j\omega R_2 C_2}.

The parallel-series circuit has impedance \frac{R_4 \left(R_3 + 1/(j \omega C_3)\right)}{R_4 + R_3 + 1/(j \omega C_3)} which can be written as \frac{R_4 + j \omega R_3 R_4 C_3}{1 + j \omega (R_3+R_4) C_3}.

If we are given R1, R2, and C2, we can set R_4 = R_1+R_2 and R_3 = R_4 \frac{R_1}{R_2} to get the same impedances for both circuits at DC and infinite frequency. If we set C_3 = C_2 \frac{R_1 R_2}{R_3 R_4}, then the impedances are identical for the two circuits at all frequencies.

There is one way that we can distinguish between the circuits, but it is pretty subtle, relying on thermal effects. The overall power dissipation is the same for both circuits with any given input voltage waveform, but the heat will be distributed differently. At high frequencies, the energy is dissipated in R1 and in both R3 and R4, but at low frequencies the energy is dissipated in both R1 and R2 or in R4. The thermal masses will be different in the two cases, and so the temperature rise will be different, which can theoretically be detected by differences in the noise spectra of the thermal noise from the resistors.

If the resistors were mounted on a sufficiently thermally conductive substrate, so that the temperature rise was the same for both resistors in each circuit, then even this subtle detection would not be possible.

A similar analysis of the impedances can be made if R1 and R4 are replaced by capacitors C1 and C4, so there are really only two distinguishable 3-component RC circuits: R1+ (R2||C2) and C1 + (R2||C2). Others either reduce to one of these or reduce even further to 2-component or 1-component circuits.

2019 January 1

Impedance tokens

Filed under: Circuits course — gasstationwithoutpumps @ 13:42
Tags: ,

I have been planning to add a little to the loudspeaker-impedance lab in BME 51B for the spring—a simpler measurement and modeling warmup using series or parallel RC circuits.  The idea is to give each group a different unknown impedance, which consists of a resistor and capacitor in series or in parallel, then have them measure the impedance with the Impedance Analyzer function of the Analog Discovery 2, and fit a model (R+C or R||C as appropriate).

The idea is to give the students a simpler warmup exercise for collecting and fitting data, before they tackle the more complicated loudspeaker model.

To make the unknown impedances, my son and I designed small printed-circuit boards that could take up to 6 SMD components (1206—or 3216 if you prefer the metric designation).  The components are fairly large, and so not too difficult to hand solder, and I bought an assortment of resistors and an assortment of capacitors from AliExpress to populate with.

The schematic for the impedance token is designed to allow several different RC circuits—both as single impedances or as voltage dividers.

All possible 2-port, series-parallel circuits of 3 components can be wired between two adjacent pins, though three components in parallel requires adding an extra 0Ω component to get Z2||Z3||Z4 (shorting Z1). Of the 10 possible 4-component, 2-port parallel circuits, 6 can be made between adjacent pins, 2 only between pins A and C, and 2 are not achievable on the board.

With B as the center pin of a voltage divider, we can get several useful configurations:

  • Z2 paired with Z3||Z4
  • Z5+Z6 paired with Z3
  • Z5+Z6 paired with Z3||Z4
  • Z2||Z5 paired with Z3||Z4 (shorting Z6)

The board designs are available at

The top shows a panel of 10 boards as delivered by Seeedstudio. The middle row has the boards after breaking apart and sanding the edges. The bottom row shows the boards populated, with heat-shrink tubing to hide the components and label the board.

I had the boards made by Seeedstudio this time (rather than SmartPrototyping), because I had a coupon code for a discount and because Seeedstudio did not charge extra for fancy colors of soldermask.  Seeedstudio had to email me to ask if I was willing to accept panelizing, while SmartProtoyping puts that question on their web form when the job is submitted.

The hole at the top of each board is for hanging the boards from hooks or putting them on a keychain—I’m going to have to do something to make sure that I get all the tokens back after each lab that uses them.

I wrote a program to generate random series or parallel RC circuits based on the components in the assortments and constraints on the range of impedance and the RC time constant. The programs are available at

I’ve populated 10 of the boards so far, and they all seem to be ok, except for one whose 100nF capacitor seems to be 160nF instead of 100nF. I think that this may be a labeling error on the assortment of capacitors I bought. If the others from the same strip also come out to 160nF, I’ll relabel the strip. (The capacitors themselves are not labeled, though the resistors are.)

One problem I’ve found in characterizing the boards is that the screwless terminal on the adapter board for the Analog Discovery 2 impedance analyzer has its contacts recessed too deep—the header pins can’t reach the contacts.  I’ve found the screwless terminal to be more of a nuisance than timesaver, both because the contacts are recessed so deep and because the release buttons are difficult to press. I’m considering buying a 0.1″-pitch, 2-contact screw terminal to replace the screwless terminal with.

When I tried adding wires from the adapter board to a breadboard, I got inconsistent readings with about 10Ω–20Ω resistance in series with what I was measuring—I think this may have been bad contacts in either the screwless terminal or in the breadboard.  I switched to using the breadboard directly with my own reference resistor rather than using the impedance analyzer adapter board and had no further problems.


« Previous PageNext Page »

%d bloggers like this: