11 December 2021

PROJECT: Half-Life 2 AR2, Update #14 - Receiver Main Board


I have completed designing the RECEIVER_MAIN-BOARD, a board that controls all AR2 reciever function. Below is a reminder of where the board lives, how it looks (banana for scale included), as well as what the 3 receiver boards replace on the AR2 prototype:


  • 40mm x 20mm x 1.6mm
  • 4 layers (signal, 0V, PWR, & signal)
  • All function (including external daughter boards) controlled by a single I²C line
  • Houses a bunch of goodies like:
    • Two DCDC converters
      • Switching to convert 13.2V to 4.3V (MAXM15462)
      • Linear to convert 4.3V to 3.3V (ADP7102)
    • Low RDSON MOSFET (BSC040N10NS5) based solenoid driver, with the MOSFET being driven by UCC27533 to further reduce power losses
    • ADS7138 to read the analog/digital inputs and/or set digital outputs

Next up I will go over the good & bad design elements... Spoiler alert, most of it is OK, some of it is meh D:

The Good

1. GOOD, Input filters on all connectors

All nets coming in/out of board (as in nets transitioning the EM zone boundary, as Keith Armstrong would put it) go through a filter. For example:

  • All logic nets pass through IP4252CZ8-4-TTL,13, a neat ESD filter that uses the diode junctions to form a low-pass RC filter

Deploying these sorts of filters is a good way of protecting your device from ESD as well as improving your chances of passing EMC (think slowing down those fast edges)... BUT the topology I used has room for improvement as I will discuss in the bad parts section

2. GOOD, Reduced loom conductors

RECEIVER_MAIN-BOARD houses 5 key signals which control all reciever function. Meaning if I was to control the reciever directly then my cable loom would need to have 5 IO conductors, not including the return path for each...

I already have bugger all room in the AR2 so this would be a pain. Instead I feed the key nets into the ADS7138, an I²C IO expander with ADC functionality. Doing so reduces the loom "IO" conductor count to 2, which is basically the I²C data & clock line (again not including the return for each) 


  • ADS7138 function could be implemented using a MCU, but that would mean I would have one additional thing to program and test... So to reduce complexity it's way easier to use an off the shelf IC that contains everything I want

3. GOOD, Efficient 13.2V to 3.3V conversion

Majority of reciever boards are powered by 3.3V, with the only exception being the solenoid which is powered "directly" from the LiFePO₄ battery (as in 13.2V). Also here is the power budget for all reciever boards:

The question then becomes how to covert 13.2V to 3.3V? Here are 3 common ways of solving this:

  1. Use a linear (or LDO) regulator
    • PRO: Super quiet 3.3V rail
    • CON: Efficiency will be 25%, so will have to dissipate 0.38W
  2. Use a switching (or SMPS) regulator
    • PRO: Efficiency will be 85%, translating to a power loss of 0.02W (as in bugger all)
    • CON: 3.3V rail is not quiet, expect 10-50mV ripple depending on load
  3. Use both ;^)
    • PRO: Overall efficiency will be ~77% (0.07W loss), and ripple will be non-existent
    • CON: Additional complexity, cost, and board real-estate

I would have probably been OK with option 2, but I wanted to try something new so went with option 3:

But why use 4.3V as the intermediate rail? Well there were two factors I tried balancing:

  1. To have a high LDO efficiency (at a given current) your input voltage should be as close as possible to the output voltage (think lower "voltage drop")
  2. To have a high PSRR (at a given current) your input voltage should be as far as possible from the output voltage (think having a greater buffer to reject all that ripple)

From the gif below you can see that PSRR for 4.8V & 4.3V is identical, while for 3.8V it get's a tiny bit worse. Hence why I went with 4.3V


4. GOOD, Reference plane stitching CAP's

Because I am using a cheap 4L stack-up I am limited to two different potential reference planes:

  • 0V, used as top copper reference
  • 3.3V, used as bottom copper reference

A few of my tracks jump from top to bottom and in the process change their reference plane. To help make their return path continuous (think reducing radiated emissions due to odd return paths) I have stitched the two reference planes where the layer change occurs with 1N 5% 25V C0G capacitors:

One thing to note is that had I used a thinner 4L stack-up (as in one where 0V & 3.3V planes are ~0.2mm from one another), then I would not have needed the stitching capacitors 

5. GOOD, Adequate cooling for MOSFET

Having such a tiny board does not leave much space for cooling the MOSFET (BSC040N10NS5), which according to the datasheet has a thermal resistance of 50K/W for a 6cm² area. The most I can give it is ~3cm², and that's split up over top & bottom copper:

So I am expecting the thermal resistance to be ~100K/W, which seems to be enough as at full load (10A continuous) the MOSFET is expected to operate at ~35°C above ambient. Actual rise will likely be slightly lower as I am pulsing the MOSFET at ~7Hz 


  • The top & bottom "heatsink planes" are stitched together with x12 0.4mm diameter vias
  • I could add more but I would be getting to the point of diminishing returns

The Bad

1. BAD, Input filters on all connectors could be better

To improve radiated immunity (especially for a multi-board design) I need to pass all nets coming in/out of board through a common mode choke as soon as they transit into EMZ1. This would stop any transient voltages (say from a near ESD event) creating transient currents in the conductors, and confusing what each board considers 0V to be:

Next up, the 10A pi-filter I am using is not ideal as both source and load impedances are LOW, where as a pi-filter is better when both are HIGH:

2. BAD, Tack & pad clearance to reference plane edge

Current board envelope is the largest I have space for in the reciever, and even with that I am forced to cram component pads and tracks right up to the reference plane edge. If I had more space I should space the tracks & pads to be at least 3mm away from reference plane edge, otherwise I can expect to have worse EMC performance...

3. BAD, Board is not designed for manufacture ;^)

This one is not a huge issue as I will be assembling the board myself. But if I was to revise the board to make it more suitable for manufacture, I would:

  • Add fiducials, so that pick and place machine has an accurate reference point
  • Move SMD components to be at least 2-3mm away from board edge, so that pick and place machine can actually clamp the board. Otherwise give the board a meaty panel


And for those curious here are the schematics so far:

23 September 2021

REPAIR: Embedded DisplayPort (eDP) LCD Driver

As luck would have it another item was added to my repair que. This time it was my somewhat "sentimental" secondary monitor, which is basically a recycled ThinkPad X260 display

I really loved this thing as it let me have a 1.5 monitor setup, which was super useful for running Altium. So I knew I had to get it repaired ASAP

Identifying the root cause did not take too long. It turned out that the ACDC adapter failed and managed to feed way more than 12V into the eDP driver board, which eventually fried the 12V to 5V switching regulator. Interestingly all this happened over 3 days, as on the first day I noticed a strange smell in the house but could not pin point it's location, on the second day I noticed the screen flickering, and on the third the screen flashed moments before a bunch of magic smoke was released from the eDP driver D:

The 5V regulator and it's footprint was way beyond salvaging, like the FR4 underneath was charred enough to bulge up. So I cleaned up the pads the best I could, measured the typical current draw on the 5V rail, and finally replaced the section altogether with an adequately rated 5V regulator I had lying around. Also I decided to leave the bulk capacitors and feed in the 5V via original inductor to lower the ripple voltage and current

Other Info

The following might be useful to someone:

  • FC3D6T was the faulty 5V, this is a SOT23-6 package
  • 5V rail drew
    • ~350mA when monitor was ON
    • ~23mA when monitor was OFF
  • 12V rail drew
    • ~210mA when monitor was ON
    • ~12mA when monitor was OFF
  • eDP driver is RTD2556_eDP_WS_R10.1 which also goes by
    • B116XAN02
    • M125NWR3
    • LP133WH1-SPB1
    • LP140WH2-TP
    • N156BGE-EA1
    • M06VH00WX2P33Y00001
    • S20180122-1

13 September 2021

REPAIR: Neato D5 LIDAR Motor

A month or so ago our beloved Neato D5 was starting to have sensor issues, as it would either stop vacuuming midway or only after a couple of minutes. So I reached out to Australia Robotic who said that the LIDAR motor was the likely culprit, and were trusting enough to send a replacement for me to fit :D

Disassembling the unit was quite simple, with the only tricky part being the front bumper (which you have to bend quite a bit to remove/place back on)

With everything apart I was able to have a good look at the LIDAR, which turned out to be a pretty neato ;^) assembly. But before I tell you why, here is a good picture which explains how a 2D LIDAR functions

OK so the laser bounces off an object and the reflected light is picked up by the image sensor, simple enough right? Well, above only tells you what's in front. What if we want to know what's happening all around us? To do this you would need to continuously rotate the LIDAR assembly... BUT wires can't rotate indefinitely, so how do we get power in and data out ?_?

The Neato D5 LIDAR solves this by going wireless:

  • Power is bought in via wireless power transfer, likely inductive coupling
  • Data is taken out via an IR emitter/reciever combo

05 September 2021

PROJECT: Japanese Wood Joinery & Kitchen Shelves

Before COVID steamrolled the whole planet, the wife was planning to take a Japanese wood joinery class at a local university. After that plan fell through she found out that the class teacher/sensei offered similar content in an online format, DIY Japanese Joinery Online Video Courses

So we decided to sign up to the class to see if we could incorporate these new techniques to our woodworking projects. I will admit that I was quite hesitant at first as I tend to be quite lazy/efficient with my work; as in, if two pieces of wood can just be fixed together with glue/screws then I don't see the point of using fancy joints. BUT after spending a good month getting familiar with the new tools (as well as the countless weekends slowly sharpening each one) we finally applied what we learned and made a kitchen shelf; and I have to admit that seeing something so modular come together was 100% good vibes for me. So should be fun to figure out other ways we could use these joints ;^)

Anyway, before cutting all the wood I modeled the assembly in SOLIDWORKS, as my monkey brain has trouble with "complex" assemblies. So here is how that looked (ignore the poorly fitted dovetail joints, here I was too lazy to make separate parts):

And here is how the result came out :D

29 August 2021

PROJECT: Half-Life 2 AR2, Update #13 - Solenoid Driver

Continuing with the RECEIVER_MAIN-BOARD design, this post will concentrate on the solenoid driver section. The solenoid in question is one I wound myself, whos approximate specs are:

  • 0.95 mH inductance
  • 1.42 Ω series resistance
  • 21 AWG wire (0.7mm dia)
  • 40m wire length

Why is this section so crucial? Well this circuit deals with driving a highly inductive load, which creates big voltage kicks/transients during the ON/OFF transitions. Dave from EEVblog made a good summary of this behavior here

Chosen Solenoid Driver Configuration

Before I bore you with more simulations, here is how the chosen configuration compares to driving the solenoid without any dampening/snubbing. Please note that the MOSFET I have chosen (Infineon BSC040N10NS5ATMA1) has a Vds rating of 100 V, which if exceeded will eventually destroy the semiconductor junction (as you see in the simulation with the 110 V peak...)

One other thing to note is that I have chosen to use a dedicated gate driver (TI UCC27533, see section of datasheet on how to spec driver), as I am am working with a limited PCB area (as in have bugger all space to make a gate driver using discrete components)

A Closer Look at the Voltage Spike

There are many ways to dampen the back EMF (aka voltage spike), the most simple of which is just placing a diode across the inductor. This diode goes by many names, and the one I was taught at uni was freewheeling diode. It's recommended to use a Schottky diode, due to their lower forward voltage (think less dissipated power) and snappy response to reverse bias

Lastly my gate drive waveform is a 7 Hz square wave with a 50 % duty cycle (as in the inductor is energized for ~70 ms). Which is practically what the solenoid will be driven at, as seen in an older blog post 

Zooming in on the voltage spike we see that it "saturates" at ~110 V. This is because the junction of the MOSFET (which is rated to 100 Vds) is breaking down and clipping the peak. Using an ideal MOSFET in LTspice shows that the spike peaks at ~2 kV and lasts for ~1 ns

And with the freewheeling Schottky diode fitted, we get a manageable ~15 V peak

But What if I Want a Faster OFF Time?

Here is a good thread on this desire ;^)

If you have eagle eyes you might see that there is a bit of a delay before MOSFET Vds (and hence inductor current) stabilizes, and in some scenarios you would want this state to be reached as fast as possible so you can switch the inductor at crazy high speeds. Well if you want to do this one way is to add a dampening resistor in series with the freewheeling diode, but you have to size this resistor carefully otherwise the voltage drop across it is going to bring the spike back (as you can see below)

An even better way would be to use a Schottky & Zener diode combination, which I did not simulate as I was quite happy with the Schottky freewheeling diode arrangement (as I am only switching at 7 Hz...)

21 August 2021

PROJECT: Half-Life 2 AR2, Update #12 - Power Filter 10A

So today I am going to expand on my previous pi-filter topology to make it compatible with the solenoid driver. The same driver that is going to be dealing with ~7 Hz 10 A transients ;^)

Chosen Pi-Filter Configuration

As before, here is the step and frequency response of the chosen pi-filter configuration. Since I am dealing with a higher transient current, I am trying to minimize things like:

  • Settling time
  • Over/under-shoot
  • Frequency of ringing (think radiated EMI)

If you are confused about some of the above terms then have a look at the next section

Summary of Ferrite Beads

With the previous lot of simulations I was quite happy with the electrolytic & ceramic capacitor arrangement (which turned out to be ideal for this case as well), so this time I dived deeper into the impacts of ferrite bead impedance

The step response was configured to peak at 10 A, which is the peak current of the solenoid I wound. As I began simulating stuff I noticed that such a large current spike lead to noticeable over/under-shoot & ringing, hence I evaluated each ferrite with this in mind

Rather than flood yous with pictures of different ferrite bead simulations, this time I decided to summarize the data in a nice table:

Note how the NO FILTER response:

  1. Has a rather "late" -3 dB roll-off frequency, ~3,500 kHz vs ~160 kHz for others
  2. Manages to amplify any transients in the ~30 kHz to ~3.2 MHz range
  3. Has a step response that oscillates at ~2.2 MHz (think radiated EMI)

At the same time, now how using a higher impedance ferrite bead (48-115 Ω @ 100 MHz) leads to:

  1. Amplification of any transients in the ~15 kHz to ~150 kHz range
  2. An increase in settling time
  3. An increase in over/under-shoot

In my opinion the 10 Ω @ 100 MHz ferrite bead (Wurth 74279221100) gives the best performance of the lot. With the most noticeable/worthy feature being no amplifiaction of transients from 1 Hz all the way to 100 GHz :D

Closer Look at 115 R Ferrite Bead

For the sake of completeness, here is how the largest impedance ferrite bead (Liard 28F0181-1SR-10, 115 Ω @ 100 MHz) looks