ODrive应用 #5 编码器

编码器

支持的编码器

请首先阅读一下ODrive编码器选型指南

编码器校准

ODrive支持的所有编码器类型都需要进行某种编码器校准。 这需要以下条件:

  • 选择一种编码器并将其安装到电动机
  • 选择编码器通讯接口 (e.g., AB, ABI or SPI)
  • 将编码器通信接口连接到ODrive
  • 加载正确的odrive固件(默认的固件大多数情况下都是可以的)
  • 电机校准
  • 将设置保存在ODrive中,并正确启动

无索引信号的编码器

在编码器校准过程中,必须允许转子旋转而且不能有偏载。 这意味着载荷均匀和较弱的摩擦载荷才行,但是重载或类似弹簧载荷不行。
odrivetool中输入<axis>.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION Enter
要验证一切正常,请检查以下变量:

  • <axis>.error应该为 0。
  • <axis>.encoder.config.offset应该打印出一个数字类似 -326 或 1364。
  • <axis>.motor.config.direction 应该打印出 1 或 -1。

带有索引信号的编码器

如果您的编码器带有索引(Z)信号,则可以避免每次启动时都必须进行编码器偏移校准,而可以使用索引信号将编码器重新同步到存储的偏移校准。
以下是进行一次性校准和配置的步骤。 请注意,您可以一次校准一台电机,也可以同时将所有电动机一起按照这些步骤操作。

  • 由于只需要这样做一次,因此建议您将电机与编码器以外的任何其他机械分离,以使其自由旋转。
  • 设置 <axis>.encoder.config.use_indexTrue
  • 执行 <axis>.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH。这将使电机朝一个方向旋转,直到找到编码器索引。
  • 按照无索引信号的编码器校准说明进行操作。
  • 设置 <axis>.encoder.config.pre_calibratedTrue 以使能索引脉冲。
  • 如果您想在启动时搜索索引信号,请设置 <axis>.config.startup_encoder_index_searchTrue
    • 如果您希望手动进行操作,请在每次启动ODrive后运行 <axis>.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
  • 如果您希望在启动时尽量的快,请设置<axis>.motor.config.pre_calibratedTrue 这样就不需要在每次启动时重新测量电机参数。
  • 执行 <odrv>.save_configuration() Enter,保存配置。

现在每次重新启动时,电动机都会向一个方向旋转,直到找到编码器索引。

  • 如果您的电机启动后寻找编码器索引时由于负载过重转不动时,您可以适当增大<axis>.motor.config.calibration_current

反方向旋转编码器索引搜索

有时,您希望索引搜索仅在特定方向上进行(默认设置的相反),而不是通过交换马达引线来实现,可以将以下三个值设置为负数:

  • <axis0>.config.calibration_lockin.vel
  • <axis0>.config.calibration_lockin.accel
  • <axis0>.config.calibration_lockin.ramp_distance

重要提示 如果索引信号工作正常,当ODrive执行索引搜索时,您的电机应该找到相同的旋转位置。 这意味着如果设置了<axis> .config.startup_encoder_index_search,则电机应该旋转并停止在相同位置,以便搜索在重新启动时开始,或者您在重新启动后调用命令:<axis> .requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH。 您可以对此进行测试。 发送reboot()命令,然后在重新启动时转动电机,然后确保每次退出重新索引搜索时电机都旋转到正确的位置。 确保尝试几次此过程。

启动顺序说明

以下是必须为您的编码器配置设置的变量。 您的值将根据您的编码器参数来配置:

  • <axis>.encoder.config.cpr = 8192
  • <axis>.encoder.config.mode = ENCODER_MODE_INCREMENTAL

以下变量的值会影响是否能顺利完成校准。请在您理解了这些变量的含义后再根据您的情况进行更改。

  • <axis>.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT选择您所使用的电机类型(大电流电机、小电流云台电机)。
  • <axis>.encoder.config.calib_range = 0.05 有助于在校准期间放宽编码器计数准确性的检查。
  • <axis>.motor.config.calibration_current = 10.0 如果电机太大或太小需要调整此校准电流的大小。
  • <axis>.motor.config.resistance_calib_max_voltage = 12.0 对于某些电机需要调整。
  • <axis>.controller.config.vel_limit = 50000 如果此值太低电机在校准期间有可能会突然停止。
    这么多变量是不是有点烦恼,值得庆幸的是,有很多热心肠的人会帮助您调试校准问题。
    如果校准成功,则祝贺您。
    现在尝试:
  • <axis>.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
  • <axis>.controller.set_vel_setpoint(3000,0)
    重复设置几个位置值,然后:
  • <axis>.requested_state = AXIS_STATE_IDLE

