ODRIVE(led灯闪烁故障解决方法)

2022-07-25 20:50:31 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

故障排除

文章目录

  • 故障排除
    • 错误代码
    • 常见的 Axis 错误
    • 常见的 Motor 错误
    • 常见的 Encoder 错误
    • 常见的 Controller 错误
    • USB 连接问题
    • 固件问题
      • 执行`make`时无法构建固件
      • 运行`make flash`时无法烧录固件
    • 其他可能不会产生错误代码的问题
      • 电机在高速旋转时会中断或失控(ie: > 5000 RPM)
      • 静止时电机振动或发出噪音
      • 电机位置控制出现过冲或在目标位置震荡
      • 电机开始缓慢旋转
      • 电机输出的扭矩比应有的小或者电机在没有负载的情况下发热
      • 使用step/dir控制时方向或步进异常

错误代码

如果您的ODrive不能按预期运行,请运行odrivetool并输入dump_errors(odrv0) Enter 。 这将列出所有错误代码。如果要清除所有错误,可以运行dump_errors(odrv0,True)

以下各节将针对最常见的错误提供一些指导。 您还可以检查代码以获取完整的错误信息:

  • Axis 相关错误代码在 ”/Firmware/MotorControl/axis.hpp“ 中定义
  • Motor 相关错误代码在 ”/Firmware/MotorControl/motor.hpp“ 中定义
  • Encoder 相关错误代码在 ”/Firmware/MotorControl/encoder.hpp“ 中定义
  • Controller 相关错误代码在 ”/Firmware/MotorControl/controller.hpp“ 中定义
  • Sensorless 相关错误代码在 ”/Firmware/MotorControl/sensorless_estimator.hpp“ 中定义

常见的 Axis 错误

  • ERROR_INVALID_STATE = 0x01

您试图在不被允许的情况下切换状态。 通常是,您在校准电机之前尝试运行编码器校准或闭环控制,或者在校准编码器之前尝试运行闭环控制。

  • ERROR_DC_BUS_UNDER_VOLTAGE = 0x02

确认电源线已牢固连接。 对于测试,可以使用几个安培的12V 服务器电源,而使用类似适配器那种小电流电源可能会导致行为不一致,因此不建议这样做。 您可以通过输入start_liveplotter(lambda:[odrv0.vbus_voltage])在odrivetool中使用liveplotter监视电压。 如果看到电压降到〜8V以下,则将触发此错误。 即使是相对较小的电动机也可能会消耗几kW的瞬时功率,因此,除非您的电源非常大或使用电池,否则在执行具有高电流限制的高速运动时可能会遇到此错误。您可以调低 odrv0.axis0.controller.config.vel_limitodrv0.axis0.motor.config.current_lim这两个参数。

  • ERROR_DC_BUS_OVER_VOLTAGE = 0x04

确认您已正确连接了正确电阻值的制动电阻器,并且将odrv0.config.brake_resistance设置为制动电阻器的值。 您可以通过输入start_liveplotter(lambda:[odrv0.vbus_voltage])在odrivetool中使用liveplotter监视电压。 如果在电机运动过程中看到电压升高到电源当前设定电压之上,则说明您的制动电阻阻值偏低。 如果您使用长导线或小规格导线将制动电阻器连接至odrive,则可能会发生这种情况,这会增加额外的电阻。 需要考虑这个额外的电阻,以防止出现电压尖峰。 如果已检查所有连接,还可以尝试将制动电阻一次增加0.01~0.05欧姆。

常见的 Motor 错误

  • ERROR_PHASE_RESISTANCE_OUT_OF_RANGE = 0x0001ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE = 0x0002

在电机校准过程中,将测量电机电阻和电感。 如果测得的电机电阻或电感超出设定的正常范围,则会返回该错误。 请检查所有电机导线是否牢固连接。 可以使用odrivetool查看测量值,如下所示:

