5V to 3.3V Logic Level Shifting Stragety Notes

Here are some notes on different level-shifting strategies to convert from 5V to 3.3V circuits. As usual, this is for quick-and-dirty stuff.

I searched the Internet, found a couple of appealing strategies, and tried them out. I connected them to an Arduino output that cycled between high and low, and connected an oscilloscope to the output.

Strategy 1: Ordinary Diode


This is a very simple strategy with few parts that I found on Rob Faludi’s page XBee Level Shifting.  This is what I saw on the scope:


It’s been too many years since I’ve been in school to remember my analogue electronics, so at first this surprised me. Top to bottom is approximately 3.3V, but the huge rise and fall times were not what I expected.

I suspected that the 10k resistor was the culprit, (e.g. see Effects of Varying I2C Pull-Up Resistors), and threw in a 220 ohm resistor as an opposite extreme. The results were much more promising. The falling edge is very sloppy, but the rising edge is pretty crisp.


Strategy #2: Zener Diode

This is a variation on the first, but relying on the zener to limit voltage to 3.3V. The 10k ohm resistor I found on more than one site, so I tried it first of all.


This produced the following on the scope:


This is atrocious with a 10k resistor in there. Switching to the other extreme, the 220 ohm resistor, I got the following beautiful display. The falling edge has some roundoff on the bottom, but it demonstrates that the zener diode’s a viable quick and dirty level shifter.


Strategy 3: Bus Transceiver

The last strategy I tried uses a 74LVC245 bus transceiver.


Using an actual IC is a little heavy-handed for a single line, but the results were solid.


Strategy #4: Resistor Voltage Divider

Because 3.3V is 2/3 of 5V, it’s easy to create a voltage divider out of resistors.


Using 10k resistors produced the familiar shape:


While dropping down to the other extreme, 200 ohms, produced a solid waveform:


Demonstrating that if you need a dirt simple level shifter, three resistors may do in a pinch. However! Danger! Danger! The impedance of the surrounding circuitry will wreck havoc with the voltage divider. I really do not recommend this method.


I have not tried these yet, but there are some notes on the Arduino Playground site here, and this document here.


Uploaded cleaner images, added fourth strategy.
Created addendum.
This entry was posted in Micro & Hardware and tagged , . Bookmark the permalink.

21 Responses to 5V to 3.3V Logic Level Shifting Stragety Notes

  1. Checor says:

    Thanks for the info! It would help a lot in my new project.

  2. fabiodive says:

    Your test results depend on the impedance of the receiver side (example..an ADC),
    please try to connect a voltage divider with low resistors between an ADC input and an
    accelerator output..You need to consider also adding a buffer with an op-amp to correct
    the impedance. Sometime it should be before the divider, sometime after, it depends by
    the datasheets.
    Thank you anyway for your tests and try to clear the subject.

  3. Admittedly, these tests were performed as a simplistic exercise, and any input is welcome.

    I wasn’t thinking in terms of using an op amp, but yes, this would also work.

    You are correct that the impedance will change things, especially with the resistors. The next time I revisit this I’ll try to expand on this.

    Thank you kindly for the comments.

  4. kilianc says:

    What you mean with “While dropping down to the other extreme, 200 ohms, produced a solid waveform” can you upload the new schematics?

  5. The circuit is the same. I changed the resistor from 10kΩ to 200Ω.

  6. kilianc says:

    Which one ? 😀

  7. Pingback: 5V TO 3V3 BI-DIRECTION :: | BRG

  8. Pingback: 5V TO 3V3 BI-DIRECTION « Bir Robotic

  9. happycactus says:

    Also the simple inverter (mofset with drain resistor and gate resistor network) can be a good and less expensive alternative to the bus translator.

  10. Lobna Amer says:

    Wow! You just displayed all your experiment and results in such an informative and easy to follow way! Excellent work

  11. Pingback: communication between SD card and microcontroller

  12. chisight says:

    Well done! Would be nice to see the probe’s impedance and also to see the ipact of varying input capacitance, but this is great concrete data in a place usually just muddied in speculation.

  13. I’m a little surprised nobody mentioned this earlier, but… umm… unless I’m missing something your Strategy 1 which gave you poor results is not at all similar to the source you say you got it from! You say, “This is a very simple strategy with few parts that I found on Rob Faludi’s page XBee Level Shifting.” so I followed that link and immediately saw the title difference. This page we’re on right now says, “5V to 3.3V Logic Level Shifting Stragety Notes” and your diagram clearly shows 5V being the input and 3.3V being the output, right? Go to the page you’re referencing and the diagram that matches your clearly states the EXACT OPPOSITE. So… could this be the reason you got poor results?

  14. Eric B. Wertz says:

    The disadvantage of the low-valued resistor circuits (esp the voltage divider) is the fairly high current consumption.

    Using the high-valued resistor seems like it may be perfectly fine for one-shot circuits like a reset line since its relative lack of speed may not be critical.

    Nice summary, thanks.

  15. Steven,

    Yes it’s always possible I’m wrong. However if I look at the XBee Level Shifting page, it shows both 5V to 3.3V and 3.3V to 5V.

  16. Eric, I agree with your comments. This page is in dire need of an update.

  17. Err.. of course it does, with a completely different circuit :) It is pretty clear, really. There is one diagram (yours) clearly labeled as 5V to 3V and another one above it (different than yours) labeled 3V to 5V translation. Both clearly have an input and output marked, not corresponding to the way you’re using it. What am I missing?

  18. Steven,

    Thank you for your persistance. I see what you mean. It’s been some time since I wrote this article originally and believe I now remember my thought process. My circuit and his circuit are labelled differently because of the point of reference. For consistency I’m labelling input and output with reference to the interface circuit. Rob Fauldi is labelling with reference to the circuits being interfaced. Thus our “input” and “output” will be switched around.

    If you observe in the image, the lower half is a 5V-to-3.3V convertor per the wording on the left-hand side.

    The image of the circuits


    On my picture, I labeled my 5V side “input” as it’s the 5V input for the interface circuit. On Rob Fauldi’s page the 5V side is labeled “output” as it’s the output of the implied 5V circuit being interfaced.

    Correspondingly, I labeled the 3.3V side of my image “output” as it’s the 3.3V output for the interface circuit. On Rob Fauldi’s page the 3.3V side is labeled “input” as that’s the 3.3v input for the implied 3.3V circuit being interfaced.

    I apologize for the confusion.

  19. Brian says:

    @James Reuben Knowles,

    Thanks for working and posting this to the web. I was searching for logic level shift circuits to translate 5V PPM logic level signals to 3.3V. Your schematics and tests gave me the confidence and understanding to select and build a zener diode to ground shift level circuit. I used a Fairchild 1N4728A zener diode rated at 3.3V break down tied to ground and a 20 Ohm inline Resistor (Actually, I used two 10 Ohm resistors in series measured at 20.4 Ohms per multimeter.).

    I simulated the circuit in LTSPICE with a DC square wave of 5V @50Hz input to simulate a PPM signal. The simulated shift level circuit results were an output signal of 3.4V peaks for a circuit R= 20 Ohms. I simulated higher Ohm resitances but, the output voltage peaks fell to 3.2V when I used R > 20 Ohms (Simulated R=30, 100, 200, 220, 1K, & 10K.). Odd? My physical circuit with R=20.4 Ohms and a constant DC input of 5V was translated to 3.34V output as measured per my multimeter. Good E’nuff. Thanks!

  20. Pingback: lucadentella.it – Collegare Arduino a dispositivi a 3.3V

Leave a Reply