01 axis.cpp 和 axis.hpp说明
在 ODrive 项目中,axis.cpp 和 axis.hpp 是 电机轴(Axis)控制的核心实现文件,负责单个电机轴的所有控制逻辑(如FOC算法、PID控制、状态机等)。以下是详细解析:
1. 文件角色
文件
|
类型
|
功能描述
|
axis.hpp
|
头文件
|
声明
Axis
类的数据结构、公有接口和配置参数(供其他模块调用)。
|
axis.cpp
|
源文件
|
实现
Axis
类的具体功能(如实时控制循环、校准、错误处理等)。
|
2. 核心功能概览
(1) axis.hpp 关键内容
cpp
复制
class Axis { public: // 1. 状态机 enum class AxisState { IDLE, CALIBRATION, CLOSED_LOOP_CONTROL, /*...*/ }; AxisState requested_state_; // 2. 电机与控制对象 Motor motor_; Controller controller_; Encoder encoder_; // 3. 配置参数 struct Config_t { float steps_per_mm; // 机械传动参数 float calibration_current; // 校准电流 // ...其他参数 } config_; // 4. 公有接口 bool run_control_loop(); // 主控制循环 bool start_calibration(); // 启动校准 bool set_velocity(float vel);// 设置目标速度 };
(2) axis.cpp 关键实现
cpp
复制
// 1. 主控制循环(实时中断调用) bool Axis::run_control_loop() { // FOC算法执行 motor_.update(current_meas_); controller_.update(); // 状态机处理 switch (requested_state_) { case AxisState::CLOSED_LOOP_CONTROL: // 闭环控制逻辑 break; case AxisState::CALIBRATION: // 校准流程 break; } } // 2. 校准例程 bool Axis::start_calibration() { // 检查电机是否就绪 // 执行编码器、电阻、电感校准 motor_.measure_phase_resistance(); encoder_.calibrate(); }
3. 关键模块交互
mermaid
复制
graph TD A[axis.hpp] -->|声明| B[Axis类] B --> C[motor.hpp] B --> D[controller.hpp] B --> E[encoder.hpp] F[axis.cpp] -->|实现| B F --> G[FOC算法] F --> H[PID控制] F --> I[状态机]
4. 典型工作流程
- 初始化
config_.steps_per_mm)
- 控制循环
run_control_loop()
- 状态管理
5. 代码示例解析
(1) 速度控制接口 (axis.cpp)
cpp
复制
bool Axis::set_velocity(float vel) { if (requested_state_ != AxisState::CLOSED_LOOP_CONTROL) return false; controller_.vel_setpoint_ = vel; // 设置目标速度 return true; }
(2) 错误处理 (axis.hpp)
cpp
复制
enum class Error_t { ERROR_NONE = 0, ERROR_MOTOR_FAILED = 0x01, ERROR_ENCODER_FAILED = 0x02, // ... }; uint32_t error_; // 错误标志位
6. 实际应用场景
- 机器人关节控制
:
每个关节对应一个 Axis 实例,独立管理电机、编码器和控制逻辑。
- CNC机床
:
多轴联动时,通过 axis.cpp 中的接口同步各轴状态。
总结
这两份代码是ODrive的核心控制枢纽:
- axis.hpp
:定义“轴”的蓝图(包含哪些部件、如何配置)。
- axis.cpp
:实现“轴”的行为(如何响应指令、处理实时控制)。
理解它们对定制电机控制器或调试ODrive至关重要! 🚀