代码语言:javascript复制
In [2]: odrv0.axis0.motor.config.phase_inductance
Out[2]: 1.408751450071577e-05

In [3]: odrv0.axis0.motor.config.phase_resistance
Out[3]: 0.029788672924041748

某些电机的相电阻和电感将与此相差很大。 例如,云台电机,一些小型电机(例如,峰值电流<10A)。 如果您认为这适用,请尝试使用odrivetool将odrv0.axis0.motor.config.resistance_calib_max_voltage从其默认值1增加,然后重复电机校准过程。 如果电机的峰值电流较小(例如<20A),您也可以尝试将odrv0.axis0.motor.config.calibration_current从其默认值10A减小。 一般来说,odrv0.axis0.motor.config.resistance_calib_max_voltage应当符合以下条件:

代码语言:javascript复制
resistance_calib_max_voltage > calibration_current * phase_resistance
resistance_calib_max_voltage < 0.5 * vbus_voltage
  • ERROR_DRV_FAULT = 0x0008

已知ODrive v3.4存在硬件问题,当M0以较大电流运行的时候,电机将停止运行。 在这种情况下,两个电机将会报告错误ERROR_DRV_FAULT。推测是因为高速开关的大电流会在DRV8301栅极驱动器芯片的电源中产生较大的纹波,从而导致其欠压故障。 要解决此问题,您可以将M0电流限制为40A。 有关硬件修复的说明,请参考[DRV_FAULT on ODrive v3.4]。

  • ERROR_MODULATION_MAGNITUDE = 0x0080

母线电压不足以使电机电流达到设定电流。 如果在电机校准过程中出现这个错误,请确保motor.config.resistance_calib_max_voltage不超过总线电压的一半。 对于云台电机,建议将motor.config.calibration_currentmotor.config.current_lim设置为总线电压的一半或更低。

常见的 Encoder 错误

  • ERROR_CPR_OUT_OF_RANGE = 0x02

检查您的编码器的CPR和电机的磁极对数设置正确。 请注意,如果您使用的是AMT编码器,您需要检查编码器PCB上的配置是否正确。 如果您的编码器列出了其每转脉冲数(PPR),则将该数字乘以4即可得出CPR。

  • ERROR_NO_RESPONSE = 0x04

确认编码器和ODrive连接正确。

  • ERROR_INDEX_NOT_FOUND_YET = 0x20

确认您的编码器是具有索引脉冲的型号。同时确认编码器的索引信号输出引脚正确连接到ODrive。

常见的 Controller 错误

  • ERROR_OVERSPEED = 0x01

尝试增大<axis> .controller.config.vel_limit。 默认的vel_limit为每秒20,000个编码器计数,CUI-AMT102编码器旋转一周是8192个计数,这时电机转速仅为〜146 RPM。 注意:即使您未命令电机转速超过vel_limit,电机负载的突然变化也可能导致转速超过vel_limit,从而导致此错误。 您也可以尝试增加<axis> .controller.config.vel_limit_tolerance。 默认值1.2表示仅允许转速超过限制的20%。 您可以将vel_limit_tolerance设置为0以完全禁用此项参数功能。

USB 连接问题

  • 尝试将ODrive、PC、odrivetool关闭然后再打开
  • 确保您使用的是最新的固件和python工具版本
  • Linux: 输入 lsusb 来显示出所有USB设备。然后检查ODrive是否在其中
  • Linux: 确保您参考 下载和安装调试软件odrivetool 正确安装odrivetool
  • Windows: 右键单击开始菜单,然后打开“设备管理器”。 验证是否列出了您的ODrive
  • Windows: 使用 Zadig将驱动配置为 libusb-win32
  • 确保没有其他ODrive程序正在运行
  • 启动 odrivetools 后边加上 --verbose 启动参数
  • 运行 PYUSB_DEBUG=debug odrivetools 来输出更多日志信息
  • 如果您是开发人员,则可以使用Wireshark捕获USB通信数据
  • 换一根USB连接线,某些USB线只具有充电功能而不具备通讯功能
  • 尝试使USB线远离供电电源线,以减少EMI。

