HDM VFD reported rpm vs asked

Curious what other HDM owners are experiencing. I noticed early on that my 110v VFD never read over 21,840 even though 24,000 was set. Either through g-code or manual M3S24000 command. A 9% shortfall. Also, I verified the VFD reading with a digital tach. I also noted discrepancies through the entire rpm range. Posted it up as interesting but not a deal breaker, continued on my merry way living with the issue.

As of late my interest in achieving accurate rpm settings has increased in priority. A few weeks ago I sat down and manually progressed through the rpm range in 1000 rpm increments. Verified each reading with the laser tach. Some results:
8000 ask 7998 actual - 0.025%
10000 ask 7998 actual -20%
12000 ask 9750 actual -18.8%
14000 ask 11460 actual -18%
20000 ask 16920 actual -15.9%
23000 ask 20550 actual - 10.6%

A progression from good to terrible to merely bad.

So, the obvious question, how to calibrate the HDM VFD’s rpm?

(I do recall we tweaked some settings for the 2.2kw added to my S3XL to improve rpm accuracy but that was a different VFD from a different supplier.)

1 Like

this should be within say 5% – 9% is a bit much

I’d contact support… it could just be as easy as a tuning inside the VFD


LOL not to mention 20% etc.

Request in to support. This post just a query of others experiences across the full range of rpm.

1 Like

While you wait for an answer from support:

I don’t have a HDM so take all of this with a grain of salt, but:

  • getting exactly 7998 at both 8k and 10k commanded would seem to indicate that the VFD has a min RPM setting of 10.000RPM, so I’m going to ignore that data point at 8k.
  • graphing the other values, the good news is it’s quite linear (as expected):

so since you can’t modify the (locked) VFD settings (to alter the input voltage to spindle frequency mapping), an easy way to “calibrate” would be to just adjust GRBL’s $30 so that 23k actually gives you 23k rather than 20550.

assuming $30 is currently set at 24.000, changing it to $30=21443 (=24000 * 20550/23000) should change the slope of the curve/boost the PWM voltage by just the right amount to give you exactly 23000 actual for 23000 commanded (and hopefully a close enough value for other points in the RPM range). That’s if I did not make a mistake and divide the wrong way, there is a 50% chance as it is getting late here.

That’s all assuming that your tachmeter is accurate, too :slight_smile:


Ok, let’s check it out.


actual S=9000

actual S=21870

Seemed like a great idea, thanks for the input!

Oops, try s23000

Boy, if the VFD does not have linear response to PWM input voltage the linear math won’t help. Experimentally lower $30 further? Of course the problem is, any commanded RPM above $30 will end up giving the same actual RPM value (which you already see, 23000 giving the same RPM as 24000)

Actually, 21870 vs 21840

Unloaded our shop’s 110V HDM spindle runs at 23,790 RPM with 24,000 commanded. Maybe @Griff’s problem has something to do with the VFDs’ rated maximum output frequencies being 320 Hz (19,200 RPM)?
Pages from HDM VFD manual.pdf (72.7 KB)
I’ll check some more speeds on our “1200W” and “1500W” C3D spindles when I get a chance. @Griff - have you checked for a poor connection (likely to one of the VFD analog inputs)?


There isn’t a calibration process. We manage the RPM’s through the spinderella board.

As this is a Pre production/Beta HDM the electronics got a little tweaking. Unfortunately I don’t believe production boards are backwards compatible.


Disappointing but understandable in the given circumstances.

Eventually I will be upgrading to a 2.2 kW spindleVFD. Would such an upgrade include an appropriate Spinderella?

I’ll get a 9v battery in my tach and check the same speeds you did and report back. Be sure you have gsenders spindle scaling set to match your firmware (if using g-sender). Mine always defaults to 0-30000 each time I open the app.

Interesting, wasn’t aware of that.

In the settings menu, click spindle and be sure the min speed is 0 and max is 24000 ( or whatever you’ve set in fw) It uses these values to scale the voltage / rpm.

I need to understand gsender spindle scaling, something to learn. I’d be happy to have 24k, anything else is gravy.

How would it do that? It’ll just send your commands to the controller which is where all the pwm scaling happens. And then passed on to Spinderella I guess.
That’s all based on your $30 and $31 settings.

I don’t know how it works in the code but it’s the same as scaling pwm for laser power in lightburn. I presume if you call for 12,000 rpm it will tell the spinderella to send 50% pwm or 2.5v. if it’s scaled 0-30000, and you call for 12,000 rpm, it will send less than 50% or 2.5v and your speed will be under 12,000. That’s what I’ve seen in my experience.


Nevermind. I retract my previous statement. I swear I used to see this behavior but its making a liar out of me now. Those to just seem to be min / max values and don’t scale anything. Would there be a difference between the spinderella 1.0 and 1.1 revision in how it handles this? Apparently there is no scaling applied

1 Like

gSender just passes the commands on to the controller. Grbl takes those commands and sends out a PWM signal representing a voltage from 0.02V-5V in 255 increments (with 0 meaning the spindle is disabled). You’ll always only get 255 increments by default, so you can’t infinitely adjust the rpm. After that signal is sent, it’s in the electronics after that (Spinderella, VFD, etc) that handle how it gets translated into a spindle rpm.


OK, no harm no foul. Thanks @neilferreri for the clarification.

Speaking of spinderella, hypothetically speaking of course, could it be cut out of the loop? Probably not, I’d guess the Warthog board expects/needs her to be present. Most likely need a complete 3rd party controller solution.

Oh well, I’ve made a chart to enable the approximately correct rpm settings through the range. That’ll have to do.

1 Like

So the scaling that gets applied in light burn is due to the fact that light burn generates the g code prior to sending it to the controller right? For some reason I was under the impression that g sender was scaling the M3 command based on the range set in settings before it went to the controller.

1 Like