I am building a robot with 4 BLDC motors, and 2 brushed motors with 2000p encoders. I’ve taken the time to learn how to set up tlalexander’s amazing firmware for this. I have it mostly working, but am having some control issues.
I have messed with the signs of the position, velocity, and current gains in an attempt to fix the issue, but no matter what I try the motor will spin continuously in the wrong direction and never reach it’s position set point.
Here’s the script i’m using to test
#!/usr/bin/env python3
“”"
Example usage of the ODrive python library to monitor and control ODrive devices
“”"
from future import print_function
import odrive
from odrive.enums import *
from odrive.utils import dump_errors
import time
import math
import sys
import fibre
def idle_wait():
while odrv0.axis1.current_state != AXIS_STATE_IDLE:
time.sleep(0.1)
print(dump_errors(odrv0))
Find a connected ODrive (this will block until you connect one)
print(“finding an odrive…”)
odrv0 = odrive.find_any()
print(dump_errors(odrv0, True))
Find an ODrive that is connected on the serial port /dev/ttyUSB0
odrv0 = odrive.find_any(“serial:/dev/ttyUSB0”)
odrv0.axis1.motor.config.current_control_bandwidth = 100
odrv0.axis1.encoder.config.bandwidth = 100
odrv0.axis1.requested_state = 11
odrv0.axis1.motor.current_control.p_gain = 50.0
odrv0.axis1.motor.current_control.i_gain = 0.0
odrv0.axis1.motor.current_control.final_v_beta = 0.1 # Voltage Ramp Rate
print(odrv0.axis1.encoder.pos_estimate)
print(odrv0.axis1.encoder.pos_estimate)
odrv0.axis1.controller.current_setpoint = 5.0
This is a current-based hard block homing routine.
print(dump_errors(odrv0, True))
odrv0.axis1.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
idle_wait()
print(“Index Search complete”)
print(odrv0.axis1.encoder.pos_estimate)
timer = time.time()
time.sleep(2)
if True:
odrv0.axis1.encoder.config.bandwidth = 100
odrv0.axis1.controller.config.vel_ramp_rate = 100
odrv0.axis1.controller.config.vel_gain = 0.001
odrv0.axis1.controller.config.vel_integrator_gain = 1
odrv0.axis1.controller.vel_integrator_current = 5
odrv0.axis1.requested_state = AXIS_STATE_IDLE
odrv0.axis1.controller.config.control_mode = CTRL_MODE_POSITION_CONTROL
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis1.controller.config.pos_gain = 1
odrv0.axis1.controller.vel_ramp_enable = True
odrv0.axis1.controller.config.vel_ramp_rate = 1
odrv0.axis1.motor.config.current_lim = 10.00
odrv0.axis1.controller.config.vel_limit_tolerance = 2.5
odrv0.axis1.controller.config.vel_limit = 512000
odrv0.axis0.trap_traj.config.vel_limit = 128000
odrv0.axis0.trap_traj.config.accel_limit = 200
odrv0.axis0.trap_traj.config.decel_limit = 200
odrv0.axis0.trap_traj.config.A_per_css = 0
print(odrv0.axis1.encoder.pos_estimate)
time.sleep(1)
odrv0.axis1.controller.move_to_pos(128000)
while True:
time.sleep(1)
print(odrv0.axis1.encoder.pos_estimate)
print(dump_errors(odrv0, True))
# odrv0.axis1.controller.move_to_pos(0)