The stall-tester consists of a precision-length stick attached to the motor shaft, and a 50 kg load cell on the end of the stick. I added ball joints on each end of the load cell, to ensure that it is in pure tension or compression.
To visualize and log the data, I made a pared-down version of my dyno control gui:
The basic goal of testing was to brute-force determine the motor torque vs D and Q current. Ideally, torque should be easy to calculate from the D and Q axis inductances and permanent magnet flux linkage, by the classic torque equation \(\tau =\frac{3}{2}\cdot p \cdot i_{q}(\lambda_{pm}+(L_{d} - L_{q})i_{d})\). But we're driving the motor hard enough that it saturates fairly substantially. This changes both the inductances and flux linkage, and makes analytically solving for torque (and modeling the motor in general, without FEA) challenging. Using our various motor-models, we've gotten decent results, but a bit of low-end torque has been eluding us.
To take the measurements, we swept current phase angle from pi/2 to pi, and current magnitude from 0 to 180A. At each phase setpoint, current was ramped up from zero to 180 over about 2 seconds. Torque was logged from the load cell, and D and Q axis currents were logged over serial from the motor controller.
The time-series data looked like this:
After a little processing (3-sample median filter to throw out some single-sample glitches from the strain gauge amplifier, and torque-constant sanity check to throw away points between each ramp), the 3-D scatter plot of the points looked like this:
A problem I seem to run into all the time is trying to fit a smooth surface to time-series data. In the past I've usually used MATLAB's griddata to do it like this, but this approach has a number of annoying problems, like that it can't extrapolate, and the surface generally ends up kind of "lumpy". Fortunately, I finally found an excellent script, gridfit, which worked beautifully for this problem.
Finding the phase that produces the most torque for each current magnitude, you get the following trajectory. As you'd expect, at low currents most of the current is on the Q-axis (phase equal to pi/2), and it shifts onto the D axis as current increases.
Superimposed on top of the surface of all the data, the trajectory looks like this. It's pretty coarse looking at low currents, but that part isn't too important anyway.
This is the maximum torque per amp (MTPA) trajectory, which is what the motor should operate along until it reaches base speed and you no longer have enough voltage to operate along the trajectory.
Excitingly, the motor seems like it still has plenty of torque capability left, even at 180 amps. Torque constant is dropping off somewhat, but it looks like breaking 60 N-m should be no problem. On one motor we should be able to hit just over a G of acceleration, and with 2 motors, easily break traction on command.