完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
平衡车轮毂电机和遥控器设置指南
应大家的要求,这里提供了有关如何设置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() |
|
|
|
只有小组成员才能发言,加入小组>>
2435 浏览 0 评论
9100 浏览 4 评论
36773 浏览 19 评论
5026 浏览 0 评论
24745 浏览 34 评论
1528浏览 2评论
1743浏览 1评论
2193浏览 1评论
1553浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:01 , Processed in 1.370523 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号