First Calibration Motor Issue

Hello! I have been just learning how to use the ODrive, reading up on forums and have been running into this problem with calibrating my motor.

Here’s the motor I’m using - [D5065-270KV Brushless Motor DUAL SHAFT MOTOR
Here’s the encoder - CUI AMT10E2

After I run odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE, the motor not moving.
Here are the dump errors:
system: not found
axis0
axis: Error(s):
UNKNOWN ERROR: 0x00000100
motor: no error
sensorless_estimator: no error
encoder: Error(s):
ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH
controller: no error
axis1
axis: no error
motor: no error
sensorless_estimator: no error
encoder: no error
controller: no error

After reading up on this I tried shadow count to make sure my encoder is working and I do get proper values for It. Any clue where to go from here. Thanks for all the help!

Does the motor move half a turn and stop, or does it not move at all?

If it moves in one direction and stops: Please obviously check that your encoder CPR and motor pole pairs are correct. Also check for any slippage of the encoder on the shaft - it should be firmly attached.

If it doesn’t move at all, the error would normally be ENCODER_NO_RESPONSE …

edit: see my reply to your other thread:

Please double check the shadow_count by moving the motor as close to 1 turn as you can, and see if the counts change by 8192 per turn, or 5120.

You can use the command
start_liveplotter(lambda: [odrv0.axis0.encoder.shadow_count])
to throw the position onto a live graph.

Also, the counts may be 5120x4 i.e. 20480 cpr (PPR is not the same as CPR due to the way quadrature decoding works) therefore please also try setting cpr to 20480

if you ever get “system: not found” this might be because you have sent a reset or save_config commands somewhere on the way.

Here is a bit of a script that I am using for my experiments:

def get_fresh_odrive():
    import fibre
    odrv0 = odrive.find_any()
    try:
        odrv0.reboot()
        time.sleep(1)    
    except fibre.libfibre.ObjectLostError:
        odrv0 = odrive.find_any()
    time.sleep(1)
  
    return odrv0

and then for playing with settings:

def safe_save_config(odrv):
    import fibre    
    odrv.axis1.requested_state = AXIS_STATE_IDLE
    odrv.axis0.requested_state = AXIS_STATE_IDLE
    odrv.axis0.motor.config.pre_calibrated = True
    odrv.axis0.encoder.config.pre_calibrated = True
    odrv.axis1.motor.config.pre_calibrated = True
    odrv.axis1.encoder.config.pre_calibrated = True
    try:
        odrv.save_configuration()
        time.sleep(1)
    except fibre.libfibre.ObjectLostError:
        odrv = get_fresh_odrive() 
    return odrv

I think the system: not found can be safely ignored on ODrive 3.6. ODrivetool is becoming increasingly focused towards the proprietary V4, which has a “system” property while the 3.6 does not.

Hello. Thanks for the tip.
It moves just 1 cycle.
I’ve changed the cpr by 20480, still not working.

Now I get 0 whatever I do, I’ve turned the motor a few times but it doesn’t change

what do you recommend?

Did you previously get a changing value when moving it by hand? :confused:

Can you reproduce that i.e. go back to your previous config and see that shadow_count changes when you move the motor?

Or, if it has “never worked” then maybe your wiring or config is wrong.