ODrive实例 #1 电机配置实例(4250-520KV + TLE5012B-E1000)
ODrive干货 #4 电机配置实例(4250-520KV + TLE5012B-E1000)
以下内容将详细介绍使用 ODrive 驱动无刷电机的过程,如果您的硬件和本文中所使用的一样的话,配置参数按照本文中的配置即可达到同样的效果,如果硬件使用有所不同,个别参数需要您适当调整。
文章目录
- ODrive干货 #4 电机配置实例(4250-520KV + TLE5012B-E1000)
- 1. 硬件介绍
- 2. 硬件连接
- 3. 配置参数
- 3.1 基本配置
- 3.2 电机配置
- 3.3 编码器配置
- 3.4 控制器配置
- 3.5 梯形加减速配置
- 3.6 保存配置
- 4. 校准工作
- 4.1 校准电机
- 4.2 编码器校准
- 4.3 保存校准结果
- 5. 控制电机运行
- 6. 如何避免每次重新启动后手动编码器索引校准、进入闭环控制
1. 硬件介绍
ODrive
- 硬件版本:ODrive v3.6 56v电压版本
- 固件版本:fw-v0.5.1
购买链接:淘宝链接
4250-520KV 外转子无刷电机
- KV(RPM/V): 520
Pole Pairs: 7
- LiPo Cells: 4~6s
- Max Power: 1750W
- Max Amps: 70A/30s
- No Load Current: 1.1A @ 10v
- Internal Resistance: 0.030 ohm
- Dimensions(Dia.xL): 42 x 45mm
- Motor Shaft: 5mm
- Weight: **250g **
购买链接:淘宝链接
编码器
编码器采用英飞凌 TLE5012B-E1000 磁编码器(ABI接口) + 6mm径向磁铁
购买链接:淘宝链接
功率耗散电阻(可选)
50W 2R 黄金壳功率耗散电阻
购买链接:淘宝链接
2. 硬件连接
电机 U V W 三根线接入 ODrive M0 电机接口,线序无要求,如果电机调试完毕后想要反转电机旋转方向可以通过任意对调其中两根线即可。注意:对调后需要重新校准编码器,并保存参数
将编码器插入 ODrive M0 编码器接口,板上丝印 J4 排母处
将功率耗散电阻接入 ODrive AUX 接口,线序无要求
3. 配置参数
进行配置前建议首先执行一遍擦除配置(odrv0.erase_configuration()
Enter)并重启 ODrive 以确保配置恢复为固件默认配置
3.1 基本配置
odrv0.config.brake_resistance = 2.0
配置功率耗散电阻阻值,我们使用的的功率耗散电阻阻值为 2 Ohm,如果不接制动电阻或不想使用功率耗散电阻将此项配置为 0 即可
odrv0.config.dc_bus_undervoltage_trip_level = 8
配置电源电压低压保护阈值,当电源电压低于 8V 时将停止电机并报错,注意:8V 为极限值建议根据自己所使用的供电更精确的配置以更好地保护 ODrive 主板
odrv0.config.dc_bus_overvoltage_trip_level = 56
配置电源电压过压保护阈值,当电源电压高于 56V 时将停止电机并报错,注意:56V 为极限值建议根据自己所使用的供电更精确的配置以更好地保护 ODrive 主板
odrv0.config.dc_max_positive_current = 80
配置母线电流过流保护阈值,当母线电流高于 80A 时将停止电机并报错,配置为无穷大时禁用此保护
odrv0.config.dc_max_negative_current = -5
配置电机制动时在母线上产生的反向电流过流保护阈值,当反向电流高于 5A 时将停止电机并报错,配置为负无穷大时禁用此保护
odrv0.config.max_regen_current = 0
配置制动回充电流值为 0A ,由于使用的开关电源进行供电所以不具备电能回收功能,所以配置为 0,如果您使用的电池供电则可以根据电池组可以承受的回充电流大小进行配置,当母线上反向回充电流高于此值时,高出的电流能量将会通过功率耗散电阻进行消耗
3.2 电机配置
odrv0.axis0.motor.config.pole_pairs = 7
配置电机极对数,我们所使用的电机极对数为 7
可以通过以下方式获取电机极对数:
- 查找电机数据手册,一般会有说明
- 数一数电机永磁体个数,然后除以 2 就是电机极对数
- 在两个电机线之间连接直流电源,电源电压设定为额定直流母线电压的5% (您也可以将电源设置为电机的额定电流)
- 用手旋转电机,应该稍微有一点阻力,否则:
- 如果无法转动电机,请降低施加的电压或电流
- 如果电机产生的阻力过小,请逐渐增加施加的电压或电流
- 用手转动转子一圈,其中转动停顿的次数为该电机的极对数
- 用手旋转电机,应该稍微有一点阻力,否则:
odrv0.axis0.motor.config.calibration_current = 10
配置电机参数校准时的电流,此电流值在进行电机参数校准和编码器偏移校准时使用,如果设置的过小在进行编码器偏移校准时电机将没有足够的力量旋转
odrv0.axis0.motor.config.resistance_calib_max_voltage = 2
配置电机参数校准时的电压,当电机的相电阻越高此值应该越高,但是如果此值过高会造成电流过大,产生过流保护错误
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
配置所使用的电机类型为大电流电机
odrv0.axis0.motor.config.current_lim = 20
配置电机运行的最大电流限制
odrv0.axis0.motor.config.requested_current_range = 60
配置电机电流采样范围,注意:此值设置后需要重新启动才能生效
3.3 编码器配置
odrv0.axis0.encoder.config.mode = ENCODER_MODE_INCREMENTAL
配置电机编码器类型为增量式编码器
odrv0.axis0.encoder.config.use_index = True
我们使用的编码有索引信号,所以配置为启用索引信号输入
odrv0.axis0.encoder.config.cpr = 16384
配置编码器分辨率,即电机转动一圈多少个计数值,一般编码器手册中会给出一圈多少步,例如我们使用的TLE5012编码器手册中给出的 (4096 steps per full rotation),我们只需要将 4096 * 4 就是我们这里需要的每圈计数值
odrv0.axis0.encoder.config.bandwidth = 3000
设置编码器 PLL 带宽,一般对于高分辨率编码器 (> 4000个计数/转) 此值应该越高,这样有助于减少电机振动
odrv0.axis0.config.calibration_lockin.current = 10
odrv0.axis0.config.calibration_lockin.ramp_time = 0.4
odrv0.axis0.config.calibration_lockin.ramp_distance = 3.1415927410125732
odrv0.axis0.config.calibration_lockin.accel = 20
odrv0.axis0.config.calibration_lockin.vel = 40
配置电机进行编码器索引校准时电机开环转动的相关参数
- current 开环运行时的电流,单位为 [A],根据负载调整,以电机能够正常转动为准
- ramp_time 电流爬升时间,表示电流从零爬升到设定的 current 值所需要的时间
- ramp_distance 电流爬升时电角度转动距离,单位为 [rad],配合 ramp_time 参数来缓慢锁定转子相位,可以通过调整 ramp_time、ramp_distance 使编码器索引校准启动的更平顺
- accel 转速爬升的加速度,单位为 [rad/s^2]
- vel 编码器索引校准的运行速度,单位为 [rad/s]
3.4 控制器配置
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_POSITION_CONTROL
配置电机控制模式,此处我们设置为位置模式
odrv0.axis0.controller.config.vel_limit = 50
配置电机最大转速,单位为 [turn/s],例如:此处我们配置为 50 转/秒
odrv0.axis0.controller.config.pos_gain = 30
odrv0.axis0.controller.config.vel_gain = 0.06
odrv0.axis0.controller.config.vel_integrator_gain = 0.3
配置控制器控制增益,pos_gain 为位置环增益,vel_gain 和 vel_integrator_gain 为速度环增益
3.5 梯形加减速配置
odrv0.axis0.trap_traj.config.vel_limit = 30
配置梯形轨迹模式下电机匀速时的转速为 30 转/秒
odrv0.axis0.trap_traj.config.accel_limit = 5
配置梯形轨迹模式下电机加速时的加速度,单位为 [turn/s^2],例如:此处我们配置为 5,表示电机从静止加速到 5 转/秒 需要一秒钟的时间
odrv0.axis0.trap_traj.config.decel_limit = 5
配置梯形轨迹模式下电机减速时的加速度,单位为 [turn/s^2],例如:此处我们配置为 5,表示电机从 5 转/秒减速到静止需要一秒钟的时间
odrv0.axis0.controller.config.input_mode = INPUT_MODE_TRAP_TRAJ
将输入模式配置为梯形轨迹模式
3.6 保存配置
odrv0.save_configuration()
odrv0.reboot()
保存配置参数并重启 ODrive 已使某些配置参数生效
等待 ODrive 重新连接到 odrivetool
4. 校准工作
注意:进行参数校准前请确保电机转子能够自由旋转而且不能有偏载,即负载均匀和较弱的摩擦负载才行,重载或类似弹簧载荷不行,否则将影响参数自动校准
4.1 校准电机
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
进行电机参数校准,校准过程将测量电机相电阻、电机相电感,并根据相电阻相电感自动生成电流环 PI 增益,当听到电机发出 ‘哔’ 声后表示电机参数测量操作已完成
dump_errors(odrv0)
列出状态信息,如果返回状态没有错误则电机校准OK,可以继续进行下面步骤,如果出现错误则要根据错误信息分析原因,然后输入 dump_errors(odrv0, True)
Enter 对错误进行清除后重新尝试
odrv0.axis0.motor.config.pre_calibrated = True
将电机 pre_calibrated 设置为 True,表示电机已校准下次重新启动后可以直接使用本次校准的结果
4.2 编码器校准
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
进行电机编码器索引校准,启动后电机将朝着一个方向开环旋转直到检测到索引信号脉冲时停止,如果想要指定编码器索引校准时电机的转动方向可以通过改变以下三个参数的正负号来实现:
- odrv0.axis0.config.calibration_lockin.ramp_distance = -3.1415927410125732
- odrv0.axis0.config.calibration_lockin.accel = -20
- odrv0.axis0.config.calibration_lockin.vel = -40
注意:以上三个参数正负号应保持一致
dump_errors(odrv0)
列出状态信息,如果返回状态没有错误则编码器索引校准OK,可以继续进行下面步骤,如果出现错误则要根据错误信息分析原因,然后输入 dump_errors(odrv0, True)
Enter 对错误进行清除后重新尝试
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
进行电机编码器偏移校准,启动后电机将朝着一个方向开环旋转然后反方向旋转然后停止,开环旋转时的电流大小为 odrv0.axis0.motor.config.calibration_current
dump_errors(odrv0)
列出状态信息,当得到上述返回状态没有错误则表明编码器偏移校准OK,可以继续进行下面步骤,如果出现错误则要根据错误信息分析原因,然后输入 dump_errors(odrv0, True)
Enter 对错误进行清除后重新尝试
odrv0.axis0.encoder.config.pre_calibrated = True
将编码器 pre_calibrated 设置为 True,表示编码器已校准下次重新启动后可以直接使用本次校准的结果,注意:由于我们使用的并非绝对值编码器而是增量编码器,所以每次重新启动后需要进行编码器索引校准,如果您使用的编码器没有索引信号 (只有 AB) 则每次重新启动后需要进行编码器偏移校准
4.3 保存校准结果
odrv0.save_configuration()
odrv0.reboot()
将自动检测的电机参数保存并重启
等待 ODrive 重新连接到 odrivetool
5. 控制电机运行
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
重新启动后进行编码器索引校准。注意:由于我们使用的并非绝对值编码器而是增量编码器,所以每次重新启动后需要进行编码器索引校准,如果您使用的编码器没有索引信号 (只有 AB) 则每次重新启动后需要进行编码器偏移校准
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
进入闭环运行模式,此时电机将维持在当前位置,如果电机产生震动则说明控制增益设置的不合适需要适当调低,当尝试用手转动电机轴时如果电机反应很迟钝反作用力很弱则说明需要适当调高控制增益,参考 [3.4 控制器配置](#3.4 控制器配置)
odrv0.axis0.controller.input_pos = 50
控制电机运行到 50 圈位置,此过程电机会经历加速、匀速、减速三个过程,最终停在我们命令它移动到的位置。如果想反方向转动,位置值改为负数即可,此值也可以为小数,如:input_pos = 0.5,则电机正向转动到180°机械角度
odrv0.axis0.requested_state = AXIS_STATE_IDLE
如果想释放电机,发送此命令即可让 ODrive 进入待机模式,此时电机可以被自由转动
6. 如何避免每次重新启动后手动编码器索引校准、进入闭环控制
每次重新启动后必须要进行编码器索引校准,然后进入闭环控制后才能向电机发送运行指令,这两个步骤可以通过配置让 ODrive 自动替我们完成
odrv0.axis0.config.startup_encoder_index_search = True
odrv0.axis0.config.startup_closed_loop_control = True
odrv0.save_configuration()
配置 ODrive 启动后自动执行的操作,编码器索引校准、进入闭环控制模式,然后保存配置,这样每次重新启动后电机自动进入闭环运行模式,我们只需要发送位置控制指令即可
如果您有任何问题或疑问,欢迎您加入ODrive社区或QQ群 851421965 进行交流
ODrive实例 #1 电机配置实例(4250-520KV + TLE5012B-E1000)相关推荐
- ODrive实例 #2 电机配置实例(小米9号平衡车轮毂电机)
ODrive实例 #2 电机配置实例(小米9号平衡车轮毂电机) 以下内容将详细介绍使用 ODrive 驱动无刷电机的过程,如果您的硬件和本文中所使用的一样的话,配置参数按照本文中的配置即可达到同样的效 ...
- 华为[ENSP]ACL配置实例(访问控制列表配置实例)
ACL配置实验一(高级ACL)(简单)的拓扑图如下: 一.配置PC1.PC2和Server 二.配置Router(运用高级ACL配置) 相关命令解析: [Router]acl 3000(进入高级A ...
- php配置实例,php mailto配置实例
本节内容: php mail to的配置方法. 1,配置文件 [mail function] ; For Win32 only. SMTP = mail3.jbxue.com smtp_port = ...
- 中兴交换机stp mstp 配置实例 原理
一:stp原理: stp原理非常简单 就是在网桥之间传输特殊消息(BPDU,配置消息),包换足够的信息以后做以下的工作: 1.从网络中的所有网桥中,选出根网桥(root) 2.计算本网桥到根网桥的最短 ...
- log4j2配置实例[按小时记录日志文件]
log4j2.xml文件配置实例:<?xml version="1.0" encoding="UTF-8"?> <configuration ...
- 地址设置nginx负载均衡_nginx负载均衡配置实例
什么是负载均衡? 负载均衡主要通过专门的硬件设备或者通过软件算法实现.通过硬件设备实现的负载均衡效果好.效率高.性能稳定,但是成本比较高.通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性. ...
- 多 LDAP 目录服务器的 FileNet P8 系统介绍和配置实例
摘抄笔记:http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1312multipldap/ 多 LDAP 目录服务器的 ...
- proftpd的安装配置实例
为什么80%的码农都做不了架构师?>>> 一个proftpd的安装配置实例. 目的: 安装配置一个proftpd,达到以下要求 1 不允许匿名访问. 2 开放一个帐号 ...
- Cisco pix515配置实例
一.引言 硬件防火墙的应用,现在是越来越多,产品也很丰富.一般国产的防火墙多带有中文的说明和一些相应的配置实例,但国外的产品几乎都没有中文的说明书,这对一个初学者来说,尤其是中国的用户,是很不方便的, ...
最新文章
- 批量关闭公众号推送_微信推出“一键拒收”长期未读公众号推送功能
- Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”
- CHM综述-建立因果关系,合成菌群在植物菌群研究中的机会
- Http访问代理使用
- 在linux安装mysql重启提示You must SET PASSWORD before executing this statement的解决方法
- JAVA框架之Hibernate【配置文件详解】
- Winform中实现右下角Popuo弹窗提醒效果(附代码下载)
- avogadro_Avogadro
- 相册权限_手机相册太乱?1分钟教你快速管理自己的照片,非常好用!
- Head First设计模式读书笔记六 第七章上 适配器模式
- flex 颜色值uint与16进制的转换
- POJ3614 Sunscreen【贪心】
- linux 内核 内存管理 bootmem alloctor 的初始化
- 小程序 省市区地址选择器
- 北京致芯科技STM32F107VC 芯片解密 代烧录
- 每日一问 --信源编码的过程?
- android常用单词,Android的英语单词记忆软件系统
- python车牌识别系统抬杆_车牌识别系统识别到道闸不抬杆是什么问题?
- wu-database-lazy-starter(懒人数据库操作-核心增量式更新)
- 浅析M-lag技术(后附华为交换机配置命令)
热门文章
- Jetson嵌入式系列模型部署-3
- 老贾笔记--轻轻松松oracle之logmnr篇[吃顿饭的功夫学恢复误删除(delete)的数据]
- 通过singlefile把网页保存到本地
- 【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现
- c语言输出十六进制数乱码,输出乱码
- IDEA原先有项目怎么再导入maven项目
- 两位数码管秒表c语言,单片机C语言编程实现双数码管可调秒表
- XDOJ综合题 数字分解排序
- Implement strStr() -- LeetCode
- 一个 npm 包的坎坷“续命”之生