Method 1 - add additional hardware
If you want only speed control and not position, then connect a gear to the motor shaft. The output of the gear system should not be connected to the load. It should be connected to an encoder. The gear ratio should be such that the gear system output runs faster than the motor shaft, say 100 times.
When the desired RPM goes below some pre determined value, say 10 RPM, stop monitoring the main encoder connected to the shaft. start monitoring the enocoder at the output of the gear system which is spinning 100 times faster in our example. Use pulses from this faster spinning encoder to control the motor speed by compensating for the factor in software.
Beware of backlash in the gear system if the motor changes direction. I don't think it does in you example since you say 3 RPM to 3000 RPM (i.e; no 0 RPM).
Also, once you start going to very low RPMs, the static friction in the motor can also lead to instability of the control. Beware of that.
At 3000 RPM the gear and the shaft will spin at 300,000 RPM. This may damage the gear. If so, then use a clutch to disconnect the gear system from motor shaft when RPM goes above some pre determined RPM, say, 100 RPM.
Method 2 - change 2.2us
It is not clear (to me) from your question the sanctity of 2.2us. Cant you increase it when desired RPM is low ? I think you need 2.2us only for high RPMs. If you can vary the sampling frequency dynamically, then you don't need extra hardware. You will get enough pulses for 3RPM if you change 2.2us to say, 2.2ms.