High Currency Boost Converter

Hello all,

I have a Problem with my project. I am trying to build a boost converter which is also able to control high voltages and currencies and is controlled by a feedback channel. Depending on the temperature of the sensor, the voltage should be x Volt or y Volt. The code works with no problems. I am working with an external battery pack 3S2P. The circuit works with no problems as long I don't connect a consumer which needs high currency. WIth 1000 Ohm, no problem, 220 Ohm also works, but with a 10 Ohm resistor, the circuit is not able to reach the wish voltage for example 20 Voltages. In the following you find the code and the circuit.
Maybe the frequency of the Arduino is not high enough? Maybe wrong inductor / conductor size?

I really appreciate your support. Thanks.

The code is as following.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Adafruit_BMP280 bmp; // use I2C interface
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
float zwischenspeicherLuftdruck;
float zwischenspeicherTemperatur;
const int onPin = 9;
float onVoltage = 20.0;
float standbyVoltage= 7.0;
const int feedback = A0;
int pwm = 0;

void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 Sensor event test"));
lcd.begin(16,2);
lcd.print("test");
lcd.setCursor(0,1);
lcd.print("phase");
delay(500);
lcd.setCursor(0,1);
lcd.print("Ready");
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1) delay(10);
pinMode(onPin, OUTPUT);
pinMode(feedback, INPUT);

/* Default settings from datasheet. /
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /
Operating Mode. /
Adafruit_BMP280::SAMP![1|666x500]
LING_X2, /
Temp. oversampling /
Adafruit_BMP280::SAMPLING_X16, /
Pressure oversampling /
Adafruit_BMP280::FILTER_X16, /
Filtering. /
Adafruit_BMP280::STANDBY_MS_500); /
Standby time. */
bmp_temp->printSensorDetails();

sensors_event_t temp_event, pressure_event;
bmp_temp->getEvent(&temp_event);
bmp_pressure->getEvent(&pressure_event);
}
}

void loop() {
//Einspielen von Methoden
sensors_event_t temp_event, pressure_event;
bmp_temp->getEvent(&temp_event);
bmp_pressure->getEvent(&pressure_event);

//gemessene Werte einer Variable zuordnen
zwischenspeicherTemperatur = temp_event.temperature;
zwischenspeicherLuftdruck = pressure_event.pressure; // in hPa

//Ausgabe von Werten, informativ für uns
Serial.print(F("Temperature °C = "));
Serial.println(zwischenspeicherTemperatur);
Serial.print(F("Pressure hpa = "));
Serial.println(zwischenspeicherLuftdruck);

float output = analogRead(feedback);
Serial.print("actual voltage: ");
double actualvoltage =analogRead(feedback);
double actualVoltageReal = actualvoltage / 1023 * 5.0 * 43.0 / 10.0;
Serial.println(actualVoltageReal);

if(zwischenspeicherTemperatur < 44){
Serial.print("power voltage: ");
Serial.println(onVoltage);
if (onVoltage > actualVoltageReal)
{
pwm = pwm+1;
pwm = constrain(pwm, 1, 254);
}

else{
pwm = pwm-1;
pwm = constrain(pwm, 1, 254);
}
analogWrite(onPin, pwm);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("heating");
lcd.setCursor(0,1);
lcd.print(actualVoltageReal);

}
else {
Serial.print("standby voltage: ");
Serial.println(standbyVoltage);
if (standbyVoltage > actualVoltageReal)
{
pwm = pwm+1;
pwm = constrain(pwm, 1, 254);
}

else{
pwm = pwm-1;
pwm = constrain(pwm, 1, 254);
}
analogWrite(onPin, pwm);

lcd.clear();
lcd.setCursor(0,0);
lcd.print("standby");
lcd.setCursor(0,1);
lcd.print(actualVoltageReal);

}
Serial.println(pwm);
Serial.println("___________________");
}

This is not a project for an amateur with little to no understanding of electronic design.

Specify your current and voltage requirements, and we can help you find a suitable commercial DC-DC converter.

Please use code tags when posting code.

I used to manage specialist power supply engineers. Even though they have done it many times before it always took at least three attempts at a PCB layout before they got it stable for all current loads.

Yes it is simple to get low current boost converters working hence the cheap crap on eBay. But as the current increases the layout becomes increasingly important as does the magnetic characteristics of the inductor. You must keep out of the saturation zone, that is the biggest limiter on current.

What is worrying is that you think this might be anything to do with software. It is clearly a hardware problem.

After 3 years in College doing Electronics and maybe 5 years as a design\production engineer in the early days of microcontrollers I went for a interview for a company making switched mode supplies.

I never stood a chance of the job, I knew general electronics and microcontrollers well enough, but switched mode supplies was a different kind of voodoo.

Well, the second problem here, is using a FET - the IRF3205 (apparently written wrongly on your diagram) which is not a logic-level device and therefore completely unsuitable for control by an Arduino.

But the first and most significant thing wrong, is attempting to put an Arduino in a feedback loop for such a purpose.

So this project is clearly a "dead duck". :yawning_face:

I doubt the Arduino can switch fast enough to make a decent buck converter. Also I don't think you schematic is realistic and functional.

If you really want to go down this road then you should first look at a standalone buck converter. Understand how it works then see if the arduino can replace a simple converter IC.

Hint look at a typical inductor and see where it would saturate. If the word saturate is new to you then you are not prepared to undertake such a project.

Which it clearly cannot as it is not a voltage converter IC.

This is where the meme "You can use a microprocessor to emulate something/ anything" totally collapses.

Hey all, I really appreciate your feedback and useful answers.

I would also buy a commercial one, but it must be able to be controlled by the Arduino or something different. The boost converter must represent different situations. As you can see in my Code when the Sensor measures a Temp. bigger than x, the boost converter must directly switch the state and give an other voltage to the load. If there is any commercial booster which can do this, I would kindly ask you to recommend me one.

As you already said it is not as easy as I thought at the beginning. I updated my circuit and put a bigger coil (1100 uF, 6 A) in it as soon as it arrives to my house and I cancelled the mosfet driver, because it works without. Unfortunately I cannot upload an image, because I am a new user.

According to this website this one should work. Has anyone some experience with this calculator? The frequency has also a big influence on the components. Does anyone have experience in adjusting the frequency of an Arduino?

Thank you all in advance!

You are attempting to generate different voltages in this application, based on environmental data inputs, but what are you doing with the output power ? What device is it driving and are there alternative ways of driving that device say using PWM at a fixed voltage/current?

Yes, it will work as an entirely unregulated voltage booster.

From the Adafruit web page: "We can do this because we don't need a precision output and the current draw is mostly constant."

Just because a coil is rated at a large current it doesn’t necessarily mean it will have a high magnetic saturation. Especially at the frequencies you want / need to switch it at.

Inductors for a switched mode supply are not your run of the mill inductors.

Also what is that 1100 uF figure got to do with anything? That is a capacitor size.