电机接线
电机带有三个电机相位(通常为黄色、蓝色、绿色),这些相位较粗,并且有一组5根较细的电线用于霍尔传感器反馈(通常为红色、黄色、蓝色、绿色、黑色)。
你可以将电机的各相以任意顺序连接到 ODrive 的电机连接器上,因为我们稍后反正会校准相位对齐。将霍尔反馈信号按照以下方式连接到 ODrive 的 J4 连接器(确保电机通道编号匹配):
Hall wire | J4 signal |
---|---|
Red | 5V |
Yellow | A |
Blue | B |
Green | Z |
Black | GND |
注意:为了与编码器输入兼容,ODrive 在霍尔传感器连接的引脚上没有滤波电容器。因此,为了获得可靠的霍尔信号,建议您在这些引脚上添加一些滤波电容器。您可以查看说明 here.
电机配置
电机有 8 个永磁极,因此有 4 对磁极。如果您有不同的电机,您需要数一下磁铁的数量或拥有一份可靠的数据手册来获取这些信息。
odrv0.axis0.motor.config.pole_pairs = 4
odrv0.axis1.motor.config.pole_pairs = 4
悬浮滑板的轮毂电机相比业余飞行器电机具有较高的电阻,所以我们希望在电机校准中使用稍高的电压,并设置电流感应增益以提高灵敏度。
电机的电感也相对较高,因此我们需要将电流控制器的带宽从默认值降低以保持其稳定性。
odrv0.axis0.motor.config.resistance_calib_max_voltage = 4
odrv0.axis0.motor.config.requested_current_range = 25 #Requires config save and reboot
odrv0.axis0.motor.config.current_control_bandwidth = 100
odrv0.axis1.motor.config.resistance_calib_max_voltage = 4
odrv0.axis1.motor.config.requested_current_range = 25 #Requires config save and reboot
odrv0.axis1.motor.config.current_control_bandwidth = 100
将编码器设置为霍尔模式(而不是增量模式)。有关如何连接霍尔反馈的说明,请参阅接线图。
电机中的每个极对霍尔反馈有6个状态。由于我们有4个极对,因此将cpr设置为4*6=24。
odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis0.encoder.config.cpr = 24
odrv0.axis1.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis1.encoder.config.cpr = 24
由于霍尔反馈每转只有24个计数,我们希望降低速度跟踪带宽以获得更平滑的速度估计。
我们还可以设置这些相对保守的增益,这样即使结构不够牢固也不会使设备晃动。确保在其他一切正常工作后再调整增益到适用于您应用的刚度。
此外,我们还应该从速度控制模式开始,因为这可能是您对有轮机器人所需的方式。请注意,在速度模式下pos_gain
不会被使用,但我还是给出了一个推荐值,以防您想运行位置控制模式。
odrv0.axis0.encoder.config.bandwidth = 100
odrv0.axis0.controller.config.pos_gain = 1
odrv0.axis0.controller.config.vel_gain = 0.02
odrv0.axis0.controller.config.vel_integrator_gain = 0.1
odrv0.axis0.controller.config.vel_limit = 1000
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis1.encoder.config.bandwidth = 100
odrv0.axis1.controller.config.pos_gain = 1
odrv0.axis1.controller.config.vel_gain = 0.02
odrv0.axis1.controller.config.vel_integrator_gain = 0.1
odrv0.axis1.controller.config.vel_limit = 1000
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
在下一步我们将开始给电机供电,因此我们希望首先应用上述需要重启的一些设置。
odrv0.save_configuration()
odrv0.reboot()
确保电机可以自由移动,然后激活电机校准。
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
odrv0.axis1.requested_state = AXIS_STATE_MOTOR_CALIBRATION
你可以读出所有与电机相关的数据:
odrv0.axis0.motor
odrv0.axis1.motor
检查是否存在错误以及相位电阻和电感是否合理。以下是我的结果:
error = 0x0000 (int)
phase_inductance = 0.00033594953129068017 (float)
phase_resistance = 0.1793474406003952 (float)
如果一切看起来都正常,那么你可以告诉ODrive,将此校准保存到持久内存是可以的:
odrv0.axis0.motor.config.pre_calibrated = True
odrv0.axis1.motor.config.pre_calibrated = True
下一步是检查电机和霍尔传感器之间的对齐情况。
因为这一步允许你随机连接电机相位,霍尔信号也可以是随机的。只是在校准后不要改变。
确保电机可以自由移动并运行:
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
odrv0.axis1.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
检查encoder状态:
odrv0.axis0.encoder
odrv0.axis1.encoder
检查是否有错误。如果您的霍尔传感器具有标准定时角度,则offset_float
应接近0.5或1.5。
error = 0x0000 (int)
offset_float = 0.5126956701278687 (float)
如果一切看起来都正常,那么你可以告诉ODrive保存此校准到持久内存是可以的:
odrv0.axis0.encoder.config.pre_calibrated = True
odrv0.axis1.encoder.config.pre_calibrated = True
好的,我们现在完成了电机配置!现在是时候保存、重启,然后测试它了。
ODrive 在空闲状态下启动(我们以后会看看如何更改这一点)所以我们可以通过闭环控制来启用它。
odrv0.save_configuration()
odrv0.reboot()
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 10
# Your motor should spin here, important
odrv0.axis0.controller.input_vel = 0
odrv0.axis0.requested_state = AXIS_STATE_IDLE
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis1.controller.input_vel = 10
# Your motor should spin here, important
odrv0.axis1.controller.input_vel = 0
odrv0.axis1.requested_state = AXIS_STATE_IDLE
希望你的电机已经转动起来了!如果参数合适的话,可以自由地对另一个轴重复上述所有步骤。
自动启动
尝试重启并激活两个轴上的AXIS_STATE_CLOSED_LOOP_CONTROL。检查所有内容是否正常运行并按预期工作。
如果是这样,你现在可以让ODrive在启动后自动开启电机电源。如果你打算在没有PC或其他逻辑板的情况下运行ODrive,这将非常有用。
odrv0.axis0.config.startup_closed_loop_control = True
odrv0.axis1.config.startup_closed_loop_control = True
odrv0.save_configuration()
odrv0.reboot()