This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

APD transimpedance amplifier

Other Parts Discussed in Thread: OPA684, OPA657, OPA847, DEM-OPA-SOT-1B, DEM-OPA-SO-1B, THS3202, LMH6629

Hello,

I am looking to design a transimpedance amplifier for  use with an avalanche photodiode in a battery powered application and was hoping to get some assistance. 

I am looking to detect pulsed light in the range of 800nm. I understand that a high speed op-amp would be required due to the nature of  light, but am very unsure of what I need. I was looking at the OPA684 due to its slew rate of 820 V/us, but from what I've researched, a low bias current is very beneficial. Having a low bias current op amp reduces voltage offset and helps achieve the highest sensitivity. The OPA128 has a very low bias current but also a very average slew rate. I am also unsure of what the bandwidth range should be for such a device.

Also, how does one go about choosing the right value for the feedback resistance?

Any assistance or guidance on what parameters I should consider when choosing the right op-amp for such an application (APD transimpedance amplifier) would be greatly appreciated.

Thanks for your help.

-Joel Yello

  • Hello Joel,

    Do you have a photodiode selected and do you have details on the expected pulse in terms of the photodiode output, namely, the pulse width (e.g. 100ns pulse) and pulse amplitude (e.g. 20uA)? The pulse characteristics are central to the part selection. It is also useful to know photodiode capacitance for part selection as this plays into the bandwidth and compensation.

    The value of the feedback resistance is selected to get the desired transimpedance gain, which will depend on the amplitude of the input current pulse and the desired amplitude at the output of the transimpedance stage. Usually a second stage amplifier is used to amplify the voltage output of the first stage, since higher feedback resistance (transimpedance gain) results in in lower transimpedance stage bandwidth.

    This app note may help you get started:  Transimpedance Considerations for High-Speed Operational Amplifiers - sboa122

  • Hi Kristoffer,

    As for the photodiode, I've been looking at the Hamamatsu APD; Specifically the S2381 (http://sales.hamamatsu.com/assets/pdf/parts_S/s2381_etc_kapd1007e09.pdf). Since this is going to be used in a very low IR light application (Laser range finder).  

    I am looking to use a time to digital converter (Acam TDC-GP21) that has a fire pulse generator on board that I will use to pulse the  laser. Since the pulse generator is programmable, I can use whatever is most convenient.  

    The output pulse amplitude is going to be dependent on the gain of the APD. I am looking to achieve a gain of 100. So that will make the APD sensitivity (for the S2381) 50A/W. So for reflected light of 500 nW the output curernt would be somewhere around 25uA.

    The APD has a capacitance of 1.5 pF.

    The app note that you reference was quite useful. My main concern with choosing the right part is deciding on what slew rate and cut-off I need.


  • Joel,

    Sorry for the delay. I did not see that you had replied.

    If you haven't already identified a part, I would suggest beginning the part selection process by considering the required gain and bandwidth for the application. For example, if you want the output of the transimpedance amplifier to be 1Vpp corresponding to the 25uA pulse, you will need a transimpedance gain of 40 kohm. The higher the gain, however, the lower the achievable transimpedance bandwidth as shown in Figure 6 of the app note for 10pF.

    In terms of the required bandwidth, I would go with the following approach for estimating the bandwidth needed. Say you have pulse width of 100ns and the rise and falling edge each occupy 10%, or 10ns, of the pulse width. In other words, in the first 10ns, the current is rising, for the next 80ns, the current remains high, and for the last 10ns, the current falls back down to the low level. From small-signal rise time/bandwidth analysis, the required bandwidth based just on rise time is 0.34/rise time = 0.34/10ns = 34MHz.

    You can also think of it this way. Let's assume instead of a single 100ns wide pulse, you have a pulse train (square wave) of period 200ns (100ns high, 100ns low...). This would translate to a fundamental frequency of 5MHz (1/200ns). Since we're dealing with a square wave and not a sinusoid, the bandwidth will need to be wide enough to pass several odd harmonics of the fundamental frequency. Let's say we want to pass up to the 7th (35MHz) harmonic to be able to get a square wave output. That means the bandwidth should be around 35MHz, which is close to the same bandwidth calculated based on rise time.

    From this example, and referring back to Figure 6 in the app note, both the OPA657 and OPA847 should be able to meet a 40kohm transimpedance gain requirement. The figure is for 10pF source capacitance. However, when you add the input capacitance and parasitic board capacitance to your APD capacitance  of 1.5 pF, the effective source capacitance will probably be closer to 5-6pF, so the calculations for 5-6pF should yield similar results. The OPA847 will be able to achieve wider bandwidth than the OPA657, but you will have to consider the higher offsets of the non-FET input OPA847. The OPA657 is a FET input which will have much better offset but lower bandwidth. This tradeoff is discussed in the app note as well.

  • Joel;

    I've attached a circuit for a transimpedance amplifier with an OPA657 and another but similar APD.  The laser pulse should be short and have a fast rise time so you can get good range resolution and keep thr duty cycle of the laser low. If you know the shape of your laser pulse (a short laser pulse will be approximately Gaussian),

    You can generate a piecewise linear approximation of that pulse in TINA and then use TINA to do a Fourier analysis of it to determine the minimum transimpedance amplifier bandwidth that you need to get reasonable pulse fidelity.

    I hope that you find this helpful.

     

    APD TZA.TSC
  • Hi, Thanks for the circuit. I may use this design.

    I have received opa847 and opa657, however I am having trouble prototyping with them. For testing purposes, I am attempting to operate the 847 in a non-inverting configuration. My output waveform is completely distorted and does not resemble the input (sine 1 Vpp 1khz) at all. It's a SOIC-8 package. I am using a simple solderable DIP adaptor for bread-boarding.

    I've tried 3 different op-amps, all with the same result. Could this be a result of capacitive board parasitics?

  • Joel,

    The OPA847 is a rather sensitive device, it would be best to solder the device directly on a board and avoid bread-boarding at all cost. 

    In non inverting configuration, the minimum gain stable is 12V/V, with a flat frequency response for 20V/V.  You best chance to make the OPA847 works would be to use one of the unpopulated EVM DEM-OPA-SO-1B or DEM-OPA-SOT-1B.  This will limit all the parasitics near the device.

    Also if you are using a large gain, the 1Vpp input may be too large, so the amplifier could be clipping.  For ±6V supply, do not expect the amplifier output swing to be above 10Vpp.  This voltage combined with the minimum gain for the OPA847 would indicate that this could be the problem.

    What gain are you using in your evaluation?

    Best regards,


    Xavier

  • Joel;

    If you try the circuit that I attached in my last post, I think it will work better than what you are attempting. A non-inverting amplifier following an APD will have poor SNR compared to a good transimpedance amplifier.

    You still have not said what your pulse width is, so I can't be too much more helpful.

     

  • Xavier, Thanks for the help, I'm going to try to prototype without a breadboard. Also, I am attempting to operate with a gain of 10.

     

    Neil, I'm only using the non-inverting configuration for testing purposes to verify that my op- amp is working as it should (no APD attached). 

    However, in regards to the TIA, I want to use a pulse width of about 10ns. I imagine the period will be much greater since the duty cycle should be low. Also is it common practice to use an active voltage limiting circuit after the TIA? Since this will be for a range finder, the APD will have a dynamic current that depends on distance. So the output voltage could get very large depending on distance.

  • Joel;

    A pulse with a Full Width Half Maximum (FWHM) of 10ns will require a bandwidth of about 50MHz to preserve its waveform reasonably accurately but in your application perhaps 20MHz would be sufficient. The pulse can be limited by a second-stage amplifier that has a very fast overload recovery time or you might be able to simply use a comparator with very low offset voltage to sense the presence of your return pulse.

    The threshold of the comparator needs to be set as close to zero as possible to obtain high sensitivity but far enough above the baseline noise level so that you do not get false triggering. This fixed-threshold detection (FTD) method is simple but it has one distinct disadvantage-- it produces "timing walk". That is, the timing changes with the amplitude of the return pulse. You might look into what is called a Constant-Fraction Discriminator (CFD).

    A CFD is useful where you don't have prior knowledge of what the return pulse is likely to be, for example a single- shot measurement. In a free-running system, you could use a fast peak detector for an AGC control and a fixed-threshold detector to eliminate timing walk.

    I hope this helps.

     

  • Great information.

    The comparator seems like the way to go. I found the ALD2321 made by ADVANCED LINEAR DEVICES that has a Vos of 0.2mV. I'll be doing lab testing and will report what I find.

  • Hey Neil,

    I am working on designing a scanning laser range finder. I am on the first part of the project designing a 1D laser rangefinder. I am having some troubles with the "timing walk" error. Could you refer me to a document that will give a start on how to design a CFD?

     

    Thank you for your help,

    Miguel

  • Miguel;

    I'll attach two .pdf files that have some useful information on Constant-Fraction Discriminators (CFD) but you can probably find more on the internet by doing a Google search on "CFD".

    I hope these help.

    CFD4.pdf
  • Miguel;

    For some reason I could not attach two files to my last post. Here is the other one.

    CFD.pdf
  • Hello Neil,

    Thank you for your help. I will look into it!

  • Hello, I realized this post is about a year old but I thought it would be worth a shot to ask some questions. My senior design group is working on a very similar design: a laser rangefinder using an APD as well as the GP21 from acam. We are running into difficulties with both of these components. I have two questions:

    1) How did you go about biasing your APD? Our APD requires 150 V reverse bias, but we are unsure if there are any quick and effective ways to achieve this.

    2) Were you able to get your GP21 communication working? We are using a PIC16F887 to communicate with our TDC but we are getting no response and are not sure whether it's our code that is at fault or our chip setup. Would you be able to provide any example code you may have to initialize and execute a TOF measurement? Would you be able to give more insight on how your chip is setup(external oscillators we have, but is anything else required)?

    Thank you for any help you can provide.

     

    -Chee

  • Hello Che,

    1)For biasing the APD you could look to the DC-DC converter from Ultravolt: http://www.ultravolt.com/products/1-single-output-high-voltage-modules/27-microsize-micropower/ 

    You could use the US Series which cost around $96.00 (I bought it last year). Also, you can look to the this application note: http://cds.linear.com/docs/Application%20Note/an118fa.pdf Figure 17 should be good for you. All the component in this circuit you could get them online.

    2)For the TDC-GP21, I designed a laser rangefinder using a GP1 because it GP2 was not available during my design. The GP21 uses SPI interface. You have to look to the signal on the datasheet of the GP21 to determine your clock polarity (CPOL) and phase (CPHA) to set-up the SPI communication. Could you tell us how are you setting your registers? And how are you setting your SPI interface? Also how you are initializing the GP21?

    You could look at this document on SPI interface from AVR: http://www.atmel.com/Images/doc2585.pdf                                                                                                                                                  

    Hope this helps,

    Miguel

  • From the TDC GP21 datasheet, it specifies that it only supports

    Clock Phase Bit = 1
    Clock Polarity Bit = 0

    We simply connect the SPI pins on the PIC to the pins on to the appropriate pins of TDC chip. My partner did most of the coding. I believe he is initializing the registers on the GP21 by sending the appropriate byte long data. We are quite frustrated because there are so many subtleties of using SPI and making sure everything is set up correctly. Therefore, we don't know if we are missing some small initialization somewhere or it's a completely different problem. We have been posting questions on another forum located here: http://www.ccsinfo.com/forum/viewtopic.php?t=47818&postdays=0&postorder=asc&start=0. Maybe we didn't take into account the polarity bits. I also read somewhere else that we can only read from register 5 on the TDC GP21. It is quite difficult to actually make sure we have set up everything correctly...I need to discuss with my partner.

  • Hello. I'm working with same project (laser rangefinder). I use TDC-GP2 with PIC18F26J11. My code for example:

    typedef union { char byte[3];} Word_24;

    typedef union { char byte[4];} Word_32;

    
    
    void WriteSPI(char data)
    {
    char mask = 0x80;
    do{
    SCK = 1;
    SI = 0;
    if(data & mask)
    SI = 1;
    //5ns
    NOP();
    SCK = 0;
    //5ns
    mask >>= 1;
    } while (mask != 0);
    }

    char ReadSPI()
    {
    char data = 0x00;
    char i;
    for(i = 0; i < 8; i++)
    {
    data <<= 1;
    SCK = 1;
    //16ns
    NOP();
    if(SO)
    data |= 1;
    SCK = 0;
    }
    return data;
    }

    void WriteWordSPI(char addr, Word_24 data)
    {
    char mask = 0x80;
    char cmd;

    SSN = 1;
    SCK = 0;
    SI = 0;

    SSN = 0;
    //10ns
    cmd = 0x80 | (addr & 0x07);

    WriteSPI(cmd);
    //20ns
    //NOP();
    WriteSPI(data.byte[0]);
    //20ns
    //NOP();
    WriteSPI(data.byte[1]);
    //20ns
    //NOP();
    WriteSPI(data.byte[2]);

    SCK = 0;
    SI = 0;
    //25ns
    NOP();
    SSN = 1;
    }

    Word_32 ReadWordSPI(char addr, char size)
    {
    char cmd;

    Word_32 data;

    SSN = 1;
    SCK = 0;
    SI = 0;

    SSN = 0;
    //10ns
    cmd = 0xB0 | (addr & 0x07);
    //cmd = 0xB5;

    WriteSPI(cmd);
    SI = 0;
    data.byte[0] = ReadSPI();
    if(size > 8)
    {
    data.byte[1] = ReadSPI();
    if(size > 16)
    {
    data.byte[2] = ReadSPI();
    data.byte[3] = ReadSPI();
    }
    }

    SSN = 1;
    SCK = 0;
    SI = 0;

    return data;
    }

    void WriteOpcodeSPI(char data)
    {
    SSN = 1;
    SCK = 0;
    SI = 0;

    SSN = 0;
    //10ns
    NOP();
    WriteSPI(data);

    SSN = 1;
    SCK = 0;
    SI = 0;
    }
    
    
    void InitTDC()
    {
    Word_24 data;

    #ifdef _DEBUG_1
    tx_str("TDC Init...\r\n");
    #endif

    RSTN = 1;

    __delay_ms(1);

    WriteOpcodeSPI(0x50); //POR

    //============= Reg0 ==============
    // 23 16
    data.byte[0] = 0b00000000;
    // 15 8
    data.byte[1] = 0b00000100; //Reg0 10,11 = 11 (START_CLKHS);
    // 7 0
    data.byte[2] = 0b01101001; //[Reg0 1 = 1 (NEG_STOP1)]; + NEG_START
    WriteWordSPI(0x00, data);

    //============= Reg1 ==============
    // 23 16
    data.byte[0] = 0b00100001; //Reg1 8-10 = 1, 16-19 = 1, 20-23 = 2
    // 15 8
    #ifdef MEASURE_WIDTH
    data.byte[1] = 0b01000011; //Reg1 8-10 = 3 - 2 stop pulses
    #else
    data.byte[1] = 0b01000010; //Reg1 8-10 = 2 - 1 stop pulses
    #endif
    // 7 0
    data.byte[2] = 0b00000000;
    WriteWordSPI(0x01, data);

    //============= Reg2 ==============
    // 23 16
    data.byte[0] = 0b11101000; //Reg2 23 = 1, 22 = 1
    // 15 8
    data.byte[1] = 0b00000000;
    // 7 0
    data.byte[2] = 0b00000000;
    WriteWordSPI(0x02, data);

    //============= Reg3 ==============
    // 23 16
    data.byte[0] = 0b00101000; //Reg3 19,20 = 1, 21 = 1
    // 15 8
    data.byte[1] = 0b00000000;
    // 7 0
    data.byte[2] = 0b00000000;
    WriteWordSPI(0x03, data);

    //============= Reg4 ==============
    // 23 16
    data.byte[0] = 0b00100000;
    // 15 8
    data.byte[1] = 0b00000000;
    // 7 0
    data.byte[2] = 0b00000000;
    WriteWordSPI(0x04, data);

    //============= Reg5 ==============
    // 23 16
    data.byte[0] = 0b00000000;
    // 15 8
    data.byte[1] = 0b00000000;
    // 7 0
    data.byte[2] = 0b00000000;
    WriteWordSPI(0x05, data);

    WriteOpcodeSPI(0x70); //Init
    }
    
    
    char TestTDC()
    {
    Word_24 data_out;
    Word_32 data_in;

    data_out.byte[0] = 0x55;
    data_out.byte[1] = 0x40;
    data_out.byte[2] = 0x00;

    WriteWordSPI(0x01, data_out);

    data_in = ReadWordSPI(0x05, 8);

    if(data_in.byte[0] == data_out.byte[0])
    return 1;
    else
    return 0;
    }
    
    
    void StatTDC()
    {
    Word_32 data_in;
    char event_cnt = 0;

    data_in = ReadWordSPI(0x04, 16);
    // 8 4 2 1 8 4 2 1
    tx_str("0x");
    tx_hex(data_in.byte[0]); // 15 14 13 12 11 10 9 8
    tx_str(" 0x");
    tx_hex(data_in.byte[1]); // 7 6 5 4 3 2 1 0
    tx_str("\r\n");

    if(data_in.byte[0] & 0x10) tx_str("Error: SC.\r\n");
    if(data_in.byte[0] & 0x08) tx_str("Error: NC.\r\n");
    if(data_in.byte[0] & 0x04) tx_str("Timeout CNT.\r\n");
    if(data_in.byte[0] & 0x02) tx_str("Timeout TDC.\r\n");

    event_cnt = ((data_in.byte[0] & 0x01) << 2);
    event_cnt |= (data_in.byte[1] >> 6);
    tx_str("CH2 event cnt: ");
    tx_int(event_cnt);

    event_cnt = ((data_in.byte[1] & 0x38) >> 3);
    tx_str("CH1 event cnt: ");
    tx_int(event_cnt);

    event_cnt = (data_in.byte[1] & 0x07);
    tx_str("Result Reg: ");
    tx_int(event_cnt);

    }
    
    
    void GetReg(char reg)
    {
    Word_32 data_in;
    unsigned long val = 0x0000;

    data_in = ReadWordSPI(reg, 32);


    val = val = ((((unsigned long int)(data_in.byte[0] * 256 + data_in.byte[1]) * 256) + data_in.byte[2]) * 256 + data_in.byte[3]);
    tx_UL_int((((val/262.144) - 670) -80) * 0.15);

    }
  • Hi,

    We managed to figure out what was the problem and can communicate with the TDC now. The problem was we did not trigger the RSTN line at the beginning so it was not initializing correctly. Thanks for the help!

    -Chee

  • Hello Kristoffer,

    I am working on a laser range finder application too . I have read your reply which is really helpful but  I still have some problems in designing the APD bias circuit. I think the First Sensor APD  Specifically: AD800-8 is pretty suitable to my application. The following circuit may be used as the bias circuit and I wonder what kind of capacitor should I select as the C3.

  • Hello Neil;

    I am working on a laser range finder application too. I have read you reply which is very helpful but I still have some problems about designing the APD bias circuit. I know the high voltage can make terrible demage to the op amp so I want to prevent it with a capacitor. Am I right? The following circuit, I think, may be suitable to my application. By the way, I have selected the First Sensor APD specially AD800-8.

  • Hello,

    I'm designing a transimpedance amplifier with THS3202 (cfa), which is very fast. Perhaps too fast? So, my problem is that it is all time unstable when i'm putting a feedback resistor from the output to the inverting input.

    No resistor value matchs - is too low the device wants to be very hot (ok lower restistor-more current) and in datasheet there are only given the resistor values for optimal perfomance correlating to the gains - voltage gain i think

    Well, i've a front end - a photodiode with only 0.57pF.. the impedance of it is dependent of the frequency and so i ve at all frequency another impedance.

    I've tried stability analyses with bode plot but in datasheet there's open loop transimpedance gain of 300k ohms BUT in my TIA configuration i get simulation results of only 300 ohms which means that i must use very small resistor values. In datasheet the transimpedance gain (openloop) curve is shown like a system first order-it falls 20 dB/dec - so that i must have -90 degree phase *** but this systems have different poles and zeros that you have a system higher oder that there are higher phase shifts.

    The point is that the stability criterium is not filled. At the interessting bandwith or frequency - the phaseshift does not arrive -180 degree (only at higher freq when the gain of the system is smaller than 1)

    so, my target is to get it stable and bandwith is at first a secondary point.

    Now my question:

    can i get the THS3202 at all stably?

    best greetings

  • Thomas,

    Current feedback amplifiers are not typically used in transimpedance designs because the traditional compensation technique of placing a small capacitor in the feedback path can cause stability problems for CFA's.  For high speed transimpedance applications, the OPA847 is a more suitable choice.  There is TIA application material in the datasheet, and you can find a design example attached to a previous forum post here:

    http://e2e.ti.com/support/amplifiers/high_speed_amplifiers/f/10/t/272.aspx

  • Hi Thomas,

    CFB can be used in transimpedance amplifer, but since the feedback resistor is also the compensation element of the amplifier you have a limited usable gain range.

    The Rfs recommended in the datasheet represent the optmial feedback value for stability in  agiven gain configuration.

    Another possible issue with the CFB as TIA is that the APD will add a parasitic capacitacne on the inverting input.  Since the inverting node is low impedance, there is the possibility that it will destabiliotze the amplifier and lead to oscillations.

    Voltage feedback amplifiers tend to do better for this reason in TIA applications.  For low gain, you can look at bipolar amplifier such as the OPA847 or the LMH6629.  For high gain, look at the FET input amplifier such as the OPA657.

    Note that all these amplifier are decompensated as the higher the GBWP, the higher the effective BW you can achieve for a given transimpedance gain.

  • hay @ Bart and Xavier,

    thanks for yours answer. yes only Rf is the trick screw.. when i've read about photodiode amplifiers theres many times said that putting a Cfeed in parallel to Rf compensates the phase and stabilisize the TIA. well, theres talking about vfa but no one said this directly.

    a Cf around a cfa kills the stability - everywhere is written that parasitic capacitance on inverting input and output must be so small as possible. and this is the task of a good layout right?

    but to get the THS3202 stably i can't only chose a recommended resistor.. i've tried it but it doesn't work.

    The thing is this that the THS3202 as the TIA in my TIA design must have a gain of more than 1 at higher frequencies where the phaseshift of 180 degree is reached.

    So the gain must be smaller than 1 at those frequencies and reducing the gain (transimpedance) at those freqs is possible with a capacitor in feedbackloop-which is not a good idea using cfa.

    Is there any other possibility putting him quitly?

    greetings