ezMUNrifleman 2025-07-21 18:04 采纳率: 0%
浏览 13

为什么我这个电机-20 +20速度就不转了?

我看的江科大stm32电机驱动的视频 -20和+20的时候电机不转 +40的速度要手拨一下才转 其他的速度都是正常的 有没有哥能解答一下

img

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-07-21 18:05
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你的问题涉及到 STM32 驱动电机 时出现的 速度异常现象,具体表现为:

    • 当设置速度为 -20 或 +20 时,电机不转
    • 设置为 +40 时,需要手动拨动才能转动
    • 其他速度(如 +50、+60 等)正常。

    🧠 可能的原因分析

    1. PWM 脉冲宽度太小(低于驱动模块的最小启动阈值)

    • 有些电机驱动模块(如 L298N、TB6612FNG 等)对 PWM 的占空比 有最低要求。
    • 如果 PWM 占空比太低(例如 20%),可能无法让电机旋转,甚至在某些情况下会进入“锁死”状态。

    重点: 某些驱动模块的 最小有效占空比约 10%-20%,如果低于这个范围,电机可能无法启动。

    2. 电机驱动模块的死区或控制逻辑问题

    • 部分驱动模块(如 TB6612FNG)在 PWM 信号过低时 会自动关闭输出,防止电机因微弱电流而发热或损坏。
    • 这种设计虽然合理,但会导致你在设定较小速度时感觉“电机不转”。

    3. PID 控制或速度计算错误

    • 如果你使用的是 PID 控制算法,可能在 速度值较小时,输出的 PWM 值被限制在某个范围内,导致电机无法启动。
    • 检查你的 速度到 PWM 的映射函数 是否正确。

    4. 电机自身特性

    • 有些电机在 低速时 需要一定“启动力”才能开始旋转。比如,带负载的电机在低速时容易卡住。
    • 手动拨动后可以运转,说明电机本身是正常的,只是启动力不足。

    ✅ 解决方案(有序列表)

    1. 检查并调整 PWM 的最小输出值

    • 在代码中确保 PWM 输出不会低于某个最小值(比如 20%)。
    • 示例代码如下(以 STM32 HAL 库为例):
    // 假设你的 PWM 值是 -100 到 +100
    int16_t speed = 20; // 用户输入的速度
    uint16_t pwm_value;
    
    if (speed > 0) {
        pwm_value = speed * 100 / 100; // 100% 最大值
    } else if (speed < 0) {
        pwm_value = abs(speed) * 100 / 100;
    } else {
        pwm_value = 0;
    }
    
    // 设置 PWM 值,但不能低于某个最小值
    if (pwm_value < 20) {
        pwm_value = 20; // 设置最小 PWM 为 20%
    }
    

    重点: 确保 PWM 输出不低于 20%,否则驱动模块可能无法驱动电机。


    2. 检查驱动模块的最小工作电压/电流

    • 查看你使用的 电机驱动模块的数据手册,确认其 最低有效 PWM 占空比
    • 例如:
      • TB6612FNG 的最小有效 PWM 为 10%
      • L298N 的最小有效 PWM 为 20%
    • 如果你的 PWM 值低于这个阈值,电机就无法启动。

    3. 修改速度到 PWM 的映射关系

    • 如果你的速度值是 ±100,建议将其映射到 20% ~ 100% 的 PWM 值。
    • 例如:
    // 原始速度:-100 ~ +100
    // 映射到 PWM:20% ~ 100%
    
    float mapped_pwm = (abs(speed) / 100.0f) * 80 + 20; // 20% ~ 100%
    

    重点: 不要将速度直接等比例映射到 PWM,而是要加入一个 偏移量,避免 PWM 太小。


    4. 增加电机启动辅助逻辑

    • 如果电机在低速时不易启动,可以在程序中添加一个 启动辅助功能
      • 当检测到速度较低时,先给电机一个短暂的高功率脉冲,帮助它启动。
    if (abs(speed) < 40) {
        // 给电机一个短暂的高功率脉冲(例如 50ms)
        set_pwm(100); // 100% PWM
        HAL_Delay(50);
        set_pwm(mapped_pwm);
    }
    

    重点: 这种方式可以有效解决电机“卡顿”或“无法启动”的问题。


    5. 检查电机和驱动器连接是否正常

    • 确保 电机电源供电稳定,不要使用电池供电时电压过低。
    • 检查 驱动模块的使能引脚是否正常拉高
    • 确保 电机接线无短路或断路

    🔧 总结

    | 问题 | 原因 | 解决方法 | |------|------|----------| | -20 和 +20 时电机不转 | PWM 占空比过低,低于驱动模块的最小工作阈值 | 设置 PWM 下限为 20% 或更高 | | +40 时需要手动拨动 | 电机启动力不足 | 添加启动辅助脉冲 | | 其他速度正常 | 速度映射或驱动模块设置问题 | 调整 PWM 映射关系,确保最小值合理 |


    如果你愿意提供你目前的代码片段,我可以帮你更精准地定位问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月21日