I'm making a sensor to measure light absorbance in a sample where the geometry varies over time.

I found a very nice transimpedance amplifier, the AD8304 designed for use with PIN photodiodes with a nice and wide dynamic range and logarithmic response which matches the physics of light absorption. Here is an recommended application circuit from the datasheet:

enter image description here

Vref and Vout will feed the corresponding inputs on an SPI analog-to-digital converter.

The light source will be pulsed (sequenced through several wavelengths, actually), and the ADC measurements will be synchronized with the source pulses. Pulses will be on the order of 100us in duration and the sequence will repeat at 2kHz.

I'd like to remove the error introduced by ambient light, which can be detected during the intervals while the source is turned off. I think I can remove the ambient light by adding a parallel inductor which "learns" the ambient power level. Can I use a solid-state switch to make the inductor only track the ambient level, as shown?

enter image description here

My idea is that the transistor acts as a switch -- while the source is turned off, the transistor disconnects the TIA and the RLC circuit charges until the current is all passing through the inductor. When the source turns on, the inductor holds its current, subtracting it from the photodiode signal, and the remaining (non-ambient) current passes through the transistor to the TIA.

Will this work? What parameters of the transistor and inductor do I need to pay special attention to?

On further consideration, I think that the node is supposed to be at VSUM, not ground, when the inductor current is constant. So I think I should connect the inductor to (buffered) VSUM, as follows:

enter image description here

Finally, here's an adaptation of a current-mode sample-and-hold circuit:

enter image description here

  • \$\begingroup\$ Thanks for fixing the diode connections @stevenvh. Any comments on the high-pass filter? \$\endgroup\$
    – Ben Voigt
    Aug 21 '12 at 14:05

I think I would forget about analog filtering altogether.

Your signal will be sampled digitally, and digitally filtering is a lot easier: sample at a rate high enough not to miss the 100 µs pulse, like at 20 ksps. A full cycle will then have 1 to 3 high level readings from the pulse, and the rest the ambient offset. Average the high level pulses and subtract the average of the low level ones and you're done.

Analog filtering may deteriorate this, since you won't get the nice rectangles with relatively flat level high, and ditto low.

The ideal would be that you can synchronize sampling with the pulses, so that you can do a quick series of samples in the middle of the pulse, which you can then average.

  • \$\begingroup\$ It's non-linear response, you can't simply subtract the baseline. log(A) != log(A+B) - log(B). Without the logarithmic response, my ADC resolution will be terrible at the low end (high absorbance). \$\endgroup\$
    – Ben Voigt
    Aug 21 '12 at 14:36
  • \$\begingroup\$ @Ben - Ah, sorry, I missed the log function. But can't the microcontroller then take the inverse log of the average of the lows (or the average of the inverse logs) and subtract that from the inverse log of the average of the highs (or the average of the inverse logs)? \$\endgroup\$
    – stevenvh
    Aug 21 '12 at 14:48
  • \$\begingroup\$ Probably could do that, although I was hoping to avoid it. The spacing of the ADC codes will still depend on the ambient light level, because slope of the logarithmic response varies with operating point. \$\endgroup\$
    – Ben Voigt
    Aug 21 '12 at 15:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.