Build log/tutorial on how we built our Medium sized DRSSTC including assumptions and a step-by-step guide.

Josh and I are planning to build 2 Medium-sized Dual Resonant Solid State Tesla Coils with a polyphonic music input. This guide/walkthrough hopefully can guide other people hoping to build a similar thing, and what decisions & why they were made (which I found a little lacking when following other guides!).

Step 1, How big do I want it?

For us, we wanted something not too small as we'd like to demo it around at things such as emfcamp, but not too big seeing as this is our first DRSSTC build. I had built small (<tabletop size) SSTC and also managed to hook in an interrupter circuit in order to play simple single note tunes so this seemed like a good progression.

Looking through other builds that people had done, we thought that something around Kaizer's DDRSTC I and Loneocean's DDRSTC 2 would be a good size to aim for.

From looking at all these designs and what is easily availble, decide on a secondary size (this can be approximate) of both diameter and length. We decided on a secondary diameter of 100mm and length around 500mm.

Step 2, Deciding on Other Parts


Wire Size

Using Kaizer's DRSSTC Design Guide section on choosing secondary coils, we decided to use a wire diameter of 0.25mm.

Number of turns

From the wire size, and secondary diameter, we can calculate the number of turns using many handy calculators (we used, linked off of JavaTC). Our secondary ended up at ~1850 turns.


Primary size for most medium coils from our research seemed to be pretty constant with 10mm copper tubing at around 9-10 turns (initial, this will be tuned to match the secondary later).

Flat rather than helical was chosen as the general consensus [1] seemed to be that helical coils on a DRSSTC were a bad idea and should generally be avoided.

Spacing between turns was assumed to be fine at 5mm (literally come to by looking at pictures of other people's coils).


Chosen from again, looking at other coils and ensuring it wasn't so big as to look silly on top of the size of secondary we were looking at.

We planned to use 100mm ducting around a form in the middle giving a major diameter of around 600mm.

Primary Tank Capacitor (MMC)

This one is more tricky to assess what you want. This will partially determine the resonant frequency of the primary circuit and can be tweaked in the next step to ensure your primary circuit does not have ridiculous values (such as a 1-turn primary).

Comparing different capacitors that were available, their specs, and how much they cost, we decided that our MMC should add up to 0.2μF at 4000V. The actual amount of capacitors and their type was determined later. We had originally played around with this value in order to get a good multiple of capacitors available. Be aware though, that changing this value will mean re-calculation of most steps forward from this (although in the next step is probably the best time to change this value if needed).

Initial Calculation

Using JavaTC (as everyone does) plug all the values in. We approximated the heights of the secondary and primary to be starting at 350mm above the ground (giving a good amount of clearance underneath for circuitry) and the topload slightly above the top of the secondary at 900mm.

For auto-tuning between the secondary and primary (assuming you have put in the primary capacitor size), click the Auto-Tune button. This will vary the number of turns on your primary and therefore it's major diameter.
At this point, it's a good idea to adjust your primary capacitance until you get a matching primary resonance (with a decent number of primary turns, we were using ~6-10 as a good starting point).

For our tesla coil, we managed to achieve a resonant frequency of 115.13kHz. This is a little high compared to other designs of this size, but not overly high as to make switching hard. We tried to aim to keep this below 120kHz due to making IGBT selection harder in the next steps. If you're unsure, keep with the value you have (and/or compare with other coils of the same sort of size as what you're building) and continue through this guide/build log. As we're only doing calculations you can always come back and change it later!

(Coming back to this later, we found that the secondary impedance at resonant should be for a good spark-length output [2] around 50kΩ. It turned out ours was very close to this already!)

Important output values:

    Resonant Frequency = 115.13kHz
    Wire Length = 628m
    X at resonance = 53.989kΩ
    Topload Capcitance = 22.138pF
    Secondary Q = 185
    Resonant Frequency = 115.13kHz
    Length of wire = 4.3359m
    Ldc = 9.609μH
    Lmutual = 119.187μH
    Coupling Coeff = 0.142
    (recommended Coeff = 0.129)

IGBT Selection

All of these calculations can also be found in my (somewhat messy) spreadsheet here.

Finding max on time before overvolting the MMC

