黄工无刷电机学习
直播中

刘军

7年用户 1364经验值
私信 关注
[问答]

如何设置ODrive以使用RC PWM输入来驱动平衡车轮毂电机

如何设置ODrive以使用RC PWM输入来驱动平衡车轮毂电机?有哪几个步骤?

回帖(1)

李高歌

2021-10-9 09:58:03
  平衡车轮毂电机和遥控器设置指南
  应大家的要求,这里提供了有关如何设置ODrive以使用RC PWM输入来驱动平衡车轮毂电机的详细说明。
  每个步骤都附带说明,因此希望您可以顺利的完成配置。
  电机接线
  电机具有三个较粗的电机相位线(通常为黄色,蓝色,绿色),以及一组5条较细的线,用于霍尔传感器反馈(通常为红色,黄色,蓝色,绿色,黑色)。
  您可以以任何顺序将电机的相线连接到ODrive的电机连接器中,因为稍后我们仍将对其校准。 将霍尔反馈连接到ODrive J4连接器(确保和电机通道号匹配),如下所示:
  注意:为了与编码器输入兼容,ODrive在霍尔传感器连接的引脚上没有任何滤波电容器。 因此,为了获得可靠的霍尔信号,建议在这些引脚上添加一些滤波电容。
  电机配置
  标准6.5英寸轮毂电动机有30个永磁极,因此极对数为15。 如果您使用的是它电机,则需要数一下磁铁个数或通过数据表以获取此信息。
  odrv0.axis0.motor.config.pole_pairs = 15
  平衡车轮毂电机与普通的电机相比具有更高的相电阻,因此我们使用更高的电压进行电机校准,并将电流感应设置的更敏感。同时,电机的电感也相当高,因此我们需要将电流控制器的带宽从默认值减小以保持其稳定。
  odrv0.axis0.motor.config.resistance_calib_max_voltage = 4
  odrv0.axis0.motor.config.requested_current_range = 25 #需要重启以使此项参数生效
  odrv0.axis0.motor.config.current_control_bandwidth = 100
  将编码器设置为霍尔模式(而不是编码器增量模式)
  霍尔反馈对于电动机中的每个极对都有6种状态。 由于我们有15个极对,因此将cpr设置为15 * 6 = 90。
  odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
  odrv0.axis0.encoder.config.cpr = 90
  由于霍尔反馈每转仅具有90个计数,因此我们希望减少速度跟踪带宽以获得更平滑的速度估计。
  我们还可以适当的调低一些控制器的增益,使系统反应不那么激进,当然也应该能够适合您的应用。
  因为可能想要控制轮式机器人,所以我们选择速度控制模式。 请注意,在速度模式下不使用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 = CTRL_MODE_VELOCITY_CONTROL
  在下一步中,我们将开始为电机供电,因此我们要确保首先保存配置,然后需要重启ODrive。
  odrv0.save_configuration()
  odrv0.reboot()
  确保电动机可以自由转动,然后执行电机校准。
  odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
  您可以通过以下指令读取与电机有关的所有数据:
  odrv0.axis0.motor
  检查是否出现错误,并且相电阻和电感值是合理的。 以下是我得到的结果:
  error = 0x0000 (int)
  phase_inductance = 0.00033594953129068017 (float)
  phase_resistance = 0.1793474406003952 (float)
  如果一切看起来都正常,那么您可以执行以下指令命令ODrive将校准的结果保存:
  odrv0.axis0.motor.config.pre_calibrated = True
  下一步是检查电机和霍尔传感器之间的校准情况。
  由于先前接线步骤,您可以按随机顺序连接电机相线,并且霍尔信号也是随机的。 所以校准后不要再更改它。
  确保电动机可以自由旋转:
  odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
  检查校准后的状态:
  odrv0.axis0.encoder 检查是否有错误出现。 如果您的霍尔传感器安装角度还算标准,则offset_float应接近0.5。
  error = 0x0000 (int)
  offset_float = 0.5126956701278687 (float)
  如果一切看起来都正常,那么您可以执行以下指令,这样在下次启动后就不用再次进行编码器校准了:
  odrv0.axis0.encoder.config.pre_calibrated = True 好的,我们现在完成了电机配置! 是时候保存,重新启动然后进行测试了。
  ODrive启动后会进入空闲状态(我们将在稍后进行切换),我们之后可以启动闭环控制。
  odrv0.save_configuration()
  odrv0.reboot()
  odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
  odrv0.axis0.controller.vel_setpoint = 120
  # Your motor should spin here
  odrv0.axis0.controller.vel_setpoint = 0
  odrv0.axis0.requested_state = AXIS_STATE_IDLE
  希望您的电机能正常旋转! 如果不正常,请仔细核对上述所有操作。
  PWM 信号输入
  如果要使用RC遥控器来控制电机,则可以使用PWM输入。
  让我们使用GPIO 3/4作为速度控制信号的输入,这样我们就不必禁用UART。
  然后,将这些摇杆输入范围映射到某个合适的速度设定范围。
  我们还必须重新启动以使PWM输入生效。
  odrv0.config.gpio3_pwm_mapping.min = -200
  odrv0.config.gpio3_pwm_mapping.max = 200
  odrv0.config.gpio3_pwm_mapping.endpoint = odrv0.axis0.controller._remote_attributes[‘vel_setpoint’]
  odrv0.config.gpio4_pwm_mapping.min = -200
  odrv0.config.gpio4_pwm_mapping.max = 200
  odrv0.config.gpio4_pwm_mapping.endpoint = odrv0.axis1.controller._remote_attributes[‘vel_setpoint’]
  odrv0.save_configuration()
  odrv0.reboot()
  现在我们可以检查摇杆是否正确控制电机转速了。 移动遥控器摇杆,打印vel_setpoint,移动到其他位置,然后再次检查。
  In [1]: odrv0.axis1.controller.vel_setpoint
  Out[1]: 0.1904754638671875
  In [2]: odrv0.axis1.controller.vel_setpoint
  Out[2]: 0.1904754638671875
  In [3]: odrv0.axis1.controller.vel_setpoint
  Out[3]: 28.152389526367188
  In [4]: odrv0.axis1.controller.vel_setpoint
  Out[4]: 61.21905517578125
  In [5]: odrv0.axis1.controller.vel_setpoint
  Out[5]: -52.990474700927734
  好的,现在我们应该能够使用遥控器来控制电机的转速了!
  odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
  odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
  安全提醒
  确保在RC接收器上设置故障保护功能,以便在遥控器和接收器之间失去连接时,接收器将为两个轴的速度设定值输出0(或对您的设备来说安全的设定)。 另请注意,如果接收器关闭(电源丢失等),或者从接收器到ODrive的信号丢失(电线拔出等),则ODrive将继续执行上一个命令的速度设定值。 ODrive中的PWM输入当前没有超时保护功能。
  启动后自动进入闭环控制模式
  尝试重新启动,然后在两个轴上激活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()
举报

更多回帖

发帖
×
20
完善资料,
赚取积分