先养只猫 2024-04-30 17:38 采纳率: 50%
浏览 7
已结题

基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果

硬件:FOC驱动器

算法:FOC算法

疑问:

卡丁车可以在下坡的时候无阻力的遛坡,这样速度就可以很快,电瓶车也是如此。我近日想要通过手头的一块FOC的驱动器,基于FOC算法实现类似的无阻力的下坡效果,发现:

  • FOC速度闭环效果可以实现防遛坡效果
  • FOC速度开环效果依然会有一定的阻力,阻碍遛坡
  • FOC力矩模式,无法以速度为调节,不满足使用条件

那么我应该对FOC代码中哪一部分进行调节呢?
思路:

  • 想要遛坡就要降低电流,当以一定速度下坡时,降低原本的闭环电流,那么应该用什么条件来触发电流降低呢?这里,我查看了simpleFOC的驱动代码,一时半会难以想出解决办法:例如因外力原因,速度偏大,那么电机也会增大电流来抑制速度;速度偏低,电机也会增大电流来增加速度;只有当负载变轻的时候,电流才会减小来降低速度?
    case MotionControlType::velocity:
      // velocity set point - sensor precision: this calculation is numerically precise.
      shaft_velocity_sp = target;
      // calculate the torque command
      current_sp = PID_velocity(shaft_velocity_sp - shaft_velocity); // if current/foc_current torque control
      // if torque controlled through voltage control
      if(torque_controller == TorqueControlType::voltage){
        // use voltage if phase-resistance not provided
        if(!_isset(phase_resistance))  voltage.q = current_sp;
        else  voltage.q = _constrain( current_sp*phase_resistance + voltage_bemf , -voltage_limit, voltage_limit);
        // set d-component (lag compensation if known inductance)
        if(!_isset(phase_inductance)) voltage.d = 0;
        else voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
      }
      break;

    case TorqueControlType::foc_current:
      if(!current_sense) return;
      // read dq currents
      current = current_sense->getFOCCurrents(electrical_angle);
      // filter values
      current.q = LPF_current_q(current.q);
      current.d = LPF_current_d(current.d);
      // calculate the phase voltages
      voltage.q = PID_current_q(current_sp - current.q);
      voltage.d = PID_current_d(-current.d);
      // d voltage - lag compensation - TODO verify
      // if(_isset(phase_inductance)) voltage.d = _constrain( voltage.d - current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
      break;
    default:
      // no torque control selected
      SIMPLEFOC_DEBUG("MOT: no torque control selected!");
      break;
  }

  • 写回答

19条回答 默认 最新

  • 专家-皆知 2024-04-30 17:38
    关注
    获得0.15元问题酬金

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    为了实现卡丁车在下坡时无阻力遛坡的效果,关键在于让电机不施加制动扭矩,同时确保电机能够自由旋转以跟随车辆的自然下滑速度。基于您提供的FOC(Field Oriented Control)驱动器代码框架,我们需要调整控制策略,使得电机既不主动加速也不提供制动,而是被动地随着车体的速度变化而变化。

    调整思路

    1. 取消力矩控制:在下坡模式下,首要任务是取消任何力矩指令,让电机不再主动输出正向或反向力矩。这意味着在下坡期间,我们应当将力矩控制目标设为零或跟随实际测量的力矩值,确保电机不抗拒车辆的自然运动趋势。

    2. 电压控制策略调整:对于电压控制部分,我们应当确保电机绕组上的电压主要是用来补偿反电动势(BEMF),而不是施加额外的力矩。这要求我们根据实际的转速动态调整电压q轴分量,以保持电压差(指令电压减去BEMF)接近于零,从而让电机顺畅地自由旋转。

    3. 滤波与补偿考虑:在下坡时,可能需要适当调整电流环和速度环的滤波参数,以减少不必要的响应延迟或过冲,但这也取决于具体系统响应特性和稳定性需求。

    修改代码示例

    针对您的代码段,以下是一种可能的调整方式:

    // 在进入下坡模式前,确保设置合适的控制类型
    motion_control_type = MotionControlType::no_control; // 假设新增一个不施加控制的模式
    torque_controller = TorqueControlType::voltage; // 确保使用电压控制
    
    // 下面是修改后的控制逻辑部分
    switch (motion_control_type) {
      // ... 其他控制类型处理 ...
    
      case MotionControlType::no_control:
        // 在此模式下,我们不设定速度或力矩目标,而是让电机自由跟随车辆
        shaft_velocity_sp = 0; // 取消速度设定点
        current_sp = 0; // 取消力矩设定点
    
        // 计算电压指令以补偿BEMF,假设没有额外的力矩需求
        voltage_bemf = _calculateBackEMF(shaft_velocity); // 基于转速计算BEMF
        voltage.q = _constrain(voltage_bemf, -voltage_limit, voltage_limit); // 仅补偿BEMF,维持电机自由旋转
        voltage.d = 0; // 不需要d轴补偿
    
        // 如果已知电感和电阻,可以进行更精细的调整,但这里简化处理
        break;
    
      // ... 其他case ...
    }
    
    // 注意:_calculateBackEMF是一个假设的函数,用于根据当前转速计算反电动势电压
    // 实际实现时,这个函数需要依据电机的极对数、转速等因素进行计算。
    

    注意事项

    • 安全性考量:在实现无阻力遛坡功能时,务必考虑车辆安全控制系统,比如刹车和限速机制,确保在紧急情况下能够及时介入控制。
    • 测试与调优:上述代码仅为示例,实际应用中需要根据电机特性、车辆质量、道路条件等进行详细测试和参数调优。
    • 监控与保护:实施此类控制策略时,加强电机温度、电流和电压的监控,防止过载或失控情况发生。

    通过以上调整,理论上可以实现卡丁车在下坡时的无阻力遛坡效果,但请确保在安全可控的环境下进行测试。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月8日
  • 赞助了问题酬金15元 4月30日
  • 创建了问题 4月30日

悬赏问题

  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序