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.

Day: July 30, 2012

  • LED Curve Tracer: Repeatability

    Measuring the same LED many times should produce the same data every time. Here’s an LED measured ten times in quick succession, with each data point consisting of the average of three ADC conversions:

    Repeatability - 3 samples
    Repeatability – 3 samples

    Ten more measurements of the same LED, but with each data point being the average of ten ADC conversions:

    Repeatability - 10 samples
    Repeatability – 10 samples

    Not much to choose between the two, although averaging more readings does reduce the scatter just a bit. The ADC resolution is 5 mV, which is painfully obvious along the X axis. The Y axis has a smaller spread because it’s the independent variable: the firmware sets the MOSFET gate voltage to produce a given current and the ADC steps are relatively larger (the input voltage is only 75 mA × 10.5 Ω = 800 mV, tops).

    I think it’s close enough for my simple needs.

    The ADC code looks like this:

    //-- Read AI channel
    // averages several readings to improve noise performance
    // returns value in mV assuming VCC ref voltage
    
    #define NUM_T_SAMPLES 10
    
    float ReadAI(byte PinNum) {
      word RawAverage;
    
      digitalWrite(PIN_SYNC,HIGH); // scope sync
    
      RawAverage = analogRead(PinNum); // prime the averaging pump
    
      for (int i=2; i <= NUM_T_SAMPLES; i++) {
        RawAverage += (word)analogRead(PinNum);
      }
    
      digitalWrite(PIN_SYNC,LOW);
    
      RawAverage /= NUM_T_SAMPLES;
      return Vcc * (float)RawAverage / 1024.0;
    }
    

    And the Gnuplot routine that produces the graphs, including a bit of cruft that reminds me how to make two Y axis scales:

    #!/bin/sh
    #-- overhead
    export GDFONTPATH="/usr/share/fonts/truetype/"
    base="${1%.*}"
    echo Base name: ${base}
    ofile=${base}.png
    echo Output file: ${ofile}
    #-- do it
    gnuplot << EOF
    #set term x11
    set term png font "arialbd.ttf" 18 size 950,600
    set output "${ofile}"
    set title "${base}"
    set key noautotitles
    unset mouse
    set bmargin 4
    set grid xtics ytics
    set xlabel "Forward Voltage - mV"
    set format x "%6.3f"
    set xrange [1.8:2.1]
    #set xtics 0,5
    set mxtics 2
    #set logscale y
    #set ytics nomirror autofreq
    set ylabel "Current - mA"
    set format y "%4.0f"
    #set yrange [0:${rds_max}]
    #set mytics 2
    #set y2label "right side variable"
    #set y2tics nomirror autofreq 2
    #set format y2 "%3.0f"
    #set y2range [0:200]
    #set y2tics 32
    #set rmargin 9
    set datafile separator "\t"
    #set label 1 "Comment" at 0.90,0.35 font "arialbd,18"
    plot	\
        "$1" using (\$5/1000):((\$1>0)?\$2/1000:NaN) with linespoints lt 3 lw 2 lc 1
    EOF