大家好,又见面了,我是你们的朋友全栈君。
编码器
支持的编码器
请首先阅读一下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_index
为True
。 - 执行
<axis>.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
。这将使电机朝一个方向旋转,直到找到编码器索引。 - 按照无索引信号的编码器校准说明进行操作。
- 设置
<axis>.encoder.config.pre_calibrated
为True
以使能索引脉冲。 - 如果您想在启动时搜索索引信号,请设置
<axis>.config.startup_encoder_index_search
为True
。- 如果您希望手动进行操作,请在每次启动ODrive后运行
<axis>.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
。
- 如果您希望手动进行操作,请在每次启动ODrive后运行
- 如果您希望在启动时尽量的快,请设置
<axis>.motor.config.pre_calibrated
为True
这样就不需要在每次启动时重新测量电机参数。 - 执行
<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_calibrated
为True
,则到目前为止没有错误。 运行以下指令:
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 进行交流。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126789.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...