黄工无刷电机学习
直播中

张超

7年用户 1295经验值
私信 关注
[问答]

如何利用ODrive去驱动无刷电机

如何利用ODrive去驱动无刷电机?其过程是怎样的?
如何避免每次重新启动后手动编码器索引校准、进入闭环控制?

回帖(1)

张佳婧

2021-8-19 09:23:29
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 启动后自动执行的操作,编码器索引校准、进入闭环控制模式,然后保存配置,这样每次重新启动后电机自动进入闭环运行模式,我们只需要发送位置控制指令即可
举报

更多回帖

发帖
×
20
完善资料,
赚取积分