DC to DC converters are used to efficiently convert DC voltages. They have a conversion efficiency of up to 95% making them useful for LED strips, bike lights, battery chargers and solar powered devices. A voltage converter requires a PWM source such as a microcontroller. Although you could use specialty ICs I used the Arduino because it is commonly used on Instructables and six converter outputs are possible. You can write your own code to the Arduino as well. In this Instructable I will show you how to use the Arduino-based boost (step-up), buck (step-down) and buck-boost (step-up or step-down) converters.
Step 1: Material required
Boost Converter (per output)
Buck Converter (per circuit)
Non-Inverting Buck-Boost converter (per circuit)
1 - 2A 100uH inductor
Inverting Buck-Boost converter (per circuit)
When designing the circuits, please wear goggles! Capacitors can explode when overcharged or installed incorrectly.
Step 2: Boost Converter circuit
In boost converters the output voltage is higher than the input voltage. The Arduino maintains the output voltage by monitoring it and adjusting the duty cycle based on it. The frequency is 62.5 kHz. If the output voltage falls below or rises above its desired value the duty cycle increases or decreases.The higher the MOSFET's on time the more the voltage is stepped up. The feedback voltage is maintained around 500mV. The outputs can be adjusted with the potentiometers.
The converter circuits have protection features. When first powered it starts at 0% to minimize the inrush current. The zener diodes at the analog inputs are used for overvoltage protection. They ensure that the feedback voltage does not exceed their breakdown voltage of 4.7V. The RC snubber reduces the ringing at the drains of the MOSFETs. In this circuit R13 prevents you from setting the voltage too high. The maximum voltage to use depends on the breakdown voltage of the schottky diode, the Vdss value of the MOSFET and the voltage tolerated by your load. The formula R13=Vref/((Vmax-Vref)/(R11+R12)) calculates the value of R1 that should be used. The same formula can also be used for the other converters with resistors' numbers substituted.
Step 3: Buck Converter Circuit
In buck converters the output voltage is lower than the input voltage. Unlike the boost converter this one as well as the inverting buck-boost converter uses a P-channel MOSFET for its switch. This means a NOT gate is needed to drive it at 12V and 0V which cannot be done by the Arduino. The transistor will be permanently on if driven by the Arduino's pins. The NOT gate also allows the same sketch to be used. The lower the MOSFET's on time the more the voltage is stepped down.
Step 4: Non-inverting Buck-Boost Converter
In non-inverting buck-boost converters the output voltage is positive and may be higher or lower than the input's voltage. The buck and boost converters were cascaded to step-down or step-up as necessary. At any given time only one of the converters is active. When the Arduino powers up it soft starts in buck mode. If the output voltage is below its desired value and its duty cycle is 100% it switches over to boost mode with the gate of Q2 low. If the output is above its desired value and its duty cycle is 0% it switches back to buck mode with gate of Q3 low. You can set it to buck instead of buck-boost mode if you prevent the buck stage's duty cycle from reaching 100%. Since this circuit uses two switches a different sketch is needed.
Step 5: Inverting Buck-Boost Converter
In inverting buck-boost converters the output is negative and may be higher or lower in magnitude than the input voltage. Since the 500mV feedback is negative and the Arduino's ADC pins cannot read negative voltages the op-amp inverts it to a positive value. The higher the MOSFET's on time the higher the output voltage. Based on my measurements this circuit is relatively inefficient. The transistor was hot at heavier loads which may be caused by its resistance. This circuit uses the one switch sketch.
Step 6: Boost and Buck Converter sketch
The two sketches were written for the Arduino Uno. To adapt it for other chips such as the ATtiny you can refer to their datasheets. The sketch "one_stage_converter" is for the buck, boost, and inverting buck-boost converter. The sketch "two_stage_converter" if for the non-inverting buck-boost converter. Any of the PWM pins 6, 5, 9, 10, 11, and 3 can be used for the one-stage converters, allowing six outputs. For the two-stage converter each output must use the same timer with the OCxA pins for the buck stage and the OCxB pins for the boost stage, allowing three outputs. Since the prescaler for timer 0 is changed the millis() and delay() functions will be 64 times faster and their values will need to be 64 times larger. I have enabled only one output. You may re-enable the other outputs by uncommenting them in the setup() function.
In the sketches you can adjust timer 1's PWM frequency, the feedback voltage, and the maximum duty cycles for each output with the following:
A higher frequency allows smaller inductances to be used. This allows higher current ratings because when inductors are in parallel they have a higher current rating and a lower combined inductance. Only timer 1's frequency can be changed with two outputs available. To change it for the other timers refer to the datasheet. You can use the following calculator for selecting the inductors and other parts: https://learn.adafruit.com/diy-boost-calc/the-cal....