16 channel level converter with dual regulators
If, like me, you’ve spent a lot of tinkering with things like TFT modules and other highly integrated peripherals then you’ll be familiar with the depressing section in the device datasheet that looks like this:
The DC characteristics table tells you the voltages that a device expects to receive and these days it’s common for multiple voltage levels to be expected and sadly for those of us that still occasionally use the Arduino, 5V (TTL) level tolerance is becoming rarer as manufacturers switch over to ever lower CMOS voltages.
Even though I mostly use the STM32 3.3V ARM MCU it’s still quite common to see a specification like the one above where a 1.8V level is specified, something which I cannot supply from my MCU development boards. I’m going to need some help and this is how it’s done.
A level converter solves the voltage problem that I described above by taking a digital input signal, adjusting the voltage level and pushing it out again on the ‘other side’ of the device.
I really needed one of these so I tried to find a pre-made board out there on the ‘net. The only one I found was by Sparkfun. Unfortunately it doesn’t meet my needs because it has only a fraction of the channels I’d need (I generally need to drive a whole bus full of channels) and I’d still need to find a way to generate those low target voltages to supply the ‘other side’ of the regulator.
So I decided to make my own, but you knew that was coming anyway didn’t you?
My level converter
My level converter is based around the NXP 74ALVC164245DL device. The specifications are impressive. Logically it’s presented as two independent octal ports whose directions (but not voltages) may be specified independently.
It’s bi-directional; each one of the octal ports has a control input that allows you to select the data direction. This is important because the two ‘sides’ to the device have different maximum voltage support – one side supports up to 5V and the other side up to 3.3V.
The propogation delay (the time it takes for a change in a logic level to get from one side of the device to the other) is around 3ns, or 333Mhz for a 5V to 3.3V conversion. Plenty fast enough for any MCU or peripheral that I’ll be using.
So far so easy, why not just design a board that breaks out the pins of this useful little IC and be done with it? Well of course I could do that but then I’d be left with the problem of where to source these sometimes obscure voltages. And that’s where I got a little bit carried away.
So my final design includes not just the level converter but two separate adjustable output LDO regulators, one hooked up to each side of the converter with preset jumpers for 3.3V, 2.8V, 2.5V and 1.8V outputs as well as a disabling jumper for when I’m supplying the voltage externally.
The voltage regulator I chose for this design is the adjustable version of the Fairchild FAN2514. It’s capable of supplying up to 200mA and its output voltage is selectable via a simple feedback resistor.
The output voltage equation is 1.3 * (1+(Rupper/Rlower)). I fix Rlower at 10kΩ and select 3.9kΩ, 9.1kΩ, 12kΩ and 15kΩ for Rupper, selectable via a jumper. This yields output voltages of close to 1.8V, 2.5V, 2.8V and 3.3V. Crucial in the selection of the FAN2514 is it’s inclusion of an EN (enable) pin. I break this out to a jumper that I can use to disable the voltage regulator when I can supply that side of the level converter externally.
In the above schemetic, vcca is the supply voltage to port A, selectable either from the voltage regulator or externally. vccb is the equivalent for port B.
Bill of materials
The PCB layout
The board was manually routed in the Eagle designer. It is quite a dense layout for a manually assembled board but the routing did not take that long.
The decoupling capacitors for the level converter IC are placed on the bottom of the board and because of this I have featured M3 screw holes in each corner so that I can give the device some ‘feet’ to keep those capacitors off my work surface.
JP1 and JP2 are the voltage regulator output selectors for port A and port B respectively. JP3 is the main control block. Power terminals are here as well as the selectors that determine the direction of data transfer and how many of the ports are actually enabled.
The two 16 pin headers on the left and right are the data I/O terminals for port A and port B respectively.
The assembled board
The front of the board
Looking good, even though I say so myself! The screws should give you a sense of scale. The board is only 50x50mm.
The back of the board
Not so exciting on the back is it? Well, I had my camera all warmed up and ready so it seemed a shame not to click the shutter on the underside of the board. I selected 0603 capacitors for the bottom so that the feet would easily lift them above the surface.
I can do a lot with this board. I can use the voltage regulators on their own. I can use the regulators to power either or both of the conversion ‘sides’, and of course the main point of the whole thing is that I can convert up to 16 channels of signals.
Inputs for using the level converter and regulators
|A||B||Direction||A supply||B supply|
Inputs for using only the voltage regulators
|Voltage Regulators Only|
In the table below a blank space means that the jumper is OFF.
* Where VCC is required as an input (it supplies the regulators) the minimum voltage is the highest of the regulator outputs plus 200mV (the dropout voltage of the FAN2514).
And finally, testing…
Does it all work? Well yes it does. Here’s a photograph showing it in action converting an 8-bit data bus plus control signals from the 5V output of the Arduino down to an acceptable 3.3V for the little TFT that I’m controlling.
5V to 3.3V level conversion of a bus
Schematic and CAM files available for download
I’ve open-sourced the schematic, PCB CAD and the Gerber CAM files. Visit my downloads page to get yourself a copy.