Sunday, May 10, 2026

TinyCross: Ice Racing + Next Updates

Earlier this year, I got to do some TinyCross ice racing on a frozen lake:

Thanks to Dane for organizing the event; there were over a dozen crazy ice vehicles. TinyCross wasn't the fastest, but the combination of four-wheel-drive, independent suspension, and traction control really helped it get off the line quickly and pull itself through ruts left in the slushy surface layer by other vehicles. Overall, even though I didn't consider ice as a potential surface when designing this kart, it is surprisingly well-suited for it.

I participated last year, too, but after a couple runs, one of the rear motors was defeated by the slush. Either its position sensor failed (due to exposure to the elements, no doubt!) and caused it to lose sync, or another motor's sensor failed and the remaining one had to take up all the torque. Either way, the winding insulation melted quickly - the APS 6374-170KV motors can handle 100A peak, but not continuous. This was the main motivation for the rear motor swap, and I'm happy to report that the new Hyundai electric power steering motors held up to the challenge nicely.

Hyundai 56300F2200 Motors

I've been able to collect some more data on the Hyundai 56300F2200 electric power steering motors that I swapped onto the rear wheels. They are, in fact, very close to the same torque/speed constant as the APS 6374-170KV:

This is excellent, since I can keep the same gear ratio (70:15) and expect the same torque per amp and speed per volt, just with a much lower phase resistance. The line-to-neutral resistance on the Hyundai 56300F2200 is around 11mΩ, vs. about 27mΩ for the APS6374-170KV. The lower power dissipation, combined with the extra thermal mass and more direct cooling path of the inrunner configuraiton, means these motors can handle a lot higher peak and sustained current. The penalty, of course, is the extra weight.

I was initially worried about the inductance of the new motors, since they're designed for a 12V automotive system and I'm driving them at 48V. The synchronous inductance definitely is higher, at 120μH, vs. 50μH for the APS6374-170KV:

But, because they are only 6 poles instead of 14 poles, the lower electrical frequency almost exactly cancels the higher inductance in terms of how much D-axis voltage is required for a given mechanical RPM. It does still limit the maximum power, since the D-axis component of the voltage causes the total voltage to reach saturation much earlier than the back EMF alone would. Here's an example power curve with a maximum drive current of 100A (phase current) and drive voltage of 24V (line-to-neutral):

Using more current can generate more torque/force at low speeds, but causes the D-axis voltage to grow faster with frequency, so the peak power moves to lower speed:

Ultimately, the total impedance of the motor is what matters, and at high speed and high current, the reactive component becomes dominant. More voltage (for example with third harmonic injection) would help push to higher peak power. I also think the kart's always been geared a little hot for a 170rpm/V motor, so a slightly higher gear ratio could balance out the torque vs. speed a little better, if I can find the right pulleys.

GaN Motor Drives

One other casualty of the rear motor swap has been any progress on my GaN FET motor drives. They were designed around the APS 6374-170KV motors, with a peak current of around 100A. The Hyundai 56300F2200 motors can handle more than that, so I'm not sure if the 2x EPC2302 per phase leg has enough margin anymore. Luckily, it's taken me so long to complete the project that the EPC2361 is also available now. EPC has a dev kit with two EPC2361 in parallel per leg specified for up to 184A peak AC current, so I feel somewhat confident in shooting for 150A in my design.

The new motors might also conflict with of the other main goals of the GaN drive project, which was to explore High-Frequency Injection (HFI) methods for sensorless start-up. The Hyundai motors seem to be surface permanent magnet inrunners with distributed windings, so they have barely any saliency. With an LCR meter, I only see a swing from about 116μH to 131μH, compared to 36μH to 63μH for the APS 6374-170KV. Pulling any rotor position information out of such a small difference in inductance might be hard. But I'll still give it a try.

