FOCDriver: Replace the divisions with reciprocal multiplication. #494
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
The SetPWM functions of all the drivers perform a constrain operation that normalizes the phase voltage and DC link voltage using a division operation, which may take several cycles even on processors that feature a FPU on their hardware.
This waste of cycles (which represent a precious amount of microseconds) can be drastically reduced when replacing the division by reciprocal multiplication, since the power supply voltage value will not change in the runtime it it is valid to replace for example:
To :
where:
The
inverse_power_supplyis calculated during the driver initialization avoiding the division to be done in the SetPWM function which is a hot code path, that is it, it gets called very often in the FoC main loop. I took the care to make this generic by introducing this new member in the base class and doing the inverse calculation in all the drivers available.Probably this optimization can be reused in more hot code paths, I will check where this can be potentially applied.