A strip of NXP (née Philips plus Freescale, including the part of Motorola that didn’t become ON) LM75A I²C temperature sensors arrived from beyond the horizon. To see if they worked, I soldered thin wires directly to the SO-8 pins, entombed it in Kapton tape to prevent spitzensparken, and jammed it under the foam insulation atop the AD9850 DDS module:
This turns out to be easier than screwing around with thermistors, because the chip reports the temperature directly in Celcius with ⅛ °C resolution. Classic LM75 chips from National (now absorbed by TI) had ½ °C resolution, but the datasheet shows the bits have an easily extensible format:
Huh. Fixed-point data, split neatly on a byte boundary. Who’d’a thunk it?
There’s a standard Arduino library using, naturally enough, floating point numbers, but I already have big fixed point numbers lying around and, with the I²C hardware up & running from the X axis DAC and OLED display, this was straightforward:
Wire.requestFrom(LM75_ADDR,2); Temp.fx_32.high = Wire.read(); Temp.fx_32.low = (uint32_t)Wire.read() << 24; PrintFixedPtRounded(Buffer,Temp,3); u8x8.drawString(0,ln,"DDS C "); u8x8.drawString(16-strlen(Buffer),ln,Buffer); printf(",%s",Buffer); ln += 1;
The next-to-last line squirts the temperature through the serial port to make those nice plots.
Casually ignoring all I²C bus error conditions will eventually lead to heartache and confusion. In particular, the Basement Laboratory temperature must never fall below 0 °C, because I just plunk the two’s-complement temperature data into an unsigned fixed point number.
Which produces the next-to-bottom line:
Alas, the u8x8 font doesn’t include a degree symbol.
Given sufficient motivation, I can now calibrate the DDS output against the GPS-locked 10 MHz standard to get a (most likely) linear equation for the oscillator frequency offset as a function of temperature. The DDS module includes a comparator to square up its sine wave, so an XOR phase detector or something based on filtering the output of an analog switch might be feasible.
The crystal test fixture and amp huddle in front of the OLED display:
The 22 pF cap now sits across the relay’s NO contacts, so as to simplify measuring the total in-circuit capacitance. The LED turns on when the relay shorts out the capacitor, which has a 50% probability of making more sense.
The quartz tuning fork resonators have an ESR around 20 or 30 kΩ, so the off-resonance output should be down something like -60 dB = 20 log (24 / 24×10³) from the 150 mV input: 200 µV (-ish). It’s actually around 1 mV, suggesting plenty of blowby through the baling-wire connections hidden under that neat top surface. I think that’s why the whole setup shows only about 8 dB of dynamic range; more attention to detail may be in order, although the peaks probably won’t move all that much.
Anyhow, even though the AD8310 log amp module should be able to handle such a tiny signal, the MAX4255 amp provides 40 dB of gain (OK, just 39.8 dB) and rolls off the high end at 220 kHz as a side benefit of its 22 MHz GBW.
There’s way too much low frequency rumble at the amp output:
What look like grass is actually the 60 kHz resonator output: those big lumps & bumps are noise from this-and-that. The repetitive peaks and dents exactly 10 ms apart (the cursors span four of ’em) felt a lot like OLED refresh cycles and, indeed, went away when I yanked the display out. Pulling the USB connection eliminates another tremendous heap o’ noise, so there’s likely a ground loop (-ish) thing going on, too. This may call for a USB optical isolator, its commercial equivalent, or more eBay offerings. Getting rid of that junk may improve the dynamic range enough to keep me from doing anything drastic.
The AD8310 log amp input now has decent coupling caps, so it’s not seeing the VCC/2 bias, and I removed that kludged-in 50 Ω terminating resistor to present its full 1.1 kΩ input resistance to the op amp.
The Big Ideas: the DDS output, being more-or-less constant, needs a variable-gain amp to set the crystal drive level. The amp also fixes the impedance mismatch between the DDS output and the crystal, which may not be much of a problem for the (very) high ESR quartz tuning fork resonators in play.
The AD8950 DDS output feeds a 70 MHz (-ish) elliptical reconstruction filter chopping off image frequencies descending from the 125 MHz sampling clock, with a 100 Ω (-ish) output impedance that’s just about purely resistive at 60 kHz. An on-board 3.9 kΩ resistor (labeled with 392 on their schematic) sets the full-scale output current to 10 mA for a peak voltage of 1 V. The module uses only the + output of the differential pair, which means the sine wave runs from 0 V to 1 V: 1 Vpp = 500 mVpeak = 353 mVrms (ignoring the 500 mV offset).
Pin header J3 normally sports a jumper to connect the 3.9 kΩ RSET resistor, but you can insert an external resistor to increase the resistance and decrease the output current:
IOUT = 32 × 1.248 V / RSET
A little hot-melt glue action produced a suitable lashup from a 5 kΩ trimpot:
The pillars of green wire insulation forestall screwdriver shorts to the bare pin headers, although that’s less of risk with the upper insulating foam sheet in place:
A 5 kΩ trimpot can vary the output voltage downward by a factor of 2 = -6 dB, more or less.
All the quartz tuning fork resonator specs I’ve found, none of which may apply to the units on hand, seem to require no more than 1 µW drive. Given a resonator’s equivalent series resistance of around 20 kΩ (for real!), the drive voltage will be 150 mV (-ish):
1 µW = V² / 20 kΩ, so V = sqrt(20×10³) = 141 mV
The nominal version of the crystal tester had a 50 Ω input impedance, so I picked a MAX4165 op amp with mojo sufficient for anything over 25 Ω; in retrospect, a lighter load than 48 Ω would be fine.
In any event, the amp looks like this:
What looks like a DIP switch is really the 3×2 jumper header just to the right of the foam insulation, in front of the SOT23 space transformer PCB carrying the MAX4165. No jumper = 0 dB gain, then 6 dB steps upward from there. The -6 dB trimpot range gives more-or-less continuous output tweakage across 24 dB, -6 dB to +18 dB, which is certainly excessive. The 24 Ω terminating resistors provide 6 dB loss into the crystal, so the effective range is -12 to +12 dB, with 0 dB = 350 mVrms and -6 dB = 150 mVrms (-ish) at the crystal.
It’s a non-inverting amplifier, which (also in retrospect) probably isn’t a win:
- Yet Another Bypass Cap on the cold end of the gain-setting resistors
- Overly elaborate VCC/2 biasing to maintain sufficiently high input impedance
I’m reasonably sure all those big caps contribute to some low-level motorboating, but haven’t tracked it down.
A slight modification spits out the (actual) frequency and dBV response (without subtracting the 108 dB intercept to avoid negative numbers for now) to the serial port in CSV format, wherein a quick copypasta into a LibreOffice Calc spreadsheet produces this:
Changing the center frequency and swapping in a 60 kHz resonator:
Much prettier than the raw scope shot with the same data, there can be no denyin’:
I think the wobbulations around the parallel resonant dip come from the excessively hugely too large 10 µF caps in the signal path, particularly right before the log amp input, although the video bandwidth hack on the AD8310 module may contribute to the problem. In any event, I can see the log amp output wobbling for about a second, which is way too long.
Anyhow, the series-resonant peaks look about 1 Hz wide at the -3 dBV points, more or less agreeing with what I found with the HP 8591 spectrum analyzer. The series cap is a bit smaller, producing a slightly larger frequency change in the series resonant frequency: a bit under 2 Hz, rather than the 1 Hz estimated with the function generator and spectrum analyzer.
I still don’t understand why the parallel resonant dip changes, although I haven’t actually done the pencil pushing required for true understanding.
Ain’t they lovely, though?
Last summer I followed the procedure that should turn off (one of) the ersatz “Yellow Pages” directories littering our driveway.
This just arrived:
Seeing as how they have the wrong town in my address, there’s still another excuse available.
My guess: they’re paid by tonnage of books delivered and have a powerful incentive to continue delivering all of them, no matter what gets in the way.
You absolutely cannot make this stuff up.
The ample padding around this bag of fragile pecans leaves nothing to be desired:
They’re firmly held in place on all sides, well protected from injury, and survived their shipping ordeal unscathed: not a bruise or break to be found. Well done!
Which came from its completely unprotected contents:
Fortunately, the fragile glass front plate of that OLED managed to put itself flat against a small box inside the otherwise empty bag. it wasn’t broken, but due only to good fortune.
“Static sensitive parts enclosed”, indeed …
Faced with a need to send documents rolled up in a tube, rather than folded flat, I sawed off a suitable length of cardboard tube from the heap, then discovered a distinct lack of end caps.
Well, once again, it’s 3D printing to the rescue:
The small ribs probably don’t actually do anything, but seemed like a nice touch.
They’re somewhat less boring from the bottom:
The fancy spider supports that big flat top and provides some crush resistance. The flat flange should collect the edge of the packing tape wrapped around the ends.
A firm shove installs them, so the size worked out perfectly:
Add a wrap of tape to each end, affix the USPS label, and they went out with the next day’s mail, PETG hair and all.
The OpenSCAD source code as a GitHub Gist: