Ten years ago I figured out how to design brushless linear motors. I made custom control boards for them, but ran in to some issues. Eventually the whole project got shelved. I want to revive it and open source my designs using Odrive as a controller.
One trick with these motors was that they used six wire control. So electrically they are three separate coils, not tied together on one end like normal brushless motors. I’m going to muddle my way through a firmware mod for this. It looks like I can basically eliminate one axis, modify the Motor class to accept two timers, then replace the FOC algorithm with my own and I’m like 95% there? And then if I want to measure current in all three coils, I think not all three legs measure current yes?
Any tips would be appreciated. See my old brushless motor designs and the simulation in FEMM below. Thank you!
Do they have to be six-wire control? I’m sure I’ve used linear motors in the past that are 3-wire. Can’t you just connect one side of each coil to a ‘star point’ and call it 3-wire?
What are you using as an encoder?
Yes they need to be six wire. I found significant force ripple when I simulated the motor with one end tied together in either delta or wye configuration which would reduce the max force of the motor. I suppose I could still use it that way, but I would rather not. I am specifically looking for any tips on doing six wire control. I have done Odrive firmware mods before, but the firmware has changed a lot since then so I thought it wise to ask about potential pitfalls.
I am using a pair of analog magnetic flux sensors mounted so one reads the axial flux and one reads the radial flux coming off of the magnet tube. I first calibrate the motor position based on a precision linear potentiometer and save the calibration in to a look up table for use during operation. So I will need to read two analog inputs as part of my control algorithm, but I think I know how to do that.
From what I have seen, the most common linear motors are 3-phase (wye or delta terminated). However for this to work well (as opposed to arbitrary current independently in every 3rd coil) is that the pole pitch (PM magnet pitch) vs the coil pitch has to be in a specific range. I expect that while this places some limitations on the design space, working within these limitations will not prevent you from making a good motor. You can play with this winding calculator to see what pitch combinations make good motors.
Should you still want to drive independent currents in each coil, I would recommend this topology, which lets you drive two coils for every 3-phase bridge. Disregard that they are not drawn as FETs, it was the image I could find. ODrive v3 has shunts on phase B and C, so I would make phase A common.
Thank you! Yes as I already have motors built from back then that work nicely with six wire control, I will try that topology.
I’ve just added a bunch of stuff to my git repo on this. I added a bunch of PDF research papers, some images, and a bit of C++ code showing the commutation algorithm.
My design is based on this primarily on this paper: