当前位置:   article > 正文

【ODrive入门指南】ODrive Robotics 软件(源代码)与硬件(含原理图与PCB工程文件) FOC 电机驱动斯坦福大学_odrive代码详解

odrive代码详解

ODrive入门指南 ODrive Robotics 软件(源代码)与硬件(含原理图与PCB工程文件) FOC 电机驱动斯坦福大学


版本说明

ODrive 硬件版本: v3.6-56V

ODrive 硬件内部固件版本: fw-v0.5.1

odrivetool 版本: 0.5.1.post0(pip install odrive==0.5.1.post0)

ODrive Robotics 开源软件(源代码)与硬件(含原理图与PCB工程文件)
ODriver 斯坦福大学 FOC电机驱动
硬件版本V3.6工程文件及以前
适配软件源代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要准备哪些硬件

一个或两个无刷电机。ODrive 可以同时驱动两个无刷电机,但是使用一个无刷电机也可以正常使用。

一个或两个编码器。

一个功率耗散电阻。推荐使用50w以上的功率耗散电阻连接到 ODrive AUX 接口。
怎么判断我是否需要功率耗散电阻? 应该选择多大功率的功率耗散电阻?
如果没有功率耗散电阻,则 ODrive 会在减速期间将多余的功率回充到供电电源,以达到所需的减速扭矩。如果供电电源不能够吸收掉这些能量(一般使用电池供电才可以吸收这些能量),母线电压将不可避免地升高。这有可能造成开关电源被损坏。当总线电压过高时,ODrive 的过压保护也将会触发,过压保护触发后电机将停止输出力矩,电机将在惯性下自由旋转直到停止。
功率电阻的功率选择取决于您对电机的配置和电机减速时产生的峰值功率或者平均减速功率。
为了安全起见,需要考虑电机的转速和电机所能承受的电流。
当以最大速度和最大电机电流制动时,功率耗散电阻中消耗的功率可以计算为: P_brake = V_emf * I_motor 其中 V_emf = motor_rpm / motor_kv。

一个供电电源(24v 版本的 ODrive 需要 12v~24v 的供电电源,56v版本的 ODrive 需要 12v~56v 的供电电源)使用电池供电也是可以的。可参考电源选择指南来选择合适的电源。
怎么区分我的 ODrive 是 24v 版本还是 56v 版本?
凡是2020年8月之后生产的 ODrive 都有明确的丝印标识表明板子的硬件和电压版本,如:v3.6-56v。

ODrive 接线

确保编码器、电机和 ODrive 之间的接线牢固,接触不良会导致电机振荡或失控

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

电机接线

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

编码器接线

将编码器连接到 J4 端子。A,B相是必需的,Z(索引脉冲)是可选的。 ODrive 的 A,B,Z 输入内部集成了 3.3k 上拉电阻,用于开漏输出型编码器的输入。对于具有弱驱动电流(<4mA)的单端推挽信号,您可能需要自行去掉 ODrive 上的上拉电阻(它们分别对应 M0 的丝印 R12、R13、R14 和对应 M1 的丝印 R9、R10、R11)。
请添加图片描述

安全的接通电源

牢记把安全放在首位。在给 ODrive 通电之前考虑一下一旦上电电机立即开始旋转会不会造成什么影响。

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

下载和安装调试软件 odrivetool

odrivetool 是 ODrive 配套的配置和调试软件,请根据您使用的电脑操作系统安装 odrivetool。

Windows

安装 Python 3

下载 Python 3 安装包(下载链接),运行下载的文件并按照引导进行安装即可。
如果您的电脑之前已经安装了 Python 2 现在又安装了 Python 3,请使用 C:\Users\YOUR_USERNAME\AppData\Local\Programs\Python\Python36-32\Scripts\pip 替换掉 Python 2 中的 pip。
启动系统命令终端
在开始菜单下(点击键盘上的windows键)输入 cmd Enter

在打开的命令终端中输入 pip install odrive==0.5.1.post0 Enter,进行 odrivetool v0.5.1 的安装。

将 micro-usb 数据线插入 ODrive 上的 microUSB 端子上,另一头连接到电脑 USB 口。

使用 Zadig(Zadig下载链接)工具将 ODrive 的 USB 驱动程序替换为 libusb-win32。

打开 Zadig 软件,点击菜单栏中的 Options,点击 List All Devices。
请添加图片描述
选择需要替换的通讯端口为 ODrive 3.x Native Interface (Interface 2)。

在这里插入图片描述

选择使用 libusb-win32(vx.x.x.x) 作为替换的驱动,然后点击 Replace Driver 进行替换。

在这里插入图片描述

耐心等待驱动替换完成,关闭 zadig 即可。

在这里插入图片描述

Mac OS

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

首先安装 homebrew 如果已经安装略过即可:
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”
复制
安装 python:
brew install python
复制
如果提示出错: Error: python 2.7.14_2 is already installed 通过以下命令进行升级:
brew upgrade python
复制
odrivetool 需要依赖 libusb 库和 ODrive 进行通讯,所以安装 libusb:
brew install libusb
复制
使用 pip 进行 odrivetool 的安装:
pip3 install odrive
复制
常见问题:

权限错误:只需要在命令前加上 sudo 即可。
sudo pip install odrive==0.5.1.post0
复制
依赖项错误: 如果安装过程中出现 (Ex. “No module…” or “module_name not found”)
sudo pip3 install module_name
复制
然后再次尝试第5步。

Linux

安装 Python 3。(如在Ubuntu系统,在命令终端中输入 sudo apt install python3 python3-pip Enter)。
如果安装过程中出现 (Ex. “E:Package ‘python3-pip’ has no installation candidate”),在命令终端中输入 sudo apt update Enter。

安装 odrivetool。在命令终端中输入 sudo pip3 install odrive==0.5.1.post0 Enter。

将 ~/.local/bin 添加到系统环境变量中(如在Ubuntu系统,在命令终端中输入 sudo gedit ~/.bashrc Enter,在文件末尾另起一行添加 export PATH=$PATH:~/.local/bin 然后保存文件,关闭并重新打开终端使新的环境变量生效)。

运行 odrivetool

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

ODrive control utility v0.5.1.post0
Website: https://odriverobotics.com/
Docs: https://docs.odriverobotics.com/
Forums: https://discourse.odriverobotics.com/
Discord: https://discord.gg/k3ZZ3mS
Github: https://github.com/madcowswe/ODrive/

Please connect your ODrive.
You can also type help() or quit().

Connected to ODrive 208136905753 as odrv0
In [1]: odrv0.vbus_voltage
Out[1]: 35.8963623046875
复制
常见问题:

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

配置电机 M0

仔细阅读本节内容,否则有可能弄坏一些东西

设置一些限制值

怎样设置限制值?
上一个步骤我们已经启动了 odrivetool。您可以直接输入变量名称进行设置。
例如:设置M0的限制电流为10A您可以输入 odrv0.axis0.motor.config.current_lim = 10 Enter

电机电流限制
odrv0.axis0.motor.config.current_lim 单位为 [A]
出于安全考虑,ODrive固件内部默认电流限制设置为10A。 这是相当小的,但是对于初次调试驱动器是有好处的。 配置完 ODrive 后,可以将其增加到60A以提高性能。 请注意:重新设置电流限制值后需要重新设置电流采样范围(odrv0.axis0.motor.config.requested_current_range)。 例如:配置 M0上的电流采样范围为 90A:odrv0.axis0.motor.config.requested_current_range = 90 Enter ,然后保存配置并重新启动 ODrive 以生效,因为 ODrive 仅在启动时才会将电流采样运放增益写入DRV(MOSFET 驱动器)。

注意: 电机电流和从电源汲取的电流通常不相同。 您不应该查看电源电流以了解电机电流的状况。为什么电机电流和电源电流不同呢?详情请参考 为什么无刷电机电流和电源电流不同。

电机校准电流限制值
您可以将odrv0.axis0.motor.config.calibration_current更改为您感到合适的值,即在电机校准时连续流过电机的电流大小。 如果您使用的是小功率电机(即15A额定电流),则可能需要将此值适当调小。

电机转速限制值
odrv0.axis0.controller.config.vel_limit 单位为 [turn/s]。
电机将被限制为该转速,电机转速超过此值将报错。 同样,默认值很低,需要您根据您的应用调整到合适大小。

设置相关硬件参数

odrv0.config.brake_resistance
这是功率耗散电阻的电阻值,单位为 [Ohm]。 如果您不使用它,则可以将其设置为0。 请注意,您的接线和螺钉端子中可能会有一些额外的电阻,因此,如果使用时遇到问题,则可能需要将此参数在功率耗散电阻阻值的基础上增加约0.05欧姆。
odrv0.axis0.motor.config.pole_pairs
这是永磁电机中的磁极对数(磁钢个数除以2)。 如果可以看到的磁钢您可以简单地数一下数量然后除以2。注意: 不是定子中的线圈的数量
如果看不到它们,请尝试用手拿着一块磁铁在转子上滑动,并计算其停顿的次数,这将是 磁极对数。 如果使用磁性金属片而非磁铁,则会得到 磁极数。
还有一种方法是,使用有电流限制功能的电源,将输出电流限制为2A,将正负极接到无刷电机三根线中的任意两根,然后用手转动电机轴一圈,感受停顿的次数,停顿的次数即为磁极对数。如果用手转动时感受不到停顿或者停顿不明显,请适当调高电源输出电流,如果用手转动比较困难则适当调低电源输出电流。
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_lim和calibration_current实际上是“电压极限”和“校准电压”,因为我们不使用电流反馈。 这意味着如果将其设置为10,则这个参数将被设置为10V。

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

如果您希望以无传感器模式运行,请参考 设置无传感器模式运行。
如果您使用霍尔传感器反馈, 请参考 平衡车轮毂电机和遥控器设置指南 。

保存配置

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

odrv0.save_configuration() Enter

对电机 M0 进行位置控制

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

输入 odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE Enter。大约2秒钟后,应听到电机发出哔声。 然后电机将在一个方向上缓慢旋转几秒钟,然后在另一方向上缓慢旋转几秒钟。
这个过程是在做什么?
ODrive 首先测量电机的电气特性(即电机相电阻和相电感),然后进行编码器偏移校准。此视频演示了此过程。
注意:在启动过程中,必须允许转子旋转而且不能有偏载。 这意味着载荷均匀和较弱的摩擦载荷才行,重载或类似弹簧载荷不行。
无法正常工作?
检查编码器接线,并确保编码器已牢固连接至 ODrive。参考故障排除查看具体的错误信息。一旦理解了错误并解决了问题,就可以执行 odrv0.axis0.error = 0 Enter 来清除 M0 上的错误,然后重试即可。
输入 odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL Enter。此时 ODrive 将保持电机转子的位置。如果用手去扭动电机轴,电机会试图阻止转子被扭动,您可以调高odrv0.axis0.motor.config.current_lim,这样电机将能提供更大的扭力去对抗您的旋转。如果电机进入闭环运行后开始抖动,或在您用手去扭动电机轴后开始抖动,您需要降低控制器增益。
向电机发送新的位置指令。odrv0.axis0.controller.input_pos = 10 Enter。单位为 [转],可以为小数,如 input_pos = 0.5,则电机正向转动到180°机械角度。
至此您可能想要更好的调整控制器控制参数,使系统发挥出更高的性能,请参考调整控制器参数。

其它控制方式

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

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

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

[平滑位置控制](#7.1 平滑位置控制)
[轨迹控制](#7.2 轨迹控制)
[环形位置控制](#7.3 环形位置控制)
[转速控制模式](#7.4 转速控制模式)
[转速爬升控制模式](#7.5 转速爬升控制模式)
[转矩控制模式](#7.6 转矩控制模式)

平滑位置控制

当使用直接位置控制时由于输入的位置值直接赋予到 ODrive 中,所以运转会不够平顺。即使使用外部控制器生成好的轨迹位置,当外部控制器以一定频率向 ODrive 发送位置指令时某些状态下还是会不够平滑。这时候使用平滑位置控制模式会是不错的选择,推荐将输入滤波带宽设置为位置指令发送频率的一半。

您可以配置 ODrive 的平滑位置控制模式中的二阶滤波参数。

配置滤波带宽:axis.controller.config.input_filter_bandwidth = 2.0 [1/s]

配置平滑位置控制模式生效:axis.controller.config.input_mode = INPUT_MODE_POS_FILTER

现在您可以继续使用指令 axis.controller.input_pos = 1 [turns],来平滑的进行位置控制了。

在这里插入图片描述

上图为由位置1000到0输入的阶跃响应,滤波器带宽为1.0 [/ sec]。

轨迹控制

此模式使您可以平滑地使电机旋转,从一个位置加速,匀速和减速到另一位置。 使用位置控制时,控制器只是试图尽可能快地到达设定点。 使用轨迹控制模式可以使您更灵活地调整反馈增益,以消除干扰,同时保持平稳的运动。

在这里插入图片描述
在这里插入图片描述

上图中蓝色曲线表示位置,橙色曲线表示转速。

相关参数

..trap_traj.config.vel_limit =
..trap_traj.config.accel_limit =
..trap_traj.config.decel_limit =
..controller.config.inertia =
复制
vel_limit 最大速度,即上图中匀速阶段的转速
accel_limit 最大加速度,以 [turns/ sec^2] 为单位
decel_limit 最大反向加速度,以 [turns/ sec^2] 为单位
controller.config.inertia 负载惯量大小,此项和电机负载转矩和加速度相关,默认为 0。设置为 0 即忽略此项影响,但是如果将此项调整到合适的值可以改善系统的响应速度,请注意:此项和系统负载相关。

上述四个参数值都应为正数(>= 0)。

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

..motor.config.current_lim =
..controller.config.vel_limit =
复制

如何使用轨迹控制模式

当您配置好轨迹控制的相关参数后,并且当前为位置控制的前提下,只需要将输入模式改为轨迹控制输入即可,如下:

..controller.config.input_mode = INPUT_MODE_TRAP_TRAJ
复制
然后直接发送位置指令即可:

..controller.input_pos =
复制
您还可以使用move_incremental函数来让电机转动到相对位置。
要相对于当前实际位置设置目标位置,请设置参数from_goal_point = False。
要设置相对于先前目标位置的目标位置,请设置参数from_goal_point = True。

..controller.move_incremental(pos_increment, from_goal_point)
复制

环形位置控制

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

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

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

如果尝试以超过turn/2步的大步幅增加位置,则电机将以相反的方向旋转至相同角度。当输入控制量干扰很大时,也会出现这种情况。 如果您有一个需要处理较大步幅的应用,则可以通过设置 controller.config.circular_setpoints_range = N 来自己决定想要约束的环形范围值。

转速控制模式

设置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL
现在您就可以使用 axis.controller.vel_setpoint = 5000 [turn/s] 来控制转速了。

转速爬升控制模式

设置 axis.controller.config.control_mode = CTRL_MODE_VELOCITY_CONTROL
设置转速爬升速度 (加速度): axis.controller.config.vel_ramp_rate = 0.5 [turn/s^2]
配置转速爬升模式生效: axis.controller.config.input_mode = INPUT_MODE_VEL_RAMP
现在您就可以通过 axis.controller.input_vel = 1 [turn/s] 来设置想要爬升到的转速了。

转矩控制模式

设置 axis.controller.config.control_mode = CONTROL_MODE_TORQUE_CONTROL
现在您就可以通过 axis.controller.input_torque = 0.1 [Nm] 来设置想要电机输出的扭矩了。
注意: 如果电机转速超过您设置的 vel_limit ,电机输出的力矩将会减小。 您可以设置 axis.controller.enable_current_mode_vel_limit = False 来禁止力矩减小。

看门狗定时器

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

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

您可以使用 axis.watchdog_feed() 来为每个 axis 手动喂狗。

下一步该干什么?

接下来您可以:

通过调整控制器参数释放ODrive的全部潜能。
了解更多参数和指令,来更好的配置ODrive。
通过自己的程序控制ODrive或通过其输入接口之一将其连接到现有系统。
了解如何改善启动过程,例如绕过每次重启后编码器校准。

原文链接:https://javaforall.cn。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/319917
推荐阅读
相关标签
  

闽ICP备14008679号