如果带现在一切顺利的话? 太棒了!现在保存校准,您可以设置以下内容。 请注意,这仅在使用绝对编码器或带索引编码器时才有效。

  • <axis>.encoder.config.pre_calibrated = True
  • <axis>.motor.config.pre_calibrated = True

然后确认一下是否已经为True

  • <axis>.encoder.config.pre_calibrated

如果上条指令返回为True,并且encoder.pre_calibratedTrue,则到目前为止没有错误。 运行以下指令:

  • odrv0.save_configuration()
  • odrv0.reboot()

现在,请查看重启后是否可以运行:

  • <axis>.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH

而且没有出现错误。

如果校准失败会怎样?

编码器问题会以很细微的方式影响您的ODrive。 例如,当您执行以下操作时,ODrive可能无法完成校准:

  • <axis>.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE

又或者,当您执行以下操作时,ODrive完成了校准序列:

  • <axis>.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE

但是,当您执行以下操作进入闭环运行时:

  • <axis>.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL

电机开始像这个视频里这样抖动。

编码器测试

您可以进行一些测试以确保编码器连接正确。
执行以下命令:

  • <axis>.encoder.shadow_count

然后用手转动电动机,看该值是否变化。 另外,请注意该命令:

  • <axis>.encoder.config.cpr = 4000

必须反映电机轴旋转一圈ODrive收到的计数。 因此,请使用shadow_count来测试其是否正常运行。
在某些情况下,您必须使用示波器,否则您可能永远无法正确调试。 如果您有示波器,请尝试以下操作:
连接到AB引脚,看看在转动电机时是否为方波。
连接到编码器索引引脚,看电机旋转一整圈是否有一个脉冲。 有时很难看到。
如果使用编码器的SPI通信接口,则可以测量CLK和CS引脚上的信号。 网上有很多例子说明怎么判断它们是否正常。

编码器噪声

噪声存在在所有电路中,我们只要让噪声不影响我们的系统正常工作即可。就算您用的编码器和别人的一样,别人的工作正常,这并不代表你自己的也没有问题。如果您担心噪音,可能有以下几种来源:

  • 最大的可能,编码器线可能太靠近电机线,请尽可能避免重叠
  • 编码器和ODrive之间的连线太长
  • 使用了排线连接编码器和ODrive

可以使用屏蔽电缆或双绞线,其中每对双绞线的一侧都接地,另一侧则与信号相连,来减少噪声干扰的影响。 如果使用的是SPI,请在CLK上串联一个20-50欧姆的电阻,因为CLK上更容易被噪声干扰。

如果您使用带有索引信号的编码器,则遇到的另一个问题是ODrive的Z输入上的噪声。 此问题的症状如下:

  • 当执行编码器校准时很难成功。

  • 执行完 odrv0.save_configuration()odrv0.reboot()后出现一些奇怪的现象。

  • 在执行索引搜索时,电机每次搜索完成后停在的位置不一致。

    一个简单的解决方案是在ODrive索引信号输入引脚和GND之间增加一个22nF到47nF的电容。

AS5047/AS5048 编码器

AS5047/AS5048 编码器是基于霍尔效应的磁旋转编码器。

AS5047 有三种独立的信号输出接口: SPI, ABI, PWM
AS5048 有四种独立的信号输出接口: SPI, ABI, I2C, PWM

这两种芯片都带有评估板,可以简化将芯片安装到电机。 如果您使用评估板,则应选择3.3v的设置,并将MOSI的高电平设置为3.3v。

如果您遇到校准问题,请确保您的磁体位于电动机旋转轴的中心,一些用户报告说这对校准有很大影响。 还要确保您的磁铁高度在规定范围内。

使用ABI接口

默认的ODrive固件支持通过ABI与AS5047/AS5048连接。 在接线时,将A,B,3.3v,GND连接到ODrive上标记的引脚。首字母缩写词 I 和 Z 表示相同,如果您使用编码器索引信号,则也将它们连接起来。

使用SPI接口

TobinHall编写了一个支持AS5047/AS5048上SPI选项的分支。 使用他的构建来烧录到ODrive,并将MISO,SCK和CS连接到ODrive上标记的引脚。
将MOSI连接至3.3v,连接至ODrive的SCK,CLK,MISO,GND和3.2v引脚。(请注意,对于SPI,首字母缩写SCK和CLK表示同一事物,首字母缩写CSn和CS表示同一事物)

将以下命令添加到您的校准/启动程序中:

  • <axis>.encoder.config.abs_spi_cs_gpio_pin = 4 或您选择的其它GPIO
  • <axis>.encoder.config.mode = 257
  • <odrv>.axis0.encoder.config.cpr = 2**14

如果您有任何问题或疑问,欢迎您加入ODrive社区或QQ群 851421965 进行交流。

发布了16 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/abf1234444/article/details/103365184