The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

The New Hotness

  • LF Crystal Tester: LM75 Temperature Sensor

    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:

    AD9850 DDS module with LM75A Temperature Sensor
    AD9850 DDS module with LM75A Temperature Sensor

    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:

    LM75A Temperature Data Format
    LM75A Temperature Data 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:

    DDS OLED with LM75 temperature
    DDS OLED with LM75 temperature

    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.