keer_zu 发表于 2025-2-26 00:25

odrive电机控制代码 `update` 函数解析

# Odrive 电机控制代码 `update` 函数解析

## `update` 函数概述

`update` 函数是 Odrive 电机控制代码中的核心函数之一,负责在每个控制循环中更新电机的状态和控制参数。该函数根据当前配置和输入信号计算并输出电机所需的转矩,同时处理错误和特殊情况。

## 函数逻辑解析

### 1. 获取估计值

```c++
std::optional<float> pos_estimate_linear = pos_estimate_linear_src_.present();
std::optional<float> pos_estimate_circular = pos_estimate_circular_src_.present();
std::optional<float> pos_wrap = pos_wrap_src_.present();
std::optional<float> vel_estimate = vel_estimate_src_.present();

std::optional<float> anticogging_pos_estimate = axis_->encoder_.pos_estimate_.present();
std::optional<float> anticogging_vel_estimate = axis_->encoder_.vel_estimate_.present();
```


* 获取位置、速度和反齿槽位置估计值。
* 处理线性、圆形位置估计和位置环绕值。



### 2. 处理步进方向激活情况

```
if (axis_->step_dir_active_) {
    // 处理步进方向激活情况
}

```


* 如果步进方向被激活,根据配置更新输入位置。



### 3. 反齿槽校准

```
if (config_.anticogging.calib_anticogging) {
    // 进行反齿槽校准
}

```

* 如果启用了反齿槽校准,则根据当前位置和速度进行校准。

keer_zu 发表于 2025-2-26 00:26

* 如果启用了反齿槽校准,则根据当前位置和速度进行校准。

### 4. 更新输入值

```
switch (config_.input_mode) {
    // 根据输入模式更新位置、速度和转矩设定点
}

```


* 根据配置的输入模式(如直通、速度斜坡、转矩斜坡等),更新位置、速度和转矩设定点。

### 5. 限制设定点

```
if(config_.enable_vel_limit) {
    vel_setpoint_ = std::clamp(vel_setpoint_, -config_.vel_limit, config_.vel_limit);
}

torque_setpoint_ = std::clamp(torque_setpoint_, -Tlim, Tlim);

```


* 限制速度设定点以防止超过配置的速度限制。
* 限制转矩设定点以防止超过电机的最大可用转矩。

keer_zu 发表于 2025-2-26 00:29

### 6. 位置控制

```
if (config_.control_mode >= CONTROL_MODE_POSITION_CONTROL) {
    // 计算位置误差并更新速度设定点
}

```

* 如果控制模式至少为位置控制,则计算位置误差并更新速度设定点。

### 7. 速度控制

```
if (config_.control_mode >= CONTROL_MODE_VELOCITY_CONTROL) {
    // 计算速度误差并更新转矩
}

```

* 如果控制模式至少为速度控制,则计算速度误差并更新转矩。

### 8. 反齿槽补偿

```
if (anticogging_valid_ && config_.anticogging.anticogging_enabled) {
    // 应用反齿槽补偿
}

```

* 如果反齿槽校准有效且启用,则应用反齿槽补偿。

### 9. 转矩限制和积分器更新

```
// 转矩限制

if (config_.control_mode < CONTROL_MODE_VELOCITY_CONTROL) {
    vel_integrator_torque_ = 0.0f;
} else {
    // 更新速度积分器
}

```

* 对转矩进行限制以防止超过限制。
* 根据控制模式更新速度积分器。

keer_zu 发表于 2025-2-26 00:30

### 10. 功率计算和自旋检测

```
// 计算机械功率和电气功率

if (mechanical_power_ < config_.spinout_mechanical_power_threshold && electrical_power_ > config_.spinout_electrical_power_threshold) {
    set_error(ERROR_SPINOUT_DETECTED);
    return false;
}

```


* 计算机械功率和电气功率。
* 检测自旋情况,如果检测到自旋则设置错误。

### 11. 输出转矩并清除无效估计错误

```
torque_output_ = torque;

error_ &= ~ERROR_INVALID_ESTIMATE;
return true;

```


* 输出最终计算得到的转矩。
* 清除无效估计错误标志。

## 总结

`update` 函数通过一系列步骤,包括获取估计值、处理步进方向激活情况、反齿槽校准、更新输入值、限制设定点、位置控制、速度控制、反齿槽补偿、转矩限制和积分器更新、功率计算和自旋检测,最终输出电机的转矩设定点。该函数是 Odrive 电机控制逻辑的核心,确保了电机能够根据输入信号和配置稳定运行。

keer_zu 发表于 2025-2-26 00:32

代码:

旧时光放映机 发表于 2025-3-18 18:11

位置控制模式下,如何计算位置误差并更新速度设定点
页: [1]
查看完整版本: odrive电机控制代码 `update` 函数解析