In the last GaNDr post, I proposed some layout modifications to improve the overshoot and ringing of the switch nodes on the GaN FET half-bridges. This ringing comes mostly from parasitic inductance in the PCB traces, so reducing the loop size as much as possible is key. Using small, fast MLCCs right near the FETs is important, even if you still need large bulk capacitance further out on the DC bus. To recap, there were two possible locations for adding some extra fast 0402 MLCCs:

I routed the Rev 2 board with one side (ABC) using only the "outer" option and one side (UVW) using both options. (The "inner" caps were not guaranteed to be an improvement, in my view, since they might make the outer loop routing less ideal, so I wanted to test a version without the routing for those caps.) Here are the results from the ABC side:

ABC Side, Baseline (No 0402s Populated)
ABC Side, Outer 0402s Populated

Adding the outer 0402s only reduced the overshoot from 80% to 74%, not as much as I would have expected. The ringing frequency does increase, which shows that the parasitic inductance has been reduced slightly. (The natural frequency of the parasitic circuit scales as (LC)-0.5, and C is mostly determined by the FETs.) But the effect wasn't as significant as I would have liked.

The UVW side, with both 0402 placements, is much more interesting:

UVW Side, Baseline ((No 0402s Populated)

The baseline, without any of the 0402s placed, is already better than both ABC cases, at 63% overshoot. So I guess somehow the new routing is actually better? I don't really understand why, since it breaks up the L2 ground return path, which should be disadvantageous if not actually using the inner 0402s. But, the scope doesn't lie. Adding in the 0402s helps even further:

UVW Side, Only Outer 0402s Populated
UVW Side, Only Inner 0402s Populated
UVW Side, Outer and Inner 0402s Populated

The inner 0402s make a much more substantial difference than the outer ones. With only the outer 0402s, the overshoot is only reduced to 59%, a proportionally similar reduction from baseline compared to the ABC side. With only the inner 0402s, though, the overshoot comes all the way down to 27%. With both options populated, the combined effects only drop it a bit more, to 23%. So it's clear the inner 0402s are doing most of the work to reduce the parasitic inductance.

The ringing is no longer a single frequency, which suggests that the two current loops (one to the inner 0402s and one to the outer 0402s and/or the big 1210 DC bus caps) have different natural frequencies and are interfering with each other. But one of the frequencies (presumably the one associated with the lower-inductance inner 0402 path) seems to be considerably higher.

This is a pretty surprising result, since I haven't really seen any GaN layouts like this. It is mentioned in the EPC layout guidelines as an option, though, so it's not totally crazy. Based on these results, I will likely commit to the inner 0402s with the new layout and remove the outer 0402s entirely. The space was more useful for a DC rail busbar to help carry high current down the board to each of the phases, something that might be necessary now with the Hyundai motors.

Batteries

Next on my list of components to upgrade on TinyCross are the batteries. The Tattu Plus 10Ah packs have worked well, but I think I can do a little better with cylindrical 21700 lithium-ion cells these days. Here's the concept:

The cells are Molicel INR-21700-P50B, in a 6S3P configuration. This puts the total pack at 15Ah, a nice 50% gain in roughly the same volume as the current packs. These are considered power cells, with a 60A (12C) maximum discharge rating and a DCR of around 15mΩ. The Tattu Plus still has a slight edge on power, thanks to its 25C discharge rating, but these will work just fine for TinyCross. With two packs in series, I'll have 7.8kW available. And with the full load of four packs (2S2P at the pack level), I'll have 15.6kW. That's more than enough power, and the extra capacity is more useful.

Matching the form-factor of the existing packs is convenient, since I can use the same mounting slots on the kart. The cells arrange conveniently in that shape. To hold them together, I have two laser-cut Delrin spacers separated by 2.5in standoffs. Sandwiching this are two PCBs: a bottom one just used to collect up some cell monitoring voltages, and a top one with the BMS. Both PCBs have slots for nickel tabs, which carry most of the current down the series strings. In order for both leads to come out on the same side of the pack, current returns from the end of the strings on two inner layers of 2oz copper:

The BMS consists of a TI BQ76925 analog front end paired with an STM32F0 microcontroller, all crammed into one side of the top PCB. It can monitor individual cell voltages, pack current, and temperature (via a thermistor in the middle of the pack). It also can do resistive cell balancing, although I've included the standard 7-pin JST XH header for external balancing anyway. I still plan to use a dual-channel RC-style charger to charge the packs, so I'm not including any cutoff FETs. However, the STM32F0 can talk to other packs via isolated UART and to the rest of the kart via CAN.

The two end caps are 3D-printed (Nylon, SLS) and the sides, top, and bottom will probably get thin polycarbonate sheets, if I don't get lazy and put the whole thing in some big heat shrink instead. Thinking ahead to next year's ice racing, I've also left a spot for a power resistor and fan, to hopefully push some warm air through the gaps between the cells.

The cells, spacers, and PCBs together weigh a bit less than the Tattu Plus 10Ah packs, but I expect once I add the nickel tabs, wires, and all the end caps and side panels, they'll be slightly heavier, maybe around 1.5kg each. But, at 15Ah, the energy density will be much higher. I'm going through the BMS bring up slowly; there's no rush to get these done since I still have the Tattu packs. Also, the kart is currently inoperable for other reasons...

Mechanical Upgrades?

During a non-icy test run with the new motors, this happened:

I really was not expecting the wheel to be the first mechanical part to break. But it was foreshadowed in this post, where I exposed the rim's casting voids while machining a new bearing pocket. I guess you get what you pay for with $20 cast aluminum rims. Here's where it might have failed first:

Interestingly, the new version of this rim has a different spoke geometry. I'll stop short of calling it better, though, without running some FEA and checking for voids. If it doesn't seem significantly improved, I might consider some other options for reinforcing them.

I'll probably just replace the two rear wheels, since they're the ones with the most weight and therefore the most side load on them. But I bought four new rims, just in case. I considered designing some billet-machined rims instead, but I think they'd cost a fortune and I'm not sure I'd be able to stop myself from trying to design in-wheel motors at that point.

One other minor mechanical upgrade I've been wanting to make for a long time is to replace the steering u-joint. The current part is McMaster-Carr 6443K46, which has a tiny amount of play that I really dislike the feel of at the steering wheel. Maedler 63122200 is a much nicer part, and half the price! It will require a bit of redesign a re-machining of the steering column adapter, but I think it's worth it for a tighter steering feel.

I always plan to do all these upgrades during the summer and it never seems to happen. I wind up doing everything in the last few weeks leading up to ice racing. But maybe this year will be different!

Friday, February 27, 2026

TinyCross: Rear Motor Update

In its original design, TinyCross used four identical Alien Power System 6374 170rpm/V brushless motors. But with the weight distribution being heavily biased to the rear, it really makes more sense to use larger motors there. I had seen some examples of electric power steering motors that might be suitable, so I did some eBay exploration to see what was available. I settled on a Hyundai part (56300F2200) that looked common enough that I could always find spares:

Hyundai EPS Motor (left), Trampa 6376 (middle), APS 6374 (right)

I was surprised to find that the torque constant (and thus rpm/V) of the Hyundai EPS motor was actually very similar to the APS 6374 170KV, meaning it could just drop into the design with the same gear ratio. The main difference is that the EPS motor is a 6-pole inrunner instead of a 14-pole outrunner. This makes it easier to get heat off of the stator winding. The resistance is also much lower, and the wire gauge going in suggests it can probably handle even more than the 100A peak I've been running in the rear. But the extra performance overhead comes at a price...it's big!

Although this motor is relatively small in the context of automotive electric power steering, it's still a lot larger than the APS 6374. It weighs almost 2kg with the wire harness still attached, compared to 0.68kg for the APS. It also has a diameter of 88mm and a bolt circle of 109mm, so it would be a tight fit into a drive quadrant designed for a 63mm outrunner with a face mount. The hardest part, though, would be adapting the coupler to TinyCross's drive pulley without increasing the width of the existing design. The original shaft adapter for the APS 6374 used a clamp and key to secure the drive pulley to the 10mm motor shaft:

But the Hyundai EPS motor has a large plastic coupling-half pressed onto a short spline shaft, intended to interface to a mating part with a flexible rubber coupler. So, unlike the old design, the drive shaft can't use the motor's bearing as one of its supports. I would need to add both another bearing and the mating coupling-half to the pulley shaft, without changing the belt location. 

I played with this in CAD for a while and determined that it would probably require moving the motor mounting plane inboard to make more room for the new drive shaft. That was more work than I wanted to do at the time, so I put the project aside for a few months. But luckily when I came back to it, I drew up this evil thing instead:

This is part of a long tradition of unholy drive shaft couplings going all the way back to Cap Kart for which I couldn't really tell you what material path is actually transmitting the torque. Is it the friction from the 6mm bolt clamping three pieces together? Or is it the shear pins? Or do the pins just keep the 6mm bolt from unthreading? Is some of the torque going through the bolt itself?? I could probably dig through an old textbook or simulate it to figure it out, but I like the mystery. Most importantly, it allows for an additional R8 bearing to fit between the pulley and the coupler, just barely, without shifting the motor mounting plane or the belt position:

There is 1mm of clearance between the pulley flange and the new bearing, and 0.33mm of clearance between the bearing and the coupler. It's an absurd packaging and I love it. It's also reasonably easy to machine. The coupler looks like it has some complex angles, but it's really just 4.5mm-width straight cuts along 45º radials:

That makes it possible to do on a manual mill, at least with some amount of janky 45º fixturing:

And with that, the normal rubber couplings fit right in:

I did have to drill them out to clear the head of the 6mm bolt, but since the torque is transmitted between the teeth (this much I know, at least!), that's no problem. Everything fit together as expected, which is to say with almost no clearance, to make a nice adapter module that occupies in the same space as the old drive shaft support:

That still leaves the motor mounting, though, and there was no way to easily adapt the existing plate to fit the new motor. It had to be re-cut entirely:

Some of the existing standoff holes also encroach on the motor's inner flange circle, so unfortunately this adaptation doesn't work with the bone-stock Hyundai EPS motor. I had to mill down the flange where it would interfere. Think of it as weight reduction. Speaking of which, the automotive wire harness can also go away:

Don't need any of that...

And after a changing a few tight-fit clearance holes to loose-fit to soak up some measurement errors on the motor's mounting pattern, everything fits together well enough:

Even though it's substantially larger than the APS 6374, it doesn't look overly bulky or out-of-place in the design. I actually really like the look of the motor's cast aluminum housing to go with the rest of the aluminum chassis. The total weight for the kart without batteries is just a bit over 40kg now. I don't think I can offset the extra weight of these motor completely, but I may at least try to get it back under 40kg at some point.

The Hyundai EPS motors do include some kind of position encoder, maybe a resolver? But I decided to just use the existing outboard sense magnet and rotary angle sensor. Despite the rubber coupling, I think that will be sufficiently accurate with only three pole pairs. (The electrical angle error is only 3x the mechanical angle error instead of 7x.) So I reprogrammed those sensors for six poles and...oh, that's right, one of the rear quadrants suffered a bit of a meltdown last year:

I'm not sure the exact sequence of events, but I think the sensor board got wet and stopped working, then the desynchronized motor windings got too hot and failed short, then one of the low-side FETs died, taking out its gate driver with it. Meanwhile, the other three motors were pulling me along well enough that I didn't notice the problem until it became an odor. Interestingly, it seems to be the FET gate that died; the D-S path was not shorted. I'm not going to think about it too hard right now. I just replaced the FET and gate driver and everything was happy again.

We've had some massive snowstorms this year that cumulatively add up to more than the height of the kart, but the latest one came with a bonus round of an extra inch after the plows had already done the parking lots. This is the perfect amount for some quick snow karting (another tradition):

The sensor board conformal coating is holding up, somehow.

At 80-100A, the Hyundai EPS motors feel pretty much identical to the APS 6374 170KV. They can easily generate and control oversteer on the snow. And after half a battery pack of messing around, they were staying nice and cool. So I think they do have some overhead now, if I want to push even more current in dry conditions. The main problem will be the suspension:

The A-arm flex is not good, even at 100A. At first glance, it seems like most of the displacement is originating from the two quarter-inch aluminum plates that hold the rear ball joints. They're only flexing a little, but that angular offset creates a lot of displacement at the plane of the wheel. Luckily, it's easy to reinforce these - just add even more 80/20:

I'm sure there's an even lighter way to do this, but it actually looks like it belongs. It also gives some new mounting points for accessories, cameras, etc. I will add one to the front as well. Only the top is needed there; the steering linkage bearing plate handles the bottom. Of course, these are even more weight that I now need to offset to get it back under 40kg.

But for now, I think this upgrade is complete. I still need to test the motors at speed when (if) the snow ever melts. They do have higher inductance than the APS 6374 170KV, which might limit their maximum power. They're also designed for 12V, not 48V, so they might lose efficiency at higher speeds due to speed-squared losses. I'll have to do some data logging to find out.

The next upgrade is also in the works...here's a teaser:

Thursday, February 20, 2025

GaNDr: Power Loop Measurement and Optimization

In a half-bridge configuration, the power loop is the path from the DC bus capacitor positive terminal to the output switch node and back to the capacitor negative terminal. This is the path of high dI/dt, passing through both FETs in the half-bridge. It's important to keep this loop as small as possible, to reduce the amount of parasitic inductance interacting with the high dI/dt.

This applies to any half-bridge, but it's especially important for GaNFETs, where the switching event can be on the order of nanoseconds. They're capable of switching this fast due to their very low gate charge and input capacitance, but they still have a significant output capacitance, COSS, that needs to be hard-switched. During a switching event, this forms an underdamped LC oscillator with the power loop inductance and leads to overshoot and ringing.

It's a little hard to predict the loop inductance, although admittedly I didn't even really try. There are ways to ballpark it based on the board geometry, or use a 2D field solver like FEMM to get an estimate. A 3D field solver could probably get pretty close. But nothing beats a direct measurement on the real PCB. So I just assembled one phase of the GaNDr Rev1 PCB for a test:

Nevermind the black wire hack...

Since I'm interested in stuff on the nanosecond time scale, I wanted to use my 5GHz-bandwidth sampling scope for this measurement. But the inputs only go up to ±1V, so directly probing a 50V node with unknown overshoot would be bad. Luckily, the cheapest way to make a high-bandwidth probe is just to make a voltage divider with a physically small resistor and a 50Ω coaxial cable.

Quick and dirty ≈67:1 high-bandwidth probe.

It also matters where the probe is attached. I soldered both the resistor and the probe ground (just the coax shield) to pads near the low-side FET. This excludes all the inductance except what's physically inside the FET. The measured voltage is, as close as possible, VDS of the low-side FET. And here is the measured switching transient:

It is...not great. The overshoot with a 32V input and 1Ω gate resistors is nearly 100%. That does not bode well for 50V operation with 100V parts, and can't be good for efficiency or EMI. It's possible to slow down the rise time by increasing the gate resistance, thus reducing the amount of energy in the transient. But that should be done last, after exhausting all other reasonable methods for reducing the power loop inductance.

Since I now have the ringing frequency, it's possible to calculate the power loop inductance using the COSS datasheet value of 1nF (per FET):

L = 1 C OSS ( 2 π f ) 2 = 1 2.0 nF ( 2 π 160 MHz ) 2 = 0.50 nH

This really isn't much inductance, but it's apparently enough to store sufficient energy during the transient to make a high-Q oscillator with COSS.

Some of the loop inductance is from the DC bus capacitors themselves. I probably should have checked this earlier, since this is usually well-characterized by the manufacturer. The Samsung CL32E475KCIVPNE capacitors used here have the following AC characteristic curves:

At frequencies above about 2MHz, they're really more inductors than they are capacitors: the impedance vs. frequency has a slope of +1 on a log-log plot. The effective inductance at 160MHz is around 0.30nH. But, there are six in parallel. Ideally, this would divide down to 0.050nH, but they may not share the load equally based on their placement. I think they contribute a significant amount of inductance, but not the majority.

Still, it would be nice to reduce the capacitor parasitic inductance if possible. Since the switching transient only involves COSS, which is only on the order of 1nF, maybe smaller and faster capacitors would be better? For example, the 10nF Samsung CL05B103KC5VPNC in 0402 stays mostly capacitive all the way up to 100MHz:

However, being physically smaller also increases the impedance overall, such that the effective inductance at 160MHz is still around 0.30nH. The advantage is that I could fit many more in parallel, to divide down the total inductance more. In reality, the big 1210 capacitors are still very much necessary for filtering the 125kHz PWM frequency, so the solution is probably to try to fit some of the 10nF 0402s on in parallel with the existing six 1210s.

An easy place to put them is where the VDC bus bar solder areas used to be, between the 1210 caps and the high-side FETs:

For each high-side FET, three can be arranged so that their positive terminals are directly adjacent to the drain pads. The negative terminal can be sent to the power ground plane on the first inner layer with a via-in-pad. This also has the advantage of shortening the power loop considerably, at least for the high-frequency switching transient. The only real disadvantage is losing the option for a VDC bus bar, which realistically shouldn't be necessary for the average power levels here.

A riskier move would be to drop in four more 10nF 0402s between the FETs:

The drain pads of the high-side FET (VDC) align with the source pads of the low-side FET (GND), so it's very tempting to bridge the gap with an 0402 capacitor. I even tried this on the physical board, by scratching off some solder mask:

Even with the ugly attachment, this did show a significant improvement, with the overshoot dropping from 94% to 65% and the frequency increasing from 160MHz to 210MHz:

This does seem like it would provide the shortest possible power loop, but an important difference between the soldered-on test and the actual layout is that there is still a mostly solid switch node (output) plane beneath the capacitors as-tested. It's like having a seventh PCB layer. In actuality, that plane gets cut if the capacitors are placed there, changing the power loop from a thin vertical sandwich to multiple horizontal loops, which might very well have higher inductance.

This configuration, with capacitors between the FETs, is actually discussed in the EPC layout guidelines. In order to get back to a thin vertical sandwich power loop, the switch node plane, rather than GND, should be on the first inner layer. But if I fully swap SW and GND layers, the loop sandwich to the outer capacitors becomes thicker, potentially cutting off those capacitors with much higher outer loop inductance.

I decided to try just inserting a small SW plane on the first inner layer, and only between the FETs. The rest of the first and second inner layers remains as GND to hopefully preserve some of the outer capacitor loop performance. And since I'm indecisive, I only did this on one half of the board for the next revision. That'll let me A/B test it against the more normal layout. I expect both to have much more interesting transients with composites of multiple frequencies, so it might be trickier to analyze. We'll see when the Rev 2 boards arrive.

Saturday, January 25, 2025

GaNDr: Motor Drive in the GaNFET Era

It's been a while since I've attempted a new motor drive design, the last one being TinyCross's dual-motor 50V/100A drive about six years ago. I still really like that design, and those drives have worked well for TinyCross so far. But one of my favorite pastimes is looking for new components that might change how I would build something. And in the last six years, there's been an interesting development that I'm curious to explore: the GaNFET is now mainstream. 

While they've been commercially available for a while, they're now both technically and economically viable as an alternative to silicon MOSFETs in certain power ranges, and have been adopted in many new consumer electronic devices. They are also becoming available in more conventional packages, though GaNFET purists would probably still use the bare-die versions for lowest parasitic inductance. Supporting components (mainly gate drivers), documentation, and device models are also now mature and widely available.

Of interest for this project are the EPC2302 and the brand new EPC2361 in 3x5 QFN. These are packaged GaNFETs, vs. the bare-die BGA and LGA options that have been around for a while. Ideally, encapsulating them in a thin plastic package improves robustness without sacrificing too much performance. The package also still exposes the die on the top side for direct cooling.

GaNFETs excel in the Figure-of-Merit (FoM) of on-resistance multiplied by gate charge, RDS(on)·QG, which captures both the conducting and switching losses. Here they are on a 2D plot with some silicon MOSFETs for comparison, with curves of constant FoM shown (lower is better):

The current TinyCross FETs, FDMT80080DC, can't really compete anymore. (I still love them for their pulsed current rating of 1453A, though.) The modern field of 60-80V silicon MOSFETs has significantly better FoM and also tends to publish specifications for lower gate drive voltages besides the standard 10V. The NVMFS5C604NL operated at VGS = 4.5V is especially remarkable. But the EPC GaNFETs still easily win on FoM, and they are 100V parts with half the surface area.

The extremely low QG means GaNFETs can be switched much faster than silicon MOSFETs. An EPC2302 half-bridge with a suitable layout and gate driver should have no problem operating at 100kHz PWM, or even higher. This reduces the need for large electrolytic capacitors on the DC bus, since the ripple current will be much lower. This is probably the largest contribution to space savings, even though the FETs themselves are also physically smaller.

Although I'm not space-constrained on TinyCross, shrinking a power stage is always a fun project. I arbitrarily set a limit of the size of a deck of cards, with the same specification as the previous design (dual motor, 50V and 100A peak). Here's what the resulting layout looks like:

It's considerably smaller than the current TinyCross drive, even with the logic and power consolidated onto one board. There are half as many electrolytic capacitors, with more ceramic capacitors filling in at high frequencies. Optional 2mm bus bars help take some of the load off the PCB copper. The board can be mounted to a heat sink base with six isolated M2 screws located in the middle of each FET group for even mounting pressure. And the wires all exit horizontally, probably through grommets in the seam between the aluminum base and a 3D-printed cover.

This is also a six-layer PCB, which further helps with layout. Six layer boards are now pretty fast and cheap thanks with JLCPCB, so there's not much reason to stick to four layers even for hobby motor drives anymore. The power stage layout follows EPC's recommended structure pretty closely, with the return path on the two inner layers closest to the FETs to minimize the dI/dt loop area:

I did not follow the gate drive recommendations as strictly, since I need a lot of space for the gate drivers themselves. I am using isolated half-bridge drivers, and remarkably there are at least two pin-compatible parts from different manufacturers that could work. The Skyworks Si82E39x looks like the most promising option, with a 4V UVLO option and sub-10ns rise/fall times. It's not even that expensive, at around $4ea. The ADuM4221 from Analog Devices could also work, though. Although I have the driver on the opposite side of the board, I did try to keep the gate drive traces as short as possible:

The gate drive return paths from the switch node (high-side) and negative plane (low-side) are also pretty direct. Will that be good enough? I don't really know - I don't have a 3D field solver. I'll have to wait for the boards. Ideally, with such low gate charge and fast drivers, it should be possible to run PWM frequencies above 100kHz and take the dead time down to around 50ns (less than 1%). Here's what the switching waveforms look like in an LTSpice simulation with the EPC device models:

However, this is just a guess for the loop inductance, so I won't really know how fast it can go until I get it on a scope. But what is the huge current spike on both FETs (shoot-through) during the high-side turn-on? I thought GaNFETs didn't have reverse recovery time? Well, I think it's just the Coss of the low-side FETs getting charged. Even though there's no body diode, there is still parasitic capacitance in the 1-2nF (per FET) range that has to get hard-switched at 50V. At these switching speeds, that requires a lot of current (for a very short period of time). If it turns out to be a problem, the gate drives will have to be artificially slowed down with extra gate resistance.

Another interesting quirk of GaNFETs is present in the LTSpice sim: during the deadtime, the low-side FETs do reverse-conduct, but at a voltage of around 2.25V, significantly higher than the body diode voltage across a silicon MOSFET. This partially eats into the power savings of a GaNFET design, but the more critical problem is what happens with a bootstrapped high-side driver. If the output is down at -2.25V, or even lower, even a crappy bootstrap diode won't drop enough from +5V to prevent the high-side VGS from exceeding 6V, the absolute maximum for these gates.

There are several ways to deal with this. Adding a resistor in series with the bootstrap diode creates low-pass filter with the bootstrap capacitor. A 10Ω resistor with a 0.1µF bootstrap capacitor has a time constant of 1µs, so a 50ns spike of +7V or so won't budge the voltage much. There is still a possibility that at very high duty cycle the average bootstrap charge voltage could exceed 6V, but I think you would run into other issues before that. For good measure, I also included a footprint for an optional 5.1V Zener diode across the bootstrap cap, which is another recommendation I saw.

Lastly, I included a couple footprints for small Schottky diodes in parallel with the low-side FETs. I can only fit something like an SMA or SOD128 package, which max out at 5A for 100V devices. But some have pulse ratings at or above 100A, and these are very short pulses. At those pulse ratings the voltage drop is quite high, but still significantly below 2.25V. The other interesting question is whether the parasitic inductance of the diode and its connection to the bridge will prevent any of the high current from making it to them in the first place. Only the scope will tell.

In order to take advantage of the 100kHz+ low-deadtime PWM, I also want to try out another relatively new part, an MCU from the STM32G4 series. These are the spiritual successor to the F3 series that I've used for so many motor drives. They have lots of analog features, including five (!) ADC converters, DACs, op-amps, and comparators. But the G4 also adds several new peripherals that are specifically well-suited to motor drives:

The high-resolution timer (HRTIM) can drive up to 12 PWM outputs with a resolution as small as 184ps. It's probably overkill, but it allows for close to 16-bit duty cycle resolution at 100kHz, and very accurate deadtime control. For example, part-to-part variation in the gate driver propagation delays could probably be compensated There's also a CORDIC engine for offloading trigonometric functions from the CPU. And there's a Filter Math Accelerator (FMAC) peripheral, which includes a dedicated hardware multiplier/accumulator and memory for accelerating FIR/IIR filter calculations without involving the CPU.

The need for extra computation might make more sense if you've noticed what's missing from this design: there are no inputs for motor position sensing. While I love the simplicity and robustness of TinyCross's optically-isolated virtual Hall sensors, it's nothing interesting in terms of brushless motor control. I did manage to run two instances of a lightweight flux observer in the background on the F3, but I never used it for driving the current control. I'm sure it would have worked at speed, but the main problem with sensorless control for TinyCross is getting starting torque on all four drive motors without them fighting each other.

One way to get the position of the motor before the flux observer converges is with High-Frequency Injection (HFI). The motors on TinyCross have an L/R time constant of around 1.5ms, so at frequencies above 1kHz they are mostly inductors. The inductance on each phase varies depending on the position of the rotor, since the permanent magnet flux changes where each phase's stator steel is on a non-linear B-H curve. That inductance change can be measured with a high-frequency signal on top of the normal drive voltage to derive the position. This is nothing new - it's been basically perfected in VESC - but it should be fun to try to implement with 100kHz+ PWM and the STM32G4's extra processing power.

That's it for now - more to come when there is physical hardware to look at.