打印

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

[复制链接]
27|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2025-2-26 00:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

update 函数概述

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

函数逻辑解析

1. 获取估计值

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 电机控制逻辑的核心,确保了电机能够根据输入信号和配置稳定运行。

使用特权

评论回复
5
keer_zu|  楼主 | 2025-2-26 00:32 | 只看该作者
代码:

ctrl.zip

4.45 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1385

主题

12546

帖子

53

粉丝