ODrive应用 #1 ODrive入门指南

ODrive 入门指南

硬件需求

需要准备以下硬件:

  • 一个或者两个 无刷马达。但是使用一个马达加上一个编码器也可以开始测试。

  • 一个或者两个编码器

  • 一个功率电阻。推荐使用50w以上的功率电阻连接到 ODrive AUX 端口。
    怎么判断我是否需要功率电阻? 应该选择多大功率的功率电阻?
    如果没有制动电阻,则ODrive会在减速期间将多余的功率泵回电源,以达到所需的减速扭矩。如果供电电源没有消耗掉该电源(如果不是电池供电则不会消耗),总线电压将不可避免地升高。这有可能造成开关电源被损坏。当总线电压过高时,ODrive的过电压保护将会触发,电机在惯性下自由旋转直到停止。这种情况可能是问题,也可能不是问题,根据你的具体应用而定。

    功率电阻的功率选择取决于你的电机设置和电机减速时产生的峰值功率或者平均减速功率。

    为了安全起见,需要考虑电机的转速和电机所能承受的电流。

    当以最大速度和最大电机电流制动时,功率电阻器中消耗的功率可以计算为: P_brake = V_emf * I_motor 其中 V_emf = motor_rpm / motor_kv

  • 一个供电电源(24V ODrive 需要12V-24V,48V ODrive 需要12V-48V), 使用电池也是可以的。可参考电源选择指南来选择合适的电源。
    怎么区分我的 ODrive 是24V版本还是48V版本?
    凡是2018年7月之后生产的 ODrive 都有明确的丝印标识表明板子的电压版本。如果之前的没有丝印标志的可以通过ODrive上的8个灰色圆柱电容区分。 如果是470uF,则说明您使用的是24V版本; 如果是120uF,则说明您使用的是48V版本。

ODrive 接线

确保编码器和电机之间的机械连接良好,接触不良会导致灾难性的振荡或失控

所有非电源 I/O 均为3.3V输出,输入耐压5V。

电机接线

  • 将电机线连接到ODrive螺钉端子中。 不建议使用鳄鱼夹之类的夹式连接器,因为这会引起相电阻/电感测量问题。

编码器接线

将编码器连接到 J4 端子。A,B相是必需的,Z(索引脉冲)是可选的。 A,B和Z线有3.3k上拉电阻,用于开漏编码器输出。对于具有弱驱动电流(<4mA)的单端推挽信号,您可能需要去掉 ODrive 上的上拉电阻。
ODrive all hooked up

安全的接通电源

把安全放在首位。在给ODrive通电之前考虑一下一旦上电电机立即开始旋转会发生什么情况。

  • 与某些设备不同,ODrive不能通过USB端口供电,因此即使仅使用USB与之通信也需要24/48伏电源输入。USB线可以在通电之前或之后连接都可以。
  • 要接通ODrive的电源,请将电源连接到DC端子。 注意正负极。 连接时产生的小火花是正常的。 这是由电容充电引起的。

下载和安装调试软件odrivetool

本指南中的多处引用了名为 odrivetool的调试软件,因此您应该首先安装该实用程序。

Windows

  1. 安装 Python 3 我们推荐Anaconda发行版,因为它包含许多有用的科学工具,但是您也可以安装独立的python。
  • Anaconda发行版: 从这里下载安装包。运行下载的文件并按照引导进行安装。
  • 独立的 Python: 从这里下载安装包。运行下载的文件并按照引导进行安装。
  • 如果您的电脑已经安装了Python 2 现在又安装了 Python 3,请使用 C:\Users\YOUR_USERNAME\AppData\Local\Programs\Python\Python36-32\Scripts\pip替换掉 Python 2 中的 pip。
  1. 启动命令提示符。
  • Anaconda发行版: 在开始菜单下输入 Anaconda Prompt Enter
  • 独立的 Python: 在开始菜单下输入 cmd Enter
  1. 输入 pip install odrive Enter,安装odrivetool
  2. 将USB线插入ODrive上的microUSB连接器,然后将其连接到PC。
  3. 使用 Zadig 将 ODrive 的驱动程序配置为 libusb-win32。
  • 从选项菜单中选择“列出所有设备”,然后选择“ ODrive 3.x本机接口(接口2)”。 在设备列表中选择该选项,然后从目标驱动程序列表中选择“ libusb-win32”,然后点击“安装驱动程序”按钮。

OSX

我们将在 Terminal 中运行以下命令进行安装。

  1. 首先安装 homebrew 如果已经安装过可以略过:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. 安装 python:
brew install python
  1. 如果提示出错: Error: python 2.7.14_2 is already installed 通过以下命令进行升级:
brew upgrade python
  1. odrive tools 需要 libusb 和 ODrive 进行通讯:
brew install libusb
  1. 使用 pip 进行 odrive tools 的安装:
pip3 install odrive

问题排除

  1. 权限错误: 只需要在命令前加上sudo即可
sudo pip3 install odrive
  1. 依赖项错误: 如果安装过程中出现 (Ex. “No module…” or “module_name not found”)
sudo pip3 install module_name

再次尝试第5步

Linux

  1. 安装 Python 3. (Ubuntu, sudo apt install python3 python3-pip)
  2. 在命令行终端中输入sudo pip3 install odrive Enter 进行 ODrive tools 的安装。

固件

ODrive v3.5 和更高版本

您的板子内部已经烧录好了固件。如果运行遇到什么问题,可以尝试使用DFU重新烧录固件,参考DFU固件烧录

ODrive v3.4 和更低版本

您的板子内部没有预先烧录固件。 请自行使用 ST Link 进行固件烧录,参考ST Link固件烧录

运行 odrivetool

通过输入odrivetool Enter,启动odrivetool。 连接 ODrive 然后等待 odrivetool 发现它。 然后就可通过指令和 ODrive 交互。例如可以输入 odrv0.vbus_voltage Enter 来查看当前供电电压。
它看起来应该像这样:

ODrive control utility v0.4.0
Please connect your ODrive.
Type help() for help.

Connected to ODrive 306A396A3235 as odrv0
In [1]: odrv0.vbus_voltage
Out[1]: 11.97055721282959

您正在查看的工具是功能齐全的Python命令提示符,因此您可以键入任何有效的python代码。

更多有关odrivetool的介绍可以参考 odrivetool入门指南

配置电机 M0

请仔细阅读本节,否则可能会造成损坏
针对平衡车轮毂电机可以参考 平衡车轮毂电机和遥控器设置指南

1. 设置极限:

怎样设置极限?
上一个步骤我们已经启动了 odrivetool。您可以这这里直接输入变量名称进行设置。
例如,设置M0的极限电流为10A您可以输入: odrv0.axis0.motor.config.current_lim = 10 Enter
电机电流极限
odrv0.axis0.motor.config.current_lim [A]
出于安全原因,默认电流极限设置为10A。 这是相当小的,但是对于确保驱动器稳定是有好处的。 配置完ODrive后,可以将其增加到60A以提高性能。 请注意,高于60A时,必须更改电流放大器的增益。 您可以通过请求不同的电流范围来实现。 例如,对于M0上的90A:odrv0.axis0.motor.config.requested_current_range = 90 [A],然后保存配置并重新启动,因为仅在启动期间将增益写入DRV(MOSFET驱动器)。

注意: 电机电流和从电源汲取的电流通常不相同。 您不应该查看电源电流以了解电动机电流的状况。
为什么电机电流和电源电流不同呢?
有时,电动机中的电流仅连接到电源中的电流,而有时它只是从一个相中循环出来,然后又回到另一相中。 这就是调制幅度(有时人们将其称为占空比,但这有点令人困惑,因为我们使用SVM而不是直接PWM)。 当调制幅度为0时,在电机各相上看到的平均电压为0,并且电机电流永远不会连接到电源。 当幅度为100%时,它始终处于连接状态;而当幅度为50%时,它处于连接状态的一半,而仅在电动机中循环的时间为一半。
对调制幅度的最大影响是转速。 还有其他一些较小的因素,但总的来说:如果电机仍然静止,则电动机上的50A电流由电源上的5A电流并非没有道理。 当电动机旋转至接近最高转速时,电源电流和电机电流将彼此接近。
电机转速极限
odrv0.axis0.controller.config.vel_limit [counts/s]。
电机将被限制为该速度。 同样,默认值很慢。

校准电流
您可以将odrv0.axis0.motor.config.calibration_current [A] 更改为您感到合适的最大值,以便在电机静止时连续通过电机运行。 如果您使用的是小型电机(即15A额定电流),则可能需要将calibration_current减小到小于默认值。

2. 设置其他硬件参数

odrv0.config.brake_resistance [Ohm]
这是制动电阻器的电阻。 如果您不使用它,则可以将其设置为0。 请注意,您的接线和螺钉端子中可能会有一些额外的电阻,因此,如果在制动时遇到问题,则可能需要将此参数在制动电阻阻值的基础上增加约0.05欧姆。

odrv0.axis0.motor.config.pole_pairs
这是转子中的磁极数除以二。 您可以简单地数一下转子中的永磁体(如果可以看到的话)的数量。
注意: 不是定子中的线圈的数量
如果看不到它们,请尝试用手拿着一块磁铁在转子上滑动,并计算其停止的次数。 这将是磁极对数。 如果使用磁性金属片而非磁铁,则会得到磁极数

odrv0.axis0.motor.config.motor_type
这是使用的电机类型。 当前支持两种类型的电机:大电流电机(MOTOR_TYPE_HIGH_CURRENT)和云台电机(MOTOR_TYPE_GIMBAL)。
我该选择哪种电机类型
如果您使用的是常规的无刷电机类似这种,您应该设置电机类型为 MOTOR_TYPE_HIGH_CURRENT。对于小电流的云台用无刷电机类似这种 ,您应该设置电机类型为 MOTOR_TYPE_GIMBAL。不要把非小电流云台电机配置为MOTOR_TYPE_GIMBAL ,这样可能会使电机或ODrive过热。
更多细节:
如果100毫安的电流噪声对您来说“很小”,则可以选择MOTOR_TYPE_HIGH_CURRENT
如果100毫安的电流噪声对您来说“很大”,并且您的应用不需要电机快速旋转(Ω* L << R),并且电机的电阻相当大(1 ohm或更大),则可以 选择了MOTOR_TYPE_GIMBAL
如果100毫安的电流噪声对您来说“很大”,并且您的应用需要电机高速旋转,则需要更换ODrive上的电流采样电阻为更大值,使之能采集到相对较低的电流。
注意: 使用云台电机时,current_limcalibration_current实际上是“电压极限”和“校准电压”,因为我们不使用电流反馈。 这意味着如果将其设置为10,则这个参数将被设置为10V

如果使用编码器
odrv0.axis0.encoder.config.cpr: 编码器每转计数 [CPR]
这是每转产生的脉冲数(PPR)值的4倍。 通常,这在编码器的手册中会有说明。

如果不使用编码器

3. 保存配置

您可以将所有带有 .config 的参数保存到ODrive FLASH中,以便ODrive在重启后配置的参数仍然有效。

  • odrv0.save_configuration() Enter.

基于已知问题,强烈建议您在每次保存配置后使用odrv0.reboot()重新启动。

M0 的位置控制

让电机0启动并运行。 电机1的操作步骤完全相同,因此请在axis0的地方替换axis1即可。

  1. 输入 odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE Enter。大约2秒钟后,应听到哔声。 然后,电动机将在一个方向上缓慢旋转几秒钟,然后在另一方向上缓慢旋转。
    这有什么意义?
    内部程序首先测量电机的电气特性(即电机相电阻和相电感),然后测量电机的电气相位与编码器位置之间的偏移量。此视频演示了此过程。
    注意:在启动过程中,必须允许转子旋转而且不能有偏载。 这意味着载荷均匀和较弱的摩擦载荷才行,但是重载或类似弹簧载荷不行。 另请注意,在视频中,电动机在初始化后会旋转,但是在当前软件中,默认行为并非如此
    无法正常工作?
    检查编码器接线,并确保编码器已牢固连接至电机。 检查dump_errors(odrv0) 然后参考故障排除查看具体的错误信息。一旦理解了错误并解决了问题,就可以执行dump_errors(odrv0, True) Enter来清除错误,然后重试即可。

  2. 输入 odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL Enter。此时 ODrive 将保持电机转子的位置。如果用手去扭动电机轴,电机会试图阻止转子被扭动,您可以通过调高odrv0.axis0.motor.config.current_lim,这样电机将能提供更大的扭力去对抗您的旋转。如果电机进入闭环运行后马上开始抖动,或在您用手去扭动电机轴后开始抖动,您需要 降低控制器增益

  3. 向电动机发送新的位置设定值。odrv0.axis0.controller.pos_setpoint = 10000 Enter。单位为编码器计数。

  4. 此时您可能想要更好的调整控制器参数,使系统发挥出更高的性能。

其他控制方式

默认控制模式是绝对编码器位置控制。您可能会希望使用轨迹控制模式,或者您希望使用环形位置控制模式,以此达到持续向一个方向旋转而不需要持续增大位置的设定值。

您也许希望使用速度控制模式(直接设置转速或者使用速度爬升机制使转速以设定加速度达到设定转速).

您也可以直接控制电机电流,电机电流与转矩成比例。

轨迹控制

在位置控制模式下,使用move_to_posmove_incremental函数。 有关详细信息,请参见“用法”部分。
此模式使您可以平滑地使电机从一个位置加速,匀速和减速到另一位置。 使用位置控制时,控制器只是试图尽可能快地到达设定点。 使用轨迹可以使您更灵活地调整反馈增益,以消除干扰,同时保持平稳的运动。
TrapTrajPosVel
在上图中,蓝色是位置,橙色是速度。

参数

<odrv>.<axis>.trap_traj.config.vel_limit = <Float>
<odrv>.<axis>.trap_traj.config.accel_limit = <Float>
<odrv>.<axis>.trap_traj.config.decel_limit = <Float>
<odrv>.<axis>.trap_traj.config.A_per_css = <Float>

vel_limit 最大速度,也表示匀速阶段的转速
accel_limit 最大加速度,以[counts / sec^2]为单位
decel_limit 最大反向加速度,以[counts / sec^2]为单位
A_per_css 此项参数和加减速、电机电流相关。默认为0。此项参数是可选的,可以通过调整此项参数来改善系统的响应。. 请记住,此参数和系统的负载、质量有关。

所有值都应严格为正数(> = 0)。

请记住,您仍然必须像以前一样设置极限值。 我建议您将这些值设置为比计划值稍高(> 10%),以赋予控制器足够的控制权。

<odrv>.<axis>.motor.config.current_lim = <Float>
<odrv>.<axis>.controller.config.vel_limit = <Float>

用法

使用move_to_pos函数移动到绝对位置:

<odrv>.<axis>.controller.move_to_pos(设置的绝对位置)

使用move_incremental函数移动到相对位置。
要相对于当前实际位置设置目标位置,请使用from_goal_point = False
要设置相对于先前目标位置的目标位置,请使用from_goal_point = True

<odrv>.<axis>.controller.move_incremental(pos_increment, from_goal_point)

您也可以使用ascii命令来控制电机的位置。

环形位置控制

要启用环形位置控制,请设置axis.controller.config.setpoints_in_cpr = True

此模式对于连续的增量位置移动很有用。 例如,机器人会无限期滚动,或者挤出机马达或传送带会以受控的增量无限期地移动。
在常规位置模式下,pos_setpoint将增长到非常大的值,并且由于浮点舍入而失去精度。

在这种模式下,控制器将尝试仅在电动机旋转一圈之内跟踪位置。 具体而言,pos_setpoint的范围应为[0,cpr-1],其中cpr是一圈编码器计数值。 如果pos_setpoint增加到该范围之外(例如通过step / dir输入),则会自动将其约束到[0,cpr-1]范围内。注意:在此模式下,将使用encoder.pos_cpr 作为位置位置反馈,而非encoder.pos_estimate

如果尝试以超过cpr/2步的大步幅增加位置,则电机将以相反的方向旋转至相同角度。当输入控制量干扰很大时,也会出现这种情况。 如果您有一个需要处理较大步幅的应用程序,则可以使用虚拟CPR,该虚拟CPR是编码器实际CPR的整数倍。 设置encoder.config.cpr = N * your_enc_cpr,其中N是一些整数。 选择合适的N为您的应用提供合适的位置设置范围。

速度控制

设置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL

现在,您可以使用 axis.controller.vel_setpoint = 5000 [count/s] 控制转速。

速度爬升控制

设置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL

设置速度爬升速率 (绝对加速度): axis.controller.config.vel_ramp_rate = 2000 [counts/s^2]
启动速度爬升模式: axis.controller.vel_ramp_enable = True
现在,您可以使用 axis.controller.vel_ramp_target = 5000 [count/s] 控制转速。

电流控制

设置 axis.controller.config.control_mode = CTRL_MODE_CURRENT_CONTROL
现在,您可以使用axis.controller.current_setpoint = 3 [A] 来控制电机电流。

注意: 在电流控制模式下没有速度限制。 确保您不要使电机过载或超过编码器的最大速度。

看门狗定时器

每个axis都有一个可配置的看门狗定时器,如果与ODrive的控制连接中断,则可以使电机停止。

每个axis都有一个可配置的看门狗超时:axis.config.watchdog_timeout,以秒为单位。 值设置为0禁用看门狗功能。 大于0的值看门狗将启动,如果没有在设置的时间间隔内喂狗,电机将停止。

使用 axis.watchdog_feed() 来为每个axis喂狗。

下一步该干什么?

现在您可以:

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

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

猜你喜欢

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