作者:科采通
关键词:ODrive、BLDC 电机控制、HALL 编码器、Python、速度控制、硬件调试
一、简介:为什么选择 ODrive 控制 BLDC 电机?
ODrive 是一款开源的高性能电调,能够以较低成本实现对无刷直流电机(BLDC)的伺服控制,广泛应用于教育科研、机器人、小型车项目中。
本教程将基于 ODrive v3.6 硬件 + 固件版本 v0.5.2,完整介绍如何用 Python 和 odrivetool
工具控制带有霍尔编码器的轮式 BLDC 电机,支持单轮和双轮控制。
二、实验环境说明
项目 | 配置 |
---|---|
控制器 | ODrive v3.6 24V |
固件版本 | v0.5.2 |
操作系统 | Ubuntu 18.04 |
电机类型 | 带霍尔传感器的直驱轮 |
编码器 | 霍尔编码器(HALL) |
电源 | 稳压 DC 电源(12V~24V) |
产品资料:
ODrive Pro / ODrive S1 | 高性能 DC 电机控制器-科采通
三、Hall 传感器线缆连接
Hall 线色 | ODrive J4 引脚 |
---|---|
Red | 5V |
Yellow | A |
Blue | B |
Green | Z |
Black | GND |
四、软件安装步骤
sudo apt update
sudo apt upgrade
sudo apt install python3 python3-pip
sudo pip3 install --upgrade odrive
echo "PATH=$PATH:~/.local/bin/" >> ~/.bashrc
运行以下命令验证连接是否正常:
odrivetool
确保控制器通电后连接 USB,否则无法识别。
五、固件升级(推荐)
odrivetool dfu
根据提示按 Y
继续,升级成功会提示 Device firmware update successful.
。
六、单轮速度控制配置详解(CONTROL_MODE_VELOCITY_CONTROL)
以下为完整配置代码,适用于极简速度控制场景:
odrv0.axis0.motor.config.pole_pairs = 15
odrv0.axis0.motor.config.resistance_calib_max_voltage = 4
odrv0.axis0.motor.config.requested_current_range = 25
odrv0.axis0.motor.config.current_control_bandwidth = 100
odrv0.axis0.motor.config.torque_constant = 8.27 / 16
odrv0.axis0.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis0.encoder.config.cpr = 90
odrv0.axis0.encoder.config.calib_scan_distance = 150
odrv0.axis0.encoder.config.bandwidth = 100
odrv0.axis0.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
odrv0.axis0.controller.config.pos_gain = 1
odrv0.axis0.controller.config.vel_gain = 0.02 * odrv0.axis0.motor.config.torque_constant * odrv0.axis0.encoder.config.cpr
odrv0.axis0.controller.config.vel_integrator_gain = 0.1 * odrv0.axis0.motor.config.torque_constant * odrv0.axis0.encoder.config.cpr
odrv0.axis0.controller.config.vel_limit = 10
odrv0.config.enable_brake_resistor = True
odrv0.axis0.motor.config.current_lim = 5
odrv0.axis0.motor.config.calibration_current = 5
odrv0.axis0.encoder.config.hall_polarity_calibrated = True
保存并重启:
odrv0.save_configuration()
odrv0.reboot()
七、校准流程(注意电机响声)
-
电机校准:
odrv0.axis0.requested_state = AXIS_STATE_MOTOR_CALIBRATION
-
编码器偏移校准(缓慢旋转前后):
odrv0.axis0.requested_state = AXIS_STATE_ENCODER_OFFSET_CALIBRATION
-
设为预校准并保存:
odrv0.axis0.motor.config.pre_calibrated = True
odrv0.axis0.encoder.config.pre_calibrated = True
odrv0.save_configuration()
odrv0.reboot()
八、运行电机
进入闭环控制状态:
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
设置目标速度(单位:转/秒):
odrv0.axis0.controller.input_vel = 2
停止电机:
odrv0.axis0.requested_state = AXIS_STATE_IDLE
九、常见问题与解决办法
🛑 ENCODER_ERROR_ILLEGAL_HALL_STATE
原因:
霍尔信号受干扰(如信号全为 0)。
解决:
在每个霍尔信号线上并联 22~47nF 的陶瓷或薄膜电容接地,消除干扰。
🔧 常用命令速查表
功能 | 命令 |
---|---|
查看电压 | odrv0.vbus_voltage |
查看编码器值 | odrv0.axis0.encoder.shadow_count |
读取错误信息 | dump_errors(odrv0) |
重新启动设备 | odrv0.reboot() |
恢复出厂设置 | odrv0.erase_configuration() |
🔁 扩展:双轮速度控制配置
若需控制两台电机(如小车),只需将 axis0
的配置复制一份为 axis1
,示例如下:
odrv0.axis1.motor.config.pole_pairs = 15
odrv0.axis1.encoder.config.mode = ENCODER_MODE_HALL
odrv0.axis1.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
# ...略
odrv0.save_configuration()
odrv0.reboot()
# 启动控制
odrv0.axis0.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis1.requested_state = AXIS_STATE_CLOSED_LOOP_CONTROL
odrv0.axis0.controller.input_vel = 2
odrv0.axis1.controller.input_vel = 2
十、总结
本教程通过复现一个完整的 ODrive BLDC 控制流程,帮助你从零开始掌握:
-
ODrive 工具安装
-
BLDC 电机参数配置
-
编码器调试与去噪技巧
-
单/双轮速度闭环控制