So, I have designed the following boost PFC circuit in simulink: enter image description here

This is the DC output voltage: enter image description here

But this is the input current: enter image description here

I am trying to tune the PI control but nothing works out. The PI control seems to be working in the sense that I am able to control the voltage, but the current doesn't get fixed no matter what. Any inputs are greatly appreciated.

This is the model: https://drive.google.com/file/d/1vCDcx8Vl7IgIyX500Ry1uzpcngZ_LvR-/view?usp=sharing

  • \$\begingroup\$ I don't have Matlab, but a few remarks: what voltage is the input? Its peak should be smaller than the output. The caps after the bridge should not exist, in theory, but if they are it's to reduce high(er) frequency noise without distorting the doubly rectified waveform, which serves as a reference for shaping the current. What values do those have? (usually 1 uF or so). I can't see well in the picture, but the output of |V(rect)|*V(o) should be compared to I(L), not subtracted and ran through a PI controller. Then they usually go through an SR latch. \$\endgroup\$ Mar 8, 2022 at 9:40
  • 1
    \$\begingroup\$ What’s the bandwidth of the PFC feedback? It needs to be very low, around 7 Hz to be effective at shaping the input current. Also, does it operate in DCM or CCM? If the latter, do you have 1/V^2 implemented? \$\endgroup\$
    – winny
    Mar 8, 2022 at 10:04
  • \$\begingroup\$ @winny thank you! I realised I had divided it by V only once, as opposed to V^2. That made it work. Thank you. If you can write it as an answer I can accept it. \$\endgroup\$ Mar 8, 2022 at 12:02

1 Answer 1


You need to do several things to make the PFC feedback loop shape your input current to follow the input voltage:

  • Slow enough output voltage feedback, about 7 Hz (your outer loop). If it's too fast, it will just try it's best to regulate the output voltage to your setting. This is opposite of what you want. If it's slow enough, the 100/120 Hz ripple will be too fast for your feedback loop and the boost will keep the duty cycle throughout the half-wave.
  • If you operate in CCM, the converter will consume current according to Vin^2*D, and with D being constant, pull a lot of peak current on the top of the input voltage waveform. You need to implement a 1/Vin^2 function to operate on a much faster response time, perhaps even cycle by cycle. Please take a look at a commercial CCM PFC circuit and this is built into the IC. For DCM or BCM, this isn't needed. Also, you can make the same thing happen if you have a fast inner current control loop with Vin as reference. The effect is the same but you need to sense current on the high side.

Here is an example from ST L4984D datasheet for the 1/Vin^2 function. ST datasheet link enter image description here

  • \$\begingroup\$ my circuit is working but it seems to be drawing a large amount of inrush current, almost 10 times the actual current. How can I minimize that? \$\endgroup\$ Mar 8, 2022 at 17:06
  • 1
    \$\begingroup\$ @needbrainscratched Classic issue for boost PFCs. Place a 10 ohm NTC in series on the AC side and bridge it over with a relay once the DC level is high enough or after a predetermined time. \$\endgroup\$
    – winny
    Mar 8, 2022 at 17:13
  • \$\begingroup\$ thank you, sounds good! Sorry for bombarding with queries but just another minor one: I can't seem to get the current THD below 5% which is what I need. Is it an issue with boost PFC topology in general or can I fine tune the controller more to achieve a lower THD? \$\endgroup\$ Mar 8, 2022 at 17:27
  • \$\begingroup\$ Not really, but you will see distortion when you are crossing from CCM into DCM, phase lag and what not. The big IC manufacturers have lots of tricks for this which you may need to reinvent in your simulation. Is there a particular point in the half-wave which looks distorted or is it just general? Have you tried high side current sensing and an inner current control loop? \$\endgroup\$
    – winny
    Mar 8, 2022 at 18:07
  • \$\begingroup\$ again apologising for the silly question but how exactly do you define the bandwidth of a PI controller? Because it is not a standard second order transfer function \$\endgroup\$ Mar 9, 2022 at 3:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.