固件问题

执行make时无法构建固件

  • 首先运行make clean清除编译生成的临时文件以防止冲突。
  • Windows 用户: 通过在Git Bash中运行env | grep PATH来确认tup已正确添加到系统环境变量中。 如果看不到tup,则必须将tup所在路经添加到PATH环境变量中。 请注意,您可能需要重新启动电脑才能使添加的路径生效。

运行make flash时无法烧录固件

  • 如果使用ST-link,请确认ST-link和ODrive连接正确,并且您已为ODrive供电。 这可以通过ST-link的5V引脚或ODrive主电源实现。 注意:USB连接没有供电。

其他可能不会产生错误代码的问题

电机在高速旋转时会中断或失控(ie: > 5000 RPM)

  • 您的转速可能超过了编码器转速的极限。 实际上,ODrive默认的2400计数/旋转编码器实际上被限制在5000 RPM左右。 超过此速度会导致ODrive失去位置反馈。 这只能通过更换转速极限更高的编码器或将电机的输出通过减速器连接到编码器上来解决。 如果使用减速器来提高编码器的转速极限,请修改编码器相应的参数。

静止时电机振动或发出噪音

  • 可能因为 vel_gain 设置的过高。参考控制器&参数整定
  • 检查编码器轴的连接。 平头螺丝可能会随着时间的流逝而振动。 如果使用CUI轴编码器,请尝试重新安装塑料固定环,并确认其未与编码器外壳接触。 还要确认编码器已牢固安装。
  • 如果您使用的是高分辨率编码器(> 4000个计数/旋转),那么增加encoder_pll_bandwidth可能有助于减少振动。If you are using a high resolution encoder (>4000 counts/rotation) then increasing encoder_pll_bandwidth may help reduce vibration.
  • 如果将电机连接到具有较大惯性的负载(例如飞轮),这将在控制增益较高时有助于减少振动。 但是,请确保所有连接都是紧密的。 廉价的联轴器或皮带会在系统中引入很多间隙,从而使电动机仍然可以独立的振动。

电机位置控制出现过冲或在目标位置震荡

  • 可能是由于 pos_gain 设置的太高。参考 控制器&参数整定。
  • 增加电机电流限制值以获取更大的转矩。

电机开始缓慢旋转

  • 编码器反馈信号可能已丢失。电机急停或剧烈振动导致连接松动,可能会发生这种情况。

电机输出的扭矩比应有的小或者电机在没有负载的情况下发热

  • 编码器的连接可能松动了,导致电机控制器换向错误,从而降低了输出转矩,并在电机试图保持位置时产生了过多的热量。
  • 如果转子在电机的轴上打滑,也可能导致这种情况。 在某些电机上,转子通过平头螺钉固定在轴上。 确认该螺丝足够紧。 有关如何解决此问题的更多详细信息,请参见 [Motor Gets Hot, has less Torque in one direction than the other。

使用step/dir控制时方向或步进异常

  • Odrive V3.5 之前的版本,用于step/dir接口的GPIO引脚上没有滤波,因此电感耦合噪声可能导致检测到错误的步进。 Odrive V3.5 和 更高版本已经板载过滤功能来解决此问题。
  • 如果您遇到此问题,请尝试使用双绞线连接的方式连接控制器和ODrive。您可以使用普通的五类线来制作用于连接的双绞线。
  • 请确认step/dir连接线不要从ODrive板子表面走过,同时尽量远离电机线和供电电源线。
  • 如果以上方法不能解决您在v3.4和之前版本ODrive上的问题,请尝试在step和dir的连接线中分别串入一个~22Ohm的电阻,并在这两个引脚和GND之间分别添加一个4.7 nF的电容。如下图所示:

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127807.html原文链接:https://javaforall.cn

0 人点赞