The tank capacitors will experience a ringing current that increases in size as the system resonates until a spark breaks out. As $I = C\frac{dV}{dT}$, the voltage transient will also increase as the system resonates. For somewhat worst-case calculations, this ringing is taken to double in size every half cycle of the resonance. Therefore, the theoretical number of half-cycles before the MMC overvolts:
$$ N_{\frac{1}{2}} = \frac{V_C^{MAX}Derating}{V_{DC}} = \frac{4000 * 0.9}{270\sqrt{2}} = 10.58 $$
A derating of 0.9 is used to ensure we do not get to the maximum of the capacitors during normal operation.
Therefore the theoretical maximum amount of time (assuming no losses, perfect resonance and that the current doubles each time) we can let the system oscillate for is determined by:
$$ t_{burst}^{MAX} = N_{\frac{1}{2}} \frac{1}{2f} = 10.58\frac{1}{2*115.13\times10^{3}} = 45.98\mu S $$

IGBT Ratings

From this, we can also calculate the expected primary current

$$ I^{MAX} = \frac{V_C^{MAX}Derating}{2\pi fL_{DC}} = \frac{4000 * 0.9}{2\pi * 115.13\times10^{3} * 9.609\times10^{-6}} = 517.91A $$

This can be above the typical ratings of IGBT we select as we utilise soft-switching. Soft switching is where we utilise the very low on resistance of an IGBT, and only switch during low currents (zero crossings). By switching during the zero-crossing we avoid lots of current flowing through the device during switch-on or switch-off which is where most of the loss in IGBTs come from. Therefore, we need to calculate the current flowing at switch-off and switch-on for each type of the IGBTs we are looking at.

Starting with a list of known-good IGBTs:, we can plug in the numbers from the datasheets of IGBTs that we think will work well into the following equations (numbers used are the final chosen IGBTs). Also bear in mind at this point the cost of the IGBTs!

To calculate the power dissipated during the on period, we need time find the period of time that the device is on

$$ dutycycle = \frac{t_{burst}^{MAX} BPS^{MAX}}{1/BPS^{MAX} - t_{burst}^{MAX} * derating} = \frac{45.98\times10^{-6} * 500}{1/500 - 45.98\times10^{-6} * 4} = 10.128\% $$
Again, a derating is used to create a worst-case scenario for the IGBT as we are stressing them much higher than they would be normally under datasheet conditions, the $BPZ^{MAX}$ is the around the maximum breaks-per-second that we would want the coil to achieve (if your driver circuitry has appropriate current-limiting for the primary drive, you can run this higher at the cost of just hitting current-limits).

and then we can find the power dissipated due to the conduction resistance

$$ P_{on} = (sq>sin) * dutycycle * I^{MAX} * V_{CE,sat} = \frac{1}{\pi} * 10.128\% * 517.91 * 6 = 100.18W $$
$sq>sin$ is used to convert the square pulses that were assumed in the duty cycle calculations (flat on/off) to a more normal sine-wave. The $V_{CE,sat}$ requires looking up for $V_{CE}$ saturation voltage at the collector-emitter current of $I^{MAX}$. This may be a little off the graph in the datasheet so extrapolation and some guestimation may be necessary (predict high if unsure).

We can now compare this power limit during the on-cycle with the dissipation limit of the IGBT (given adequate cooling)
$$ P_{IGBT}^{limit} = \frac{\Delta T}{R_{th(j-c)Q}} = \frac{30}{0.26} = 115.385W$$
$\Delta T$ is the maximum expected thermal difference between junction temperature and case temperature, this number is arbitrarily chosen, higher means you are able to cool the case much more quickly. The thermal resistance between junction and case can be found in the datasheet specified in $C/W$ or $K/W$.

As we have a good ballpark thermal power limit, we can calculate the maximum frequency that we could switch the tesla coil at if we had a higher resonant frequency.

Current rise for the primary circuit
$$ \frac{dI}{dT} = I^{MAX} 2\pi f = 517.91 * 2\pi * 115.13\times10^{3} = 3.746...\times10^{8} = 374.65A/\mu S $$

Current flowing at switch-off
$$ I_{off} = \frac{t_{off}+t_{fall}}{\frac{dI}{dT} * 4} = \frac{130\times10^{-9} + 80\times10^{-9}}{374.65\times10^{-6} * 4} = 19.67A $$

