大家好,又见面了,我是你们的朋友全栈君。
请首先阅读一下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
。 <axis>.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
。<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引脚上的信号。 网上有很多例子说明怎么判断它们是否正常。
噪声存在在所有电路中,我们只要让噪声不影响我们的系统正常工作即可。就算您用的编码器和别人的一样,别人的工作正常,这并不代表你自己的也没有问题。如果您担心噪音,可能有以下几种来源:
可以使用屏蔽电缆或双绞线,其中每对双绞线的一侧都接地,另一侧则与信号相连,来减少噪声干扰的影响。 如果使用的是SPI,请在CLK上串联一个20-50欧姆的电阻,因为CLK上更容易被噪声干扰。
如果您使用带有索引信号的编码器,则遇到的另一个问题是ODrive的Z输入上的噪声。 此问题的症状如下:
odrv0.save_configuration()
和 odrv0.reboot()
后出现一些奇怪的现象。
AS5047/AS5048 编码器是基于霍尔效应的磁旋转编码器。
AS5047 有三种独立的信号输出接口: SPI, ABI, PWM AS5048 有四种独立的信号输出接口: SPI, ABI, I2C, PWM
这两种芯片都带有评估板,可以简化将芯片安装到电机。 如果您使用评估板,则应选择3.3v的设置,并将MOSI的高电平设置为3.3v。
如果您遇到校准问题,请确保您的磁体位于电动机旋转轴的中心,一些用户报告说这对校准有很大影响。 还要确保您的磁铁高度在规定范围内。
默认的ODrive固件支持通过ABI与AS5047/AS5048连接。 在接线时,将A,B,3.3v,GND连接到ODrive上标记的引脚。首字母缩写词 I 和 Z 表示相同,如果您使用编码器索引信号,则也将它们连接起来。
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
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126789.html原文链接:https://javaforall.cn