ODrive实例 #2 电机配置实例(小米9号平衡车轮毂电机)
以下内容将详细介绍使用情况 ODrive 驱动无刷电机的过程,如果您的硬件与本文中使用的相同,配置参数可以根据本文中的配置达到相同的效果。如果硬件使用不同,您需要适当调整个别参数。
文章目录
- ODrive实例 #2 电机配置实例(小米9号平衡车轮毂电机)
- 1. 硬件介绍
- 2. 硬件连接
- 3. 配置参数
-
- 3.1 基本配置
- 3.2 电机配置
- 3.3 霍尔传感器配置
- 3.4 控制器配置
- 3.5 保存配置
- 4. 自动校准
-
- 4.1 校准电机和编码器
- 4.2 保存校准结果
- 5. 上电后控制电机运行过程
1. 硬件介绍
-
ODrive
- 硬件版本:ODrive v3.6 56v电压版本
- 固件版本:fw-v0.5.1
购买链接:淘宝链接
-
小米9号平衡轮毂电机
- 极对数:
- 额定转速:
- 额定电压:
- 额定输出功率:
- 有感反馈:
-
功率耗散电阻(可选)
50W 2R 金壳功率耗散电阻
购买链接:淘宝链接
2. 硬件连接
电机有三条较厚的电机相位线(通常是黄色、蓝色和绿色),霍尔传感器反馈(通常是红色、黄色、蓝色、绿色和黑色)。 您可以将电机的相线连接到任何顺序 ODrive M0 电机接口,因为我们以后还会校准。 连接霍尔反馈线ODrive J4连接器(确保与电机通道号匹配 M如下所示:0):
霍尔反馈线 | J4 连接器 |
---|---|
Red | 5V |
Yellow | A |
Blue | B |
Green | Z |
Black | GND |
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 停止电机并报错,
odrv0.config.dc_bus_overvoltage_trip_level = 56
当电源电压高于 56V 停止电机并报错,
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 = 15
配置电机极对数,我们使用的电机极对数为 15
电机极对数可以通过以下方式获得:
- 查找电机数据手册通常有说明
- 数一数电机永磁体的数量,然后除以 2 是电机的极对数
- 直流电源连接在两条电机线之间,电源电压设定为额定直流母线电压的5% (您也可以将电源设置为电机的额定电流)
- 用手旋转电机,应稍有阻力,否则:
- 如果电机不能转动,请降低施加的电压或电流
- 如果电机产生的电阻过小,请逐渐增加施加的电压或电流
- 用手转动转子,转动停顿的次数是电机的极对数
- 用手旋转电机,应稍有阻力,否则:
odrv0.axis0.motor.config.calibration_current = 10
电机参数校准时配置电流,电机参数校准和电流值使用时,如果设置过小,霍尔偏移校准时电机旋转力不够
odrv0.axis0.motor.config.resistance_calib_max_voltage = 5
配置电机参数校准时的电压,电机相电阻越高,值越高,但如果值过高,电流过大,过流保护错误
odrv0.axis0.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
<>配置所使用的电机类型为大电流电机 odrv0.axis0.motor.config.current_control_bandwidth = 100
配置电机电流控制器带宽,由于轮毂电机与普通的电机相比具有更高的相电阻和相电感,因此电流控制器带宽比普通电机参数要小
odrv0.axis0.motor.config.current_lim = 20
配置电机运行的最大电流限制
odrv0.axis0.motor.config.requested_current_range = 30
配置电机电流采样范围,
3.3 霍尔传感器配置
odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
配置电机编码器类型为霍尔信号输入
odrv0.axis0.encoder.config.cpr = 90
配置编码器分辨率,即电机转动一圈多少个计数值,霍尔反馈对于电机中的每个对极有6种状态,由于我们的电机是15个极对,因此将 cpr 设置为 15 * 6 = 90
odrv0.axis0.encoder.config.bandwidth = 100
设置编码器 PLL 带宽,一般编码器分辨率越高(cpr > 4000个计数/转)此值应该越高,这样有助于减少电机振动,由于霍尔反馈每转仅具有 90 个计数,因此我们希望减少速度跟踪带宽以获得更平滑的转速估计
3.4 控制器配置
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
配置电机控制模式,由于霍尔反馈分辨率较低,位置模式效果不理想,我们设置为转速控制模式
odrv0.axis0.controller.config.vel_limit = 10
配置电机最大转速,单位为 [turn/s],例如:此处我们配置为 10 转/秒 即 600 转/分
odrv0.axis0.controller.config.vel_gain = 0.2
odrv0.axis0.controller.config.vel_integrator_gain = 0.07
配置控制器控制增益,vel_gain 和 vel_integrator_gain 为速度环增益
odrv0.axis0.controller.config.input_mode = INPUT_MODE_VEL_RAMP
将输入模式配置为转速爬升模式,如果不想只用 ODrive 内部的转速爬升可以设置为直接控制模式(INPUT_MODE_PASSTHROUGH)
odrv0.axis0.controller.config.vel_ramp_rate = 10
配置转速爬升速度,单位为 [(turn/s) / s] ,例如:此值设置为10表示当设置电机5转/秒运行时电机由静止加速到 5转/秒这个加速程耗费 0.5 秒
3.5 保存配置
odrv0.save_configuration()
odrv0.reboot()
保存配置参数并重启 ODrive 已使某些配置参数生效
等待 ODrive 重新连接到 odrivetool
4. 自动校准
4.1 电机和编码器校准
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
进行自动检测电机参数,执行这条命令后大约2秒,应听到电机发出哔声
dump_errors(odrv0)
检查错误代码,如果都为 no error 表明一切正常,否则结合错误代码信息对问题分析,当问题解决后输入 dump_errors(odrv0, True)
Enter 对错误代码进行清除,然后重新执行电机参数校准
odrv0.axis0.motor.config.pre_calibrated = True
将电机 pre_calibrated 设置为 True,表示电机已校准下次重新启动后可以直接使用本次校准的结果
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
进行霍尔传感器偏移校准,电机将向一个方向转动几秒钟然后再反方向转动几秒钟
dump_errors(odrv0)
检查错误代码,如果都为 no error 表明一切正常,否则结合错误代码信息对问题分析,当问题解决后输入 dump_errors(odrv0, True)
Enter 对错误代码进行清除,然后重新执行霍尔传感器偏移校准
odrv0.axis0.encoder.config.pre_calibrated = True
将编码器 pre_calibrated 设置为 True,表示编码器已校准下次重新启动后可以直接使用本次校准的结果
4.2 保存校准结果
odrv0.save_configuration()
odrv0.reboot()
将自动检测的电机参数保存并重启
等待 ODrive 重新连接到 odrivetool
5. 上电后控制电机运行流程
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
进入闭环运行模式,此时电机将进入转速闭环模式
odrv0.axis0.controller.input_vel = 4
命令电机已 4 转/秒 转动,如果想反方向转动设置为 -4 即可,也可以设置为小数,如:0.5 转/秒
odrv0.axis0.requested_state = AXIS_STATE_IDLE
如果想释放电机,发送此命令即可让 ODrive 进入待机模式,此时电机可以被自由转动