As the datasheets assume hard-switching into a purely resistive load, our inductive load will have faster current-fall times (more details in so a factor of 4 is introduced to reflect this.

Likewise current flowing at switch-on can be found
$$ I_{on} = \frac{t_{on}+t_{rise}}{\frac{dI}{dT} * 4} = \frac{18\times10^{-9} + 25\times10^{-9}}{374.65\times10^{-6} * 4} = 4.03A $$

Total switching loss for a cycle:

$$ E_{loss,cycle} = \frac{(E_{off>on} + E_{on>off} ) softSwitchDerating V_{ge}^{nom}}{V_{ge}^{max}}$$

$$= \frac{(0.4\times10^{-3} + 0.5\times10^{-3}) * 20\% * 15}{24} = 0.1125 mJ/pulse$$

$softSwitchDerating$ is for again accounting for soft-switching. Our losses should be <20% (some other websites use 10% for this derating). $V_{ge}$ nominal and maximum are again taken from the datasheet graphs using our current flowing at switch-off/switch-on ($I_{on}$/$I_{off}$).

From all this, we get to a maximum thermal frequency limit, assuming all deratings and BPS of:

$$ F_{max2} = \frac{P_{IGBT}^{limit} - P_{on}}{E_{loss,cycle}} = \frac{115.385-100.182}{0.1125\times10^{-3}} = 135.13kHz $$

Wew, that was a lot of calculations, but we're not done yet!

DC Bus Capacitor

RMS Current

An increased duty-cycle is used for capacitor calculations. I'm not quite sure why, but I was copying from Kaizer's calculations and this is what I did:

$$ dutycycle_{cap} = \frac{t_{burst} * derating * onTimeMultiplier}{\frac{1}{BPS^{max}} - t_{burst} * derating * onTimeMultiplier} $$
$$ = \frac{45.98\times10^{-3} * 4 * 2}{\frac{1}{500} - 45.98\times10^{-3} * 4 * 2} = 22.54\%$$

The $derating$ is the same as the previous duty cycle calculation, but we have an extra capacitor on-time-multiplier as we want to ensure we have enough energy/ripple current for resonance and for long-life of the capacitors.

$$ I_{ripple} = \frac{dutycycle_{cap} (1-dutycycle_{cap}) V_{bus}}{fL_{dc}} = \frac{22.54\% * 77.46\% * 340}{115.13\times10^{3} * 9.61\times10^{-6}}$$
$$= 53.66A $$

$$ I_{rms} = \frac{I_{ripple}}{2\sqrt{2}} = 18.97A$$

The factor of $2$ before the $\sqrt{2}$ is because we plan to have 2 DC bus capacitors in parallel.

Capacitance Required

We can now also calculate the approximate size we need for the DC bus capacitor from the amount of energy we need to give to the MMC.

$$ E_{MMC} = \frac{V_{bus} I^{max} t_{burst} multiplier}{\pi} = \frac{340 * 517.91 * 45.98\times10^{-6} * 4}{\pi} = 10.31J $$

Multiplier of 4 is used for some reason to over-size capacitors?

From $E=\frac{CV^2}{2}$:

$$~C_{DC} = \frac{E_{MMC} * energyMultiplier * 2}{V_{bus}^2} = \frac{10.31 * 20 * 2}{340^2} = 3.57mF$$

An energy multiplier of 20 is used to estimate the amount of extra storage that will be needed between the DC bus and the MMC energies (as the MMC will be using up this energy much faster than the 50Hz that we can put it in at).

This gives us a good minimum figure of the combined DC capacitance we need for our bus capacitors.

Now we can scour eBay for some tank capacitors that add up to around that capacitance, with enough RMS current available and a good voltage standoff above the DC bus voltage.

Tank Capacitor Selection

So we need 0.2μF at 4000V. We searched around for a good day or so to find the best value capacitors we could get, and it appears the CDE capacitors from Farnell (onecall specifically - the student version) are the best value.
We had the following 3 to choose from (between stock/price/values) that we then used to calculate the cheapest cost:

python2.7 What voltage do you want? (V): 4000
What capacitance do you need (nF): 200

942C20P15K: You need 5.33333333333 (2.0 series, 2.66666666667 parallel) costing GBP 31.7333333333
940C20P1K: You need 8.0 (2.0 series, 4.0 parallel) costing GBP 22.24
940C20P22K-F: You need 3.63636363636 (2.0 series, 1.81818181818 parallel) costing GBP 13.4909090909

Despite the 940C20P22K-F's being the cheapest, only 2 in series would not give us the required current. The current they can deliver is listed in their spec sheet up to a certain frequency at which point you can interpolate or guess if they can meet what we expect!

We decided instead to go with the 940C20P1Ks.

Building the secondaries


Start by setting up some sort of jig to hold your tube straight. We used two 110mm drainage plugs to connect to each end and ran a screw through as a bearing on one end, and the motor gearshaft on the other.
It is almost required to use a motor to wind a tesla coil of around this size unless there is something seriously wrong with you. Winding even with motor assistance will take around 30-40 minutes per coil.

During the wind, it is probably easiest to keep the incoming wire under tension with a 5-10 degree pull towards the previously wound section to allow the wire to self-align and create a uniform wind. A small piece of plastic (such as teflon or PTFE) may be useful to ensure that the incoming wire is pushed into place as the secondary rotates around (also very useful if you need to re-position your other hand doing the wire-feed as it may otherwise drift out of alignment).


Many old coils were protected by paiting on layers of varnish. We instead decided to epoxy the coils as this is a single-step process (rather than applying a layer, waiting for it to set and then re-applying for up to 10 or more times). Also, as epoxy is generally more harder and robust than epoxy, the finished coils should be better protected against physical damage and racing arcs.

We used this clear coat epoxy that has a supposed work-life of 20-40 minutes. Unfortunately, when we mixed it, it appeared as if it was not going to set for greater than an hour (mixing did not produce any thicker consistancy over time). This was a mistake, asuming you have mixed the two parts together in the correct ratio, it will probably work and will stay (mostly) runny as long as you leave it in a small-surface area pot. Once you spread it out however, the setting process really begins to start. This can be monitored by the use of an infrared thermometer as the process is exothermic. Whilst in the pot, the mixture will start warming up after around 20-40 minutes (ours took around an hour and twenty for some odd reason) after which it will reach 35-40 degrees. You need to have started pouring the secondary by this point otherwise the mixture will become too viscous to pour evenly across the coil.

Start by spreading out quite a thick layer across the top of the coil with it rotating towards you with some sort of flat, glossy surface below to spread out the epoxy as it comes around the coil. By doing this whilst it is still quite liquidy, the epoxy after you have evened it out as best you can, will self-level at a slow rotation speed.


As the driver circuit is driven by fibre optic, we need some way of transmitting a signal down this fibre. We ended up using an ESP8266-12 on a custom PCB with functions for single frequency, polyphonic music playback via MIDI and audio input using a zero-crossing detector. The Note and single frequency generation were initially prototyped on an arduino utilising a high-speed interupt to decide when to turn on and off the fibre output. As the coil can not be on for extended periods of time, this pulse is set to be a maximum of around 5-10 microseconds??
As each pulse is very short, multiple frequencies can be played back at the same time by ORing multiple pulse trains for the different frequencies together. collisions are rare and therefore should not impact the audio output.

The reason behind moving to an ESP rather than sticking with an arduino, was to get a higher clock frequency, therefore allowing a faster interupt rate (effectively our sample rate), and also to allow more code to run within each interrupt before hitting the next interrupt (causing either an error or the timing to be messed up). As the ESP can run at 150MHz, this is also used as a proxy for the audio input to generate the small pulses derived from the analog zero-crossing detector on the PCB.

Notes (for myself)

  • Pullup on fibre receiver
  • the PCB has the pinout of the transmitter wrong
  • don't use a darlington pair opto-isolator as a mosfet - it doesn't work
  • label the program/run headers better
  • the power reversal protection doesn't work due to parasitic diodes in mosfets

Interrupter mk2

So, the first interrupter had issues where the ESP would crash and produce awful >8kHz output. Can't be having that!

Instead, I opted to use an FPGA - that can hardly crash with dedicated logic. It was designed around the EP2C5T144 dev board that I've mentioned in another post. It's really cheap and has plenty of logic elements for what we need to do with it.

Things that I found whilst building it:

  • Note off is sometimes sent as a note on with velocity 0. This may have been the problem on some stuck notes that we kept getting on the first interrupter
  • With a simple UART implementation of midi, the design is capable of loosing track of which byte of 3 it is through a midi message. I should probably add a reset on a timeout to fix this - although shouldn't be too much of an issue.