Help, how to make a buck chopper simulation using SCR only ?

i want to know how to make a buck chopper simulation in MATLAB using only SCR without mosfet/IGBT is it possible ?

Answers (1)

Hi @Daniel,

Yes, it is technically possible to model a buck chopper topology using SCRs in place of MOSFET or IGBT switches. The Thyristor block available in the Specialized Power Systems library can be used for this purpose. However, please note that this library has been marked “To be removed” in release R2026a, and I recommend transitioning to the corresponding Simscape Electrical blocks for long-term model compatibility.

The Specialized Power Systems thyristor model is implemented as a series combination of Ron, Lon, and a forward-voltage source Vf, along with a controlled switch. The conduction state is determined by the applied gate signal as well as the device voltage (Vak) and current (Iak). This model is suitable for SCR-based converters, including buck choppers.

One important consideration is that SCRs are latching devices. They remain in the conducting state after being triggered until the current falls below the holding current. As a result, traditional PWM strategies used with MOSFETs or IGBTs cannot be directly applied. The commutation behavior of the inductor must be taken into account when designing the control scheme.

If you are beginning a new model, I would encourage you to use the Simscape Electrical thyristor components, which provide similar functionality and will continue to be supported in future MATLAB releases.

Reference https://www.mathworks.com/help/sps/powersys/ref/thyristor.html

18 Comments

So, i tried to make the circuit and i cant figure on how to make the forced commutation with SCR, can you help me ?

Hi @Daniel,

You have the basic buck topology with the inductor, capacitor, and load resistor on the output side. You also have pulse generators connected, which is good.

The critical piece missing is the commutation circuit around your main SCR as you highlighted in blue section.

As I mentioned in my comments, you should use the Thyristor block from the Specialized Power Systems library (though note this library will be removed in R2026a, so consider transitioning to Simscape Electrical Thyristor blocks for future compatibility). The thyristor model is implemented as a series combination of Ron, Lon, and a forward-voltage source Vf, with a controlled switch. The conduction state is determined by your gate signal as well as device voltage and current.

For the commutation circuit implementation, you need to add an auxiliary thyristor in parallel with your main thyristor, connect your commutating capacitor between them, and include a small inductor in series with the auxiliary thyristor. The capacitor should initially be charged to approximately your DC supply voltage with the appropriate polarity.

The control sequence is: trigger the main SCR to start conduction and deliver power to your load, then when you want to turn it off, trigger the auxiliary SCR. This discharges the capacitor through the auxiliary SCR and the discharge current flows in reverse through the main SCR, bringing its current below holding current and turning it off. The capacitor then recharges with opposite polarity through the load circuit, ready for the next commutation cycle.

Important parameters to set: For the main thyristor, use typical values like Ron = 0.001 ohm, Lon = 0 (set to zero for discrete simulation), forward voltage around 1V, and holding current around 100mA. For your commutating capacitor, size it based on the formula C ≥ (I_load × t_off) / V_supply, where t_off is the SCR turn-off time (typically 10-50 microseconds for inverter-grade SCRs). The commutating inductor should be small, around 10-100 micro-Henry just enough to limit the discharge rate.

One critical consideration: because SCRs remain latching after being triggered, your switching frequency will be limited by the LC commutation circuit resonance. You can't achieve the same high-frequency switching as with MOSFETs. Typical SCR chopper frequencies are in the range of a few hundred Hz to a few kHz, not the 20-100 kHz typical of MOSFET choppers.

The main challenge you'll face is that the commutation behavior depends heavily on the inductor current, so your control scheme needs to account for load variations. You also need to ensure the capacitor has sufficient time to recharge between switching cycles, which limits your maximum duty cycle and switching frequency.

For your specific circuit, I'd recommend starting with these component values: commutating capacitor C = 10 micro-Farad, commutating inductor L = 50 micro-Henry, SCR holding current = 0.1 A, auxiliary SCR with same parameters, and a freewheeling diode across your load inductor to handle the inductive current when the main SCR is off.

If you share your specific requirements (input voltage, output voltage, load current, and desired switching frequency), I can help you calculate the exact commutation circuit component values you need.

Hope this helps.

