Max Speed - Sensorless Mode?

Hello,

I am using the ODrive S1 with a KDE775Kv motor on 20VDC in sensorless mode. I have been happy with the controllers so far, but I am getting a much lower maximum speed out of the motors. My maximum speed (under load) is around 3000 RPM, but I am drawing very little current for the motor (less than 1A). I am on firmware version 0.6.10.

I read this post from 2018 for details on max motor speed. The guidelines were:

  1. 75% of motor voltage times bus voltage times Motor KV - that is 0.7520775 = 11,625 RPM
  2. 80% of the encoder’s max speed - for me I am running in sensorless mode, so does that still apply?
  3. Not higher than 35,000 electrical RPM - 3000RPM*7 pole pairs = 21,000, so we are good there

Additionally, the post I mentioned was in 2018 so quite long ago. I’m not sure if the information is still up to date w/ the Odrive S1.

My questions are:

  1. What are the guidelines for maximum speed in sensorless mode on the Odrive S1?
  2. If I add an encoder, will that increase my maximum speed? I may test this in the meantime w/ the built in encoder of the S1.

Thank you

Hi!

S1 has a max modulation depth of 0.78, and a maximum recommended electrical frequency of 667Hz (this can be pushed higher but may result in more current noise). So here that’s 20V0.78775 RPM/V = 12090 RPM theoretical max. And w/ the 667Hz, that’s 667/7 = 95 rev/s == 5700 RPM. So it looks like that may be the limiting factor there. That being said, you can push that much higher, will elaborate on that in a second.

A few thoughts:

  1. 3000 RPM is definitely much lower than the theoretical, so it seems like something else is up. I think the most helpful thing for diagnosis at this point is if you could share your entire ODrive config, by running odrivetool backup-config config.json then posting the resulting config.json here (or uploading somewhere else and sending a link here).
  2. I don’t think there should be a limiting factor with the sensorless estimator for speed, but I’ll check in on this
  3. Can you share the motor datasheet? How much load is on it?
  4. How are you measuring the motor current? What variable from the ODrive (or is this in the GUI dashboard)?

Thank you for your quick reply! Is there a way to increase the electrical frequency to reach a higher maximum RPM? I am aiming for around 10,0000 mechanical RPM.

I backed up the config, but this website blocks .json file extensions. A link to the config file can be found here.

The datasheet for the KDE775 Kv motor can be found here. I have put a 10 in diameter propeller on it. The motor’s datasheet states that it should be able to spin a 12.5 in diameter propeller at around 10,000 RPM on 16VDC.

I have a separate DC current sensor that measures the current. I’m not sure what the idus paramater in the GUI was during my test. I can rerun the test tomorrow, if needed.

Once again, thank you!

The information you provided is perfect, thank you!

Is there a way to increase the electrical frequency to reach a higher maximum RPM

Yeah, the 667Hz is a bit hand wave-y and back of the napkin. You can honestly double that without seeing many issues – the current just might get a bit more ripple-y.

10,000 RPM (assuming you meant that and not 100,000 :wink: ) is 1167Hz which I’d bet is just fine.

S1 will theoretically be able to get the motor up to 9672 RPM at no load (16V * 775 RPM/V * 0.78 for the S1’s max modulation depth).

Looking at their performance graph, they say 0.31 Nm for the 10k RPM 12.5" prop, which according to my back-of-the-napkin math and the ODrive’s calibrated phase resistance in your config, is just barely possible even assuming 100% modulation depth. For the S1’s 78% modulation depth, this’ll be more like around 7300 RPM at 16V.

Looking at the config you posted, it seems you’re limiting the motor current to 10A. Given the motor’s theoretical torque constant of 8.27/775 = 0.0106 Nm/A, this corresponds to 0.106 Nm, which I’d bet is the issue here – you’re just not giving the motor enough current.

On the motor page it specifies 36A continuous for 180 seconds, which is probably very optimistic and assumes a good amount of airflow from the fan, but you should be OK to raise your current limit to about 30A, which will give you the performance you’re looking for.

Note that DC current sensors really aren’t going to be helpful here – the motor current is different from the DC bus current (good blog post on it: Things in Motion: How to select the right power source for a hobby BLDC (PMSM) motor). The motor current (which is directly proportional to the torque) will be reported by the ODrive as odrv0.axis0.motor.foc.Iq_measured and the bus current will be odrv0.ibus.

Overall, I’d recommend

  1. raise the motor current limit to 30A, and
  2. raise the S1’s bus voltage higher if possible, 24V or 48V will provide much better control since there’s more voltage overhead. With controllers like the ODrive, the bus voltage doesn’t actually matter in terms of protecting the motor – it’ll control the current to the motor, so more is better as long as you don’t spin the motor faster than the maximum speed the manufacturer allows (assuming 775 RPM/V * 21.8V == 16895 RPM, so you’d want to set velocity limit to 16895/60 = 281.58 rev/)

To raise the max electrical frequency, you can set axis0.config.motor.wL_FF_enable and axis0.config.motor.bEMF_FF_enable both to true. Note the latter assumes the manufacturer’s reported KV is accurate (which it frequently is not), so if you get poor/weird performance let me know and I can give you the steps to tune/characterize it.

Good news! I upped the current and was able to achieve test up to 4500RPM without any problem. 4500 was just the highest I’ve tested so far, I’ll test more next week. Thank you!

Is it safe to raise the motor voltage to 48V? The motor is rated up to 20V. If I raise it up to 48V do I just need to ensure the DC power of the motor doesn’t exceed the motors rating? For example, the motor is rated for 20V and 36A continuous so at 48V I would just keep the DC current below 15A?

I’d like to run the motor at higher voltage, if possible, to reduce the DC bus current.

Also, I’m interested in characterizing the motor KV. Can you please send me a guide or instructions? Will this result in a more accurate torque measurement in the oDrive? Accurate mechanical power readings are important for my setup.

Great to hear!

Yep, 48V is totally fine. With cheap/dumb controllers it’ll just dump current into the motor until it catches on fire, but since the ODrive directly regulates the motor current, you’re just fine as long as you have a current limit and velocity limit (the latter is mostly to respect the speed ratings of the motor’s bearings). It’s actually the current that causes heat, not the voltage*current, so just the current limit matters.

Also, I’m interested in characterizing the motor KV. Can you please send me a guide or instructions? Will this result in a more accurate torque measurement in the oDrive? Accurate mechanical power readings are important for my setup.

Sure thing, it should definitely help.

Two methods for experimentally determining KV:

  1. The one I use:
  • Spin the motor unloaded (no gearbox or propellor or anything connected) in velocity control, at some medium-high speed in velocity mode. Make sure axis0.config.motor.wL_FF_enable and axis0.config.motor.bEMF_FF_enable are both false (and you’ve run save_configuration() after setting them to false if they were true before). Make sure you’re well below saturation (maximum) speed, I usually do around ~half of the motor’s theoretical maximum speed, and try a few different points along the speed range to ensure consistency
  • Measure the velocity in rev/s with axis0.vel_estimate and look at axis0.motor.foc.v_current_control_integral_q
  • KV will be roughly 60*vel_estimate / (sqrt(3) * v_current_control_integral_q)
  • for example, if you’re spinning at 30 rev/s and v_current_control_integral_q is 8.73, then that’s a KV of 60*30/(sqrt(3) * 8.73) == 1800 / (1.732*8.73) == 119 RPM/V

For you, since your motor is rated up to 16895 RPM, I’d maybe try increments of 10 rev/s from 10-200 rev/s (with no propellor attached). There will be a lot of error at the low end and the high end of speed, so it takes a bit of intuition to figure out what number makes sense (low end error is due to ODrive current controller noise, high end error is due to motor resistance/losses). I’d recommend sending me a graph or list of raw data of the speed vs estimated kv (or speed vs v_current_control_integral_q) at each different speed, I can give it a quick eyeball/vibe check to make sure it looks alright and expected.

Second method is with an oscilloscope, as shown here: Project HoverArm - #2 by madcowswe