以下内容将详细介绍使用 ODrive 驱动无刷电机的过程,如果您的硬件和本文中所使用的一样的话,配置参数按照本文中的配置即可达到同样的效果,如果硬件使用有所不同,个别参数需要您适当调整。
ODrive
购买链接:淘宝链接
无刷电机
恒力源 9235-100KV 外转子无刷电机
KV(RPM/V): 100
LiPo Cells: 8~12s
Max Power: 2800W
Max Amps: 57A
No Load Current: 1.0A @ 10v
Internal Resistance: 0.055ohm
Dimensions(Dia.xL): 92 x 39mm
Motor Shaft: 3mm
Prop Shaft: 33mm hole to hole for bolt through style props
Weight: 674g (each)
购买链接:HobbyKing
编码器
编码器采用英飞凌 TLE5012B-E1000 磁编码器(ABI接口) + 6mm径向磁铁
购买链接:淘宝链接
电机 U V W 三根线接入 ODrive M0 电机接口,线序无要求,如果电机调试完毕后想要反转电机旋转方向可以通过任意对调其中两根线即可。注意:对调后需要重新校准编码器,并保存参数
将编码器插入 ODrive M0 编码器接口,板上丝印 J4 排母处
将制动电阻接入 ODrive AUX 接口,线序无要求。提示:制动电阻也可不接
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.axis0.motor.config.pole_pairs = 20
配置电机极对数,我们所使用的电机极对数为 20
可以通过以下方式获取电机极对数:
odrv0.axis0.motor.config.calibration_current = 3
配置校准时的电流,此电流值在进行电机参数校准和编码器偏移校准时使用,如果设置的过小在进行编码器偏移校准时电机将没有足够的力量旋转
odrv0.axis0.motor.config.resistance_calib_max_voltage = 2
配置电机参数校准中自动测量电机相电阻时使用的电压,当电机的相电阻越高此值应该越高,但是如果此值过高会造成电流过大,产生过流保护错误
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
配置所使用的电机类型,电机类型只有大电流电机(MOTOR_TYPE_HIGH_CURRENT),云台电机(MOTOR_TYPE_GIMBAL)
odrv0.axis0.motor.config.current_lim = 20
配置电机运行的最大电流限制
odrv0.axis0.motor.config.requested_current_range = 20
配置电机电流采样范围,注意:此值设置后需要重新启动才能生效
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 = 5
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
配置电机进行编码器索引校准时电机开环转动的相关参数
odrv0.axis0.controller.config.control_mode = CTRL_MODE_POSITION_CONTROL
配置启动后默认电机控制模式,此处我们设置为位置控制模式
odrv0.axis0.controller.config.vel_limit = 16384*40
配置电机最大转速,以编码器计数值为单位 [count/s],例如我们的编码器 cpr = 16384,我们将 vel_limit 设置为 cpr * 40 即最大转速为 40 转/秒 2400 转/分
odrv0.axis0.controller.config.pos_gain = 2
odrv0.axis0.controller.config.vel_gain = 0.0003
odrv0.axis0.controller.config.vel_integrator_gain = 0.005
配置控制器控制增益,pos_gain 为位置环增益,vel_gain 和 vel_integrator_gain 为速度环增益
odrv0.axis0.trap_traj.config.vel_limit = 16384*20
配置梯形轨迹模式下电机匀速时的转速,以编码器计数值为单位 [count/s],例如我们的编码器 cpr = 16384,我们将 vel_limit 设置为 cpr * 20 即最大转速为 20 转/秒 1200 转/分
odrv0.axis0.trap_traj.config.accel_limit = 16384*10
配置梯形轨迹模式下电机加速时的加速度,以编码器计数值为单位 [count/s^2],例如我们的编码器 cpr = 16384,我们将 accel_limit 设置为 cpr * 10 即表示电机从静止加速到 10 转/秒 需要一秒钟的时间
odrv0.axis0.trap_traj.config.decel_limit = 16384*10
配置梯形轨迹模式下电机减速时的加速度,以编码器计数值为单位 [count/s^2],例如我们的编码器 cpr = 16384,我们将 decel_limit 设置为 cpr * 10 即表示电机从 10 转/秒 减速到静止需要一秒钟的时间
odrv0.save_configuration()
odrv0.reboot()
保存配置参数并重启 ODrive 已使某些配置参数生效
等待 ODrive 重新连接到 odrivetool
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
进行电机参数校准,校准过程将测量电机相电阻、电机相电感,并根据相电阻相电感自动生成电流环 PI 增益,当听到电机发出 ‘哔’ 声后表示电机参数测量操作已完成
输入:
dump_errors(odrv0)
返回:
axis0
axis: no error
motor: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error
列出错误状态信息,当得到上述返回则表明电机校准OK可以继续进行下面步骤,如果出现错误则要根据错误代码分析原因,直到错误消失
odrv0.axis0.motor.config.pre_calibrated = True
将电机 pre_calibrated 设置为 True,表示电机已校准下次重新启动后可以直接使用本次校准的结果
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_INDEX_SEARCH
进行电机编码器索引校准,启动后电机将朝着一个方向开环旋转直到检测到索引信号脉冲时停止,如果想要指定编码器索引校准时电机的转动方向可以通过改变以下三个参数的正负号来实现:
参考 [3.3 编码器配置](#3.3 编码器配置)
注意:以上三个参数正负号应保持一致
输入:
dump_errors(odrv0)
返回:
axis0
axis: no error
motor: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error
列出错误状态信息,当得到上述返回则表明校准OK可以继续进行下面步骤,如果出现错误则要根据错误代码分析原因,直到错误消失
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
进行电机编码器偏移校准,启动后电机将朝着一个方向开环旋转然后反方向旋转然后停止,开环旋转时的电流大小为 odrv0.axis0.motor.config.calibration_current 参考 [3.2 电机配置](#3.2 电机配置)
输入:
dump_errors(odrv0)
返回:
axis0
axis: no error
motor: no error
encoder: no error
controller: no error
axis1
axis: no error
motor: no error
encoder: no error
controller: no error
列出错误状态信息,当得到上述返回则表明校准OK可以继续进行下面步骤,如果出现错误则要根据错误代码分析原因,直到错误消失
odrv0.axis0.encoder.config.pre_calibrated = True
将编码器 pre_calibrated 设置为 True,表示编码器已校准下次重新启动后可以直接使用本次校准的结果,注意:由于我们使用的并非绝对值编码器而是增量编码器,所以每次重新启动后需要进行编码器索引校准,如果您使用的编码器没有索引信号 (只有 AB) 则每次重新启动后需要进行编码器偏移校准
odrv0.save_configuration()
odrv0.reboot()
将电机校准、编码器校准和进行的新的配置保存并重启
等待 ODrive 重新连接到 odrivetool
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.move_to_pos(16384*10)
控制电机运行到 16384*10 位置,当电机启动后进入闭环位置运行后电机当前位置为 0,我们的编码器 cpr = 16384 即一圈 16384 个计数,此命令命令电机运行到 16384 * 10 的位置即表示电机转动到 10 圈位置。此过程电机会经历加速、匀速、减速三个过程,参考[3.5 梯形加减速配置](#3.5 梯形加减速配置),最终停在我们命令它移动到的位置。如果想反方向转动,位置值改为负数即可。
odrv0.axis0.requested_state = AXIS_STATE_IDLE
如果想释放电机发送此命令即可让电机自由转动
每次重新启动后必须要进行编码器索引校准,然后切入闭环控制后才能向电机发送运行指令,这两个步骤可以通过配置让 ODrive 自动替我们完成
odrv0.axis0.config.startup_encoder_index_search = True
odrv0.axis0.config.startup_closed_loop_control = True
odrv0.save_configuration()
配置 ODrive 启动后自动执行的操作,编码器索引校准、进入闭环控制模式,然后保存配置。
ODrive 外转子电机+磁编码器 发送正弦曲线位置指令运行测试
如果您有任何问题或疑问,欢迎您加入ODrive社区或QQ群 851421965 进行交流。