Encoder on a driven shaft (not the motor)

I am starting a design where the encoder (CUI AMT102 2048 PPR) will be on a shaft driven by a motor with pulley/belt with a (mandatory) reduction ratio of 60/16 = 3.75.

Does it work with odrive ?
If not, any hints to make it work ?

I am new to oDrive, sorry if this is a stupid or well-known question.

Thanks in advance

Why don’t you place it on the motor?


Carelsbergh Stijn

I am using single shaft low cost MT4114 motor.
Placing the encoder on this shaft will be complicated and will require additional parts.
While placing it on the driven shaft will be obvious : no additional part, just screw the encoder on a plate traversed by this shaft.

I just find (very rare I think) GT2 15 teeth pulley instead of the 16T that I intended to use.
This will give a 4:1 reduction ratio.

Maybe using a 4:1 ratio instead of a 3.75 ratio will be easier to manage with oDrive. ?



Can you make a drawing of what you learn


No, this is not an open design.

The question is not about the mechanical design.
The question is about the capability for oDrive to manage an encoder placed on a driven shaft with any reduction ratio.
Is there any restrictions ?


Not an open design, what do you mean? I’m just trying to help, I just want to know the working principle


Thanks for your help.

By not an open design, I mean that I am not allowed to give any detail on the application.
The principle is very simple :
There is a small MT414 motor with a 16T pulley in a very tight enclosure (no room to add any other component on the shaft or in front of it).
From this 16T pulley, a belt drives a shaft with a 60T pulley on it.
The reduction ratio between the motor and this shaft is 60/15 = 3.75.
(This is equivalent to a geared motor with a 3.75 reduction ratio)
The only possibility is to place the encoder on this shaft.
That’s all I can explain.

Can I use oDrive in a system where the motor rotates at 3.75 times the speed of the encoder ?



It is possible, because I’ve seen it done before.

But I don’t know by hard how


On principale I don’t see why it wouldn’t work.
Just introduce your gear reduction ratio on odrv0.axis0.encoder.config.cpr and that’s it I guess.
Warning: I never tried myself.
Second warning: you should really severely torture test your setup before actually using it.

Because when the mechanical connection is lost between the encoder and motor movements, thing can go super wrong. That’s why i would keep the encoder as close as possible from the motor shaft. Since you’re not allowed to share details, I would be even more careful (in other words I wouldn’t do it)

Thanks for your answers and advices.

In any case ( if all goes well ), I will do it and test it.

I will make the design compatible with a 3.75 and 4 reduction ratio.
By now, I am not sure that the latest version of oDrive will accept a floating point value for the reduction ratio in odrv0.axis0.encoder.config.cpr. (I still need to get a board or dig into the firmware).

Note : in my case, if the mechanical connection is lost between the motor and the encoder nothing wrong can happen except crazy rotations of the motor which is not a safety issue.



I don’t think it’s that simple, the motor will only do one rotation to reach the cpr value, after that it spits out an error if it is not reached.


Good remark. Thanks.

In this particular design, the driven shaft is only moving +90° to -90°, meaning less than two revolutions for the motor with a 4:1 reduction ratio.
In this case, I will need to modify the firmware to let the motor rotate for two rotations until reaching the cpr value.
or to choose another option than oDrive (e.g. stepper motor) if this does not work.

Sorry not to give more details, but that’s out of my control.


Hi @jct, your question was clear from your first post, and it’s a great question.

The simple way would be to scale your cpr from 8192 (= ppr x4), to a new effective value. However, as you guessed, this must be an integer. In your case:

8192/3.75 = 2184.53333333

So that doesn’t work.

We have more options though. We can scale the pole-pairs and the effective cpr together. You can imagine that we form a virtual motor where we go around the physical motor twice, and we say that’s one virtual turn. In that case we scale the pole-pairs and the cpr up by factor two.
In fact, we can scale both together by any factor, as long as the resulting pole-pairs and cpr are both integers.

k * cpr_{effective} = cpr_{scaled} = \text{Integer}
k * pp = pp_{scaled} = \text{Integer}

I asked Wolfram Alpha to find the factors of your effective CPR, and it found this:


Therefore, i think you can use k = 15, and hence set your scaled CPR to 32769, and your scaled pole pairs to the physical pole pairs times 15.

1 Like

Or use the 4:1 ratio gear, which may be simpler, but more expensive :thinking:


Thanks a lot for your clear explanations.

After reviewing the overall design and taking into account that in fact GT2 15T/60T pulleys are readily available from some providers, I will use the 4:1 gear ratio.

In any case, it is very useful to know that other ratios are possible.

Impatient to get an oDrive board for testing !


very interesting! thanks