so i tried to make the commutation circuit by following your instruction, and im still confused do you think the commutation circuit is correct now ?

@Daniel, your circuit topology is still not correct. The main issue is that your auxiliary SCR isn't actually creating a path that applies the capacitor voltage across your main SCR. Right now it just goes to ground, which won't turn off the main SCR.

Think about it this way - when the aux SCR fires, the charged capacitor needs to appear directly across the main SCR terminals (anode to cathode). That's what creates the reverse voltage to turn it off. Your current path just dumps current to ground instead.

Here's how the commutation branch should connect: Take the positive terminal of your commutating capacitor and connect it to the point right after DC+ (where your main SCR anode connects). Then from the negative terminal of that capacitor, connect it to the anode of your auxiliary SCR. From the aux SCR cathode, add your small inductor (50 micro Henry), then a fast diode, and finally connect that back to the point between your main SCR cathode and the load inductor.

So the commutation path looks like: DC+ junction > Cap(+) > Cap(-) > Aux_SCR > Small_Inductor > Diode > junction before load inductor. This creates a loop that, when the aux SCR fires, puts the capacitor voltage across the main SCR in reverse polarity.

For your component values, stick with what I mentioned before: 10 micro Farad commutating capacitor, 50 micro Henry inductor, SCR holding current 0.1A, turn-off time around 20 micro seconds. Make sure to set the initial voltage on that commutating capacitor equal to your DC supply voltage in the block parameters.

The control sequence is: first pulse the aux SCR briefly at startup to charge the capacitor, then start your normal switching by triggering the main SCR for power delivery, and when you want to turn off the main SCR you trigger the aux SCR again. The capacitor will discharge creating reverse current through the main SCR and turn it off.

You'll know it's working when you see the main SCR current drop to zero, the capacitor voltage flip polarity, and a pulse of current through the aux SCR each time you commutate. If you're not seeing those waveforms, the connections are still wrong.

The key thing to understand about "parallel commutation" is that the capacitor literally gets switched in parallel across the main SCR when the auxiliary fires. Your current circuit doesn't create that parallel connection - the aux path just goes to ground instead of going back through the main SCR.

Draw out the current paths on paper for each mode. If you can't trace a path where capacitor discharge flows backwards through the main SCR, then the topology needs more work. The components you have are right, it's just a matter of connecting them correctly.

Also keep in mind with these component values your maximum switching frequency will be limited to a few kHz at best due to the LC resonance time and capacitor recharge requirements. That's just the nature of SCR commutation compared to MOSFETs.

A good reference link to help you understand:

https://www.mathworks.com/matlabcentral/fileexchange/33061-thyristor-simulation-in-matlab

sorry if im asking too much, is this correctly now or is it still wrong ?

@Daniel, You did not follow my instructions as mentioned previously and neither you did test the circuit or run simulation.If you need help then please follow my instructions. I took another look at the latest model, and while you've rearranged things, the main issue is still there. Like I mentioned previously, the auxiliary SCR path is still going to ground, not to the main SCR cathode. Because of this, the commutating capacitor can’t discharge through the main SCR, meaning the SCR won’t turn off as expected.

To fix this, you need to make sure the capacitor discharges through the main SCR when the auxiliary SCR is triggered, creating the reverse voltage that forces the SCR to turn off. Right now, the current path doesn’t allow for that, and the SCR stays latched on.

Also, double-check that the capacitor is pre-charged before you run the simulation. If it’s not, the capacitor won’t have the necessary voltage to reverse current through the SCR.

Here’s a quick summary again of what needs to be done:

  • Connect the positive terminal of the capacitor to the DC+ node (where the main SCR’s anode connects).
  • Connect the negative terminal of the capacitor to the anode of the auxiliary SCR.
  • When the auxiliary SCR fires, it should send the capacitor’s discharge through the inductor and diode, then back into the main SCR cathode node.

Once you’ve made these changes, test the circuit. You should see the main SCR turn off when the auxiliary SCR is triggered. The capacitor voltage should flip polarity, which means the commutation is working. If you're not seeing those waveforms, it means the path is still wrong.

Here are a few resources to help with your testing and understanding:

Test it out this time, and let me know what you observe! Please don’t forget to send updated screenshots of simulink model and scope plots.

i had no idea what im doing atp, idk if the circuit still wrong or i made a mistake in the parameter calculation, so i was trying to do the simulation with :
Vin = 15 V, and Vo = 5 V and with resistor value 10Ω. And i try doing the calculation and got D = 5/15 which is 0,333 and i put that value in the pulse generator component spesificly on the Pulse width as 0.333*100.
And next im inputting the period value which is 1/fs = 1/500 because i think 500 hz frequency is the common frequency for SCR.
Next the value for inductor load is 16.7mH by following the equation L = Vo(1-D)/fsΔI
And then Capacitor value is 500 µF by following the equation C = ΔI/8fs.Δvo, with ΔI = 0,4 A and ΔVo = 0,2 V
And for the commutation component im following your parameters which is : 10 micro Farad commutating capacitor, 50 micro Henry inductor. and i got the vout = 0.8352 V which is very far from the output that i expected. And I think i made a mistake with the commutation circuit again, can you help me with the circuit ? i couldnt figure out how to do the commutation circuit correctly

Hi @Daniel,

Good for making an effort. Again, looking at your Simulink model, your auxiliary SCR path goes to ground, which prevents the commutating capacitor from discharging through the main SCR. Without reverse current through the main SCR, it can't turn off, causing your output to be 0.8352V instead of 5V. Again, the circuit topology is fundamentally wrong - not your calculations. Let me point out what are you doing wrong, you are connecting the auxiliary SCR cathode directly to ground. This creates a discharge path that bypasses the main SCR entirely. The capacitor needs to discharge THROUGH the main SCR (in reverse) to force it off, but your current wiring prevents this. Here are step by step corrective actions:

Step 1: Delete Wrong Connections * Remove the wire from auxiliary SCR cathode to ground * Disconnect the commutating capacitor from its current position

Step 2: Rewire Commutating Capacitor * Connect capacitor positive (+) terminal to the DC+ bus (same node where main SCR anode connects) * Connect capacitor negative (-) terminal to the anode of auxiliary SCR

Step 3: Rewire Auxiliary SCR * Anode: Should now be connected to capacitor negative (-) * Cathode: Connect through the 50µH small inductor, then to the junction between the freewheeling diode and the main inductor (this is essentially the main SCR cathode node) * Gate: Keep connected to your auxiliary pulse generator

Step 4: Set Initial Conditions * Double-click the commutating capacitor block * Set Initial voltage = 15V (must pre-charge it) * Verify polarity: positive side at DC+

Step 5: Verify SCR Parameters Main SCR and Auxiliary SCR should have: * Ron = 0.001 ohm * Lon = 0 (critical for discrete simulation) * Forward voltage (Vf) = 1V * Latching/Holding current = 0.1A

Step 6: Check Pulse Timing * Main SCR pulse: Width = 0.333ms (33.3% duty), Period = 2ms, starts at t=0 * Auxiliary SCR pulse: Brief pulse (10-20µs), triggers at end of main SCR ON time (around 0.33ms into each cycle)

Afterwards, perform visual check before running by tracing the current path when auxiliary SCR fires:

1. Start at DC+ (capacitor +) 2. Through main SCR anode to cathode (this is the reverse current path!) 3. Through main load inductor 4. Through freewheeling diode (in its forward direction) 5. Through 50µH small inductor 6. Through auxiliary SCR anode to cathode 7. Back to capacitor (-)

If you CANNOT trace this complete loop, your wiring is still wrong! What to Monitor During Simulation

Add voltage/current measurement blocks to observe:

  • Output voltage: Should be ~5V (not 0.8352V)
  • Commutating capacitor voltage: Should flip from +15V to approximately -15V each cycle
  • Main SCR current: Should drop to zero when auxiliary fires
  • Auxiliary SCR current: Should show brief pulses
  • Inductor voltage: Should stabilize to reasonable values

Success Indicators: Output voltage reaches ~5V DC,Capacitor voltage flips polarity each cycle, Main SCR current goes to zero when aux SCR triggers ,Main SCR turns back on with next gate pulse, No error messages about singular matrix or algebraic loops

Failure Indicators: Output voltage stays below 2V,Capacitor voltage doesn't flip, Main SCR current never drops to zero, Simulation runs very slowly or produces errors

I would like to point out that key concept that you keep missing is that Class D (Auxiliary) Commutation works by switching a pre-charged capacitor in a path that forces REVERSE current through the main SCR. Think of it this way:

1. Normal operation: Main SCR conducts forward current to load 2. Commutation starts: Auxiliary SCR fires 3. Capacitor discharge: Pre-charged cap creates a parallel path 4. Reverse current: Cap discharge flows BACKWARDS through main SCR 5. Turn-off: Reverse current drops main SCR below holding current 6. Recovery: Main SCR turns off, capacitor recharges with opposite polarity

Your circuit can't do steps 3-4 because the auxiliary path goes to ground instead of through the main SCR.

If you get it working: 1. Take screenshots of your updated Simulink diagram 2. Capture scope plots showing: output voltage, capacitor voltage, main SCR current 3. Post them in the forum thread 4. Report your measured output voltage 5. If still not working, describe what waveforms you're seeing

Your component values are correct for the buck converter: * D = 0.333 * L = 16.7milliHenry * C = 500microFarad * Commutating cap = 10microFarad * Commutating inductor = 50microHenry * Frequency = 500Hz

Again, as mentioned before the problem is 100% the circuit topology, not the math.

Good luck! Report back with your updated diagrams and scope plots.

Thanks for helping me so far but unfortunately after i tried to do the simulation again I got the same number for the output voltage value, I think the comutation circuit is still not correct.
Im using the same parameters which is Vin = 15 V, and Vo = 5 V, D = 0,333, 1/500 Period, fs = 500 Hz, L = 16.7 mH, C = 500 μF, Commutating cap = 10μF, Commutating inductor = 50 μF. And after i tried to run the simulation the output value still near 0 V and below is how the signal looks like
Can you mark where i should connect the commutating capacitor, aux diode, and small inductor on my circuit picture below so i can get the commutation circuit right this time?

Hi @Daniel,

I have given you simple instructions to help sort out your struggling with Matlab schematic. I could help you further if I had access to Simulink but due to limited resources this is the best I can help you with. I have gone extra mile to help you with your project, my suggestion at this point would be visiting those links to gain better understanding, enroll in some on line courses to help understand this concept better. I look at your scope plot, like I mentioned if the commutation loop is miswired, the Main SCR never properly turns off, meaning:

1. The inductor does not receive chopped current.

2. The LC output does not resonate.

3. The average output voltage collapses to ~0.

And that proves my point, your simulation behavior exactly matches a mis-wired commutation path as mentioned in my comments earlier.

So, I make a little changes in the circuit and still not got the exact number for the output voltage which is 5 V, instead i get 6,87 V which is near 7 V. Do you think now the problem is the circuit or the parameter this time ? because im using the same parameter i used before. can you verify my circuit again is it still wrong ?

Hi @Daniel,

Okay so good news - you're getting 6.87V instead of basically nothing, which means your circuit is actually working now. The problem is just your pulse generator duty cycle is set wrong.

Look, for a buck converter it's simple: Vo = D × Vin. You want 5V out from 15V in, so you need D = 5/15 = 0.333, which is 33.3%. But you're getting 6.87V which means your duty cycle is actually running at like 45-46%. That's why your output is too high.

Open up your Pulse Generator block and check what you have for "Pulse Width (% of period)". I'm betting it's set to something around 45 or maybe you accidentally put in the wrong units. It should be:

  • Period: 0.002 (that's your 500Hz)
  • Pulse Width: 33.3 (as a percentage)

Try that first and see what happens.

Now here's the thing though - even after you fix that, you probably still won't get exactly 5V because thyristors aren't ideal. Your SCR has a forward voltage drop, probably like 1-1.5V when it's conducting. If you double-click on your SCR Main block you'll see a parameter called "Forward voltage Vf" - check what that's set to.

So if your thyristor drops 1.5V, then the effective voltage is really only 13.5V, not 15V. Which means you'd need D = 5/13.5 = 0.37 instead of 0.333. That's why you might need to bump your duty cycle up to like 35-37% after the initial fix to compensate for the losses.

Also make sure your load resistor isn't too high. For CCM operation with your 16.7mH inductor at 500Hz, you need at least 0.2A of load current, which means your resistor should be under 25 ohms. If it's higher than that you'll drop into DCM and then the whole Vo = D×Vin thing doesn't work anymore and you'll be chasing your tail.

One more thing about the thyristor setup - you have an auxiliary SCR for commutation right? That needs its own pulse generator and the timing matters. The aux SCR should fire right before you want the main SCR to turn off. So if your main SCR is on for 666µs (33.3% of 2ms), your aux SCR needs to fire around 600-650µs to give it time to commutate properly. If that timing is off, the main SCR won't turn off cleanly and your duty cycle will be all over the place. Can you tell us what your current pulse generator settings are? And what's your load resistor value? That would help narrow down exactly what needs adjusting.

The basic process is: fix the duty cycle first (should get you close), then tweak it up a bit to compensate for the thyristor drops, then make sure your load and timing are right. You should be able to hit 5V pretty easily once those are dialed in.

Also quick tip - make sure you're using a fixed-step solver, not variable-step. Power electronics with fast switching can get weird results with variable-step. I would use 1e-6 (1 microsecond) for the step size. Check that in your model configuration parameters.

Let me know what happens when you try the 33.3% duty cycle and I can help troubleshoot from there.

Hi thanks for replying, Below is the parameter I used for the simulation, can you verify it and tell me where did i do wrong ?
Below is the pulse generator parameters i used for the SCR main and SCR aux, for the SCR aux im adding 0,001 secs Phase delay and for the main SCR i put 0 sec phase delay . And for the resistor i put 1 Ohm instead of 10 ohm now, because after i tried to put 10 ohm the output voltage went up to 8 V. And also for the earlier simulation I set 0,333*100 for the pulse width and the result is 6,87 V .
I tried to change my SCRs forward voltage to 4,3 V and changed the duty cycle to 0,46*100, i got 4,981 V for the output voltage. Is this fine ? or do you have other solutions ?
And btw for both diodes should i tweak the forward voltage too ? because i haven't done that yet

Hi @Daniel,

Please share the screenshot of scope plots along with simulink block diagram. This will help me to diagnose.

Sorry, here is the the screenshots after I run the simulation with 0,46*100 duty cycle and 4,3 V forward voltage for both SCRs

Hi @Daniel,

Actually, looking at your scope plot more carefully - your circuit is working perfectly as-is. You don't need to change anything.

Your scope shows exactly what a properly functioning buck converter should look like. The output voltage ramps up smoothly from 0V to 5V and stabilizes with nice regular ripple. That triangular ripple pattern is textbook CCM operation. The pulse train at the bottom shows clean 33.3% duty cycle, and you're getting 4.972V output from 15V input, which is basically spot-on for D = Vo/Vin = 5/15 = 0.333.

Here's what actually solved your problem: changing the load from 10ohmto 1ohm. With 10 ohmyou were getting weird voltages (6.87V, then 8V) because the load was too light and the circuit was probably dropping into discontinuous conduction mode or having commutation issues. The 1ohmload forces enough current through the circuit (about 5A) to keep it operating in continuous conduction mode, which is why everything stabilized at the correct voltage.

About your questions:

The 4.3V forward voltage thing - honestly, forget about that. You were trying to compensate for something that didn't need compensating. Your current setup with default forward voltages is giving you 4.972V, which is 0.6% error from your 5V target. That's well within acceptable tolerance. There's no reason to start tweaking forward voltages to unrealistic values like 4.3V.

The aux SCR timing at 1ms - yeah, this initially seemed off to me since that's 50% of your period, not 33.3%. But looking at your results, the circuit is clearly working correctly. In force-commutated choppers, the aux SCR timing doesn't have to exactly match the duty cycle - it just needs to be timed correctly to turn off the main SCR. With your current 1ms delay, the commutation is happening properly and you're getting the right output. If it ain't broke, don't fix it.

About the diode forward voltages - you could tweak them to match your actual components if you want to be super accurate, but honestly with a 1ohm load and the circuit already hitting 4.972V, it's not going to make much difference. The default values (usually around 0.8V) are fine for simulation purposes.

The only potential concern is that 1ohm is a really heavy load - you're dissipating 25W in that resistor at 5V. For a real application you'd normally want something higher, like 10-50ohm depending on your use case. But the reason 10ohm didn't work before was probably because your circuit wiring or commutation wasn't set up right initially. Now that everything is connected correctly, you might be able to increase the load resistance and it should still work. But if 1ohm is what your application needs, then you're good to go.

Bottom line: your scope shows a properly functioning buck converter hitting your target voltage with correct CCM operation. The combination of 33.3% duty cycle, 1ohm load, and your current commutation timing is working. You've solved it. The 4.972V result is essentially 5V - that's mission accomplished.

If you really want to optimize further, you could try gradually increasing the load resistance from 1ohm up to see how high you can go while maintaining stable 5V output. But what you have now is working correctly.

So i was trying to tweak the parameters and increasing the load resistance from 1 ohm to 7,5 ohm. But in order to get the output voltage to be near 5 V I have to tweak the forward voltages for both diodes and SCRs otherwise the output voltage would be far from 5 V (I got 6,8 V if I didn't tweak the forward voltages), So i ended up increasing the forward voltages for both diodes which is from 0,8 V to 4,8 V and both SCRs from 0,8 V to 2,5 V. Do you think this is still acceptable result ?

Hi @Daniel,

I need to point out that you're going down the wrong path here. Setting diode forward voltages to 4.8V and SCR forward voltages to 2.5V is not an acceptable solution - these values are physically unrealistic. Real power diodes have Vf around 0.7-1.0V, and SCRs around 1.0-2.0V. You're essentially lying to the simulation to force it to give you the answer you want.

Looking at your earlier simulation with the 7.5 ohm load (before all these tweaks), your circuit was actually producing reasonable results around 5V. The problem now is that you're treating forward voltage as a tuning parameter when it's actually a fixed physical property of your components.

Here's what's really happening: when you increased the load from 1ohm to 7.5 ohm, your current dropped from about 5A to around 0.67A. With less current flowing, there are smaller voltage drops across your components. This means your output voltage went higher than expected - that's why you're seeing 6.8V instead of 5V with the default component values.

The correct solution is NOT to artificially inflate forward voltages. Instead, you need to adjust your duty cycle. The duty cycle is your control parameter - that's what determines output voltage in a buck converter. For a buck converter: Vout = D × Vin - voltage drops

With your 15V input and aiming for 5V output with realistic voltage drops of about 1-1.5V, you need a duty cycle around 40-43%, not 33.3%.

Here's what I recommend you do

First, go back to realistic component values. Set your diode forward voltages back to 0.8V and SCR forward voltages to 0.8-1.0V. Keep your 7.5 ohm load - that's much more realistic than the 1ohm you were using earlier (which was dissipating 25W!).

Then, adjust your pulse generator to try duty cycles in the 40-45% range. Start with 40% and work your way up until you hit your 5V target. This is the proper way to control output voltage.

If something changed between your earlier working simulation and now, you might also want to verify that your inductor and capacitor values haven't been modified, and that your switching frequency is still at 500Hz.

The key point I was making is that your circuit topology and commutation timing are correct - the circuit is functioning properly as a buck converter. But that doesn't mean every parameter combination will give you exactly 5V. You need to tune the duty cycle to match your load conditions.

Think of it this way: in a real buck converter application, you'd have a feedback control loop that automatically adjusts the duty cycle to maintain 5V output regardless of load changes. What you're doing by manually tweaking forward voltages is the equivalent of changing the speedometer reading instead of actually pressing the gas pedal.

Your simulation with the inflated forward voltages might show 4.875V mean output, but it's meaningless because it's based on components that don't exist in reality. When you go to build this circuit with real components, it won't behave the way your simulation predicts.

So bottom line: realistic component parameters + proper duty cycle adjustment = correct buck converter design. That's the path forward.

Hope this helps clarifies everything!

This question is locked.

Tags

Asked:

on 18 Nov 2025

Locked:

on 1 Feb 2026

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!