This page is all about logic level converters that allow you to easily change between different logic voltage levels.
You know when you just bought that nice shiny new chip to play with, you get it in the post and only then do you think: What about voltage levels? Then you see that the new chip only works at 3V3 and the only microcontroller you have works at 5V! See this project for an example of using the logic converter circuit.
First of all you think that's easy, I'll just use a voltage divider tro drop the high side voltage to 3V3 and
problem solved. Maybe it is, but if your device is an I2C device (where you need
bidirectional communication on the data line), using a divider on the high side
won't allow the voltage to go the other way at a reliable level.
The solution is to use a level converter which only requires a MOSFET, and two pull up resistors.
This method uses a MOSFET and relies on the parasitic diode between
Source and Drain (this is usually a problem rather than a benefit!), to
allow full bidirectional communication with low and high side voltages.
The operation is explained below.
This is a very useful bit of electronics that also happens to be extremely simple, but extremely clever. It lets you easily convert between different voltage level systems using only a simple enhancement mode logic level MOSFET and a couple of 10k resistors.
Since the 10k resistors pull up inactive lines, they have to charge
any stray capacitance so for fast speed use 1k resistors. The rate of
voltage rise will therefore be faster.
wrt = with respect to.
When the high side outputs a '1' (5V) drain and source are pulled towards
the high voltage so the source is high wrt. gate (reverse Vgs voltage) so the
MOSFET is off so the low side pullup is active and pulls the low side to
When the high side outputs a '0' (0V) the source is pulled low wrt gate, so the gate is higher than the source and the MOSFET is on (Vgs is positive). The MOSFET then conducts the zero through to the low side pulling down the low side.
When the low side outputs a '1' (3V3) the gate source voltage is zero so the
MOSFET is off. The high side pullup is active and pulls the high side to 5V.
When the low side outputs a '0' (0V) the gate source voltage is 3V3 and the MOSFET is on. The MOSFET then conducts the 0V through to the high side pulling down the high side.
For a 4 wire SPI interface there is no bidirectional requirement (data out:
SDO, and data in: SDI use separate pins) so you could use the divider method
and that requires 3 dividers with a total of 6 resistors.
To go from 5V to 3V needs a resistive divider with 22k and 33k (which drops the output to 3V) (or you can replace the 33k with 39k for a drop of 3V2 (for a 3V3 system).
A 3 wire SPI interface requires a bi-directional data I/O conversion - the data I/O pin uses bi-directional signals.
Find out the differences between the HMC5883L and the QMC5883L and whether they are compatible.
Secrets of Arduino absolute value abs() - Why it might fail, Why it may cause problems...and how to fix it.
Arduino Analog Output: How to create the most accurate PWM analog ouput and how to create analog PWM sine waves.
Using the ACS758 to measure very high current
Arduino Voltage reference: Both the Uno and Nano have a built-in voltage reference: Find out how to make it more accurate. In addition find out how to use it to measure the supply voltage 1V8 ~ 5V5
Find out how digitalWrite() works...Now use 17x Faster macros!