dqsh06 2025-08-04 17:12 采纳率: 100%
浏览 11
已结题

STM32驱动直流电机,单片机重启

各位,
我最近设计了一个用STM32G474来驱动4个直流有刷电机的板子,板子能够驱动电机,但是,驱动电机正反转之后,在比较近的时间里再驱动电机,会导致单片机重启。

我的代码是这样写的:

    LED_Green_on(); // Turn on green LED to indicate system is running
    HAL_Delay(1000);
    LED_Green_off(); // Turn off green LED
    HAL_Delay(1000);
    
    // DC motor 测试
    DcMotor_setSpeed(&dcmotorHandle1, 150); // Set left motor speed to 150
    DcMotor_setSpeed(&dcmotorHandle2, 150); // Set right motor speed to 150
    DcMotor_run(&dcmotorHandle1, FORWARD); // Run left motor forward
    DcMotor_run(&dcmotorHandle2, FORWARD); // Run right motor backward
    HAL_Delay(5000); // Run for 5 seconds
    DcMotor_run(&dcmotorHandle1, RELEASE); // Release left motor
    DcMotor_run(&dcmotorHandle2, RELEASE); // Release right motor
    HAL_Delay(5000); // Wait for 1 second
    DcMotor_run(&dcmotorHandle1, BACKWARD); // Run left motor backward
    DcMotor_run(&dcmotorHandle2, BACKWARD); // Run right motor backward
    HAL_Delay(5000); // Run for 5 seconds
    DcMotor_run(&dcmotorHandle1, RELEASE); // Release left motor
    DcMotor_run(&dcmotorHandle2, RELEASE); // Release right motor
    HAL_Delay(5000); // Wait for 5 seconds

    HAL_Delay(10000); // Wait for 10 second
    DcMotor_setSpeed(&dcmotorHandle1, 100); // Set left motor speed to 100
    DcMotor_setSpeed(&dcmotorHandle2, 100); // Set right motor speed to 100
    DcMotor_run(&dcmotorHandle1, BACKWARD); // Run left motor forward
    DcMotor_run(&dcmotorHandle2, BACKWARD); // Run right motor backward
    HAL_Delay(5000); // Run for 5 seconds
    DcMotor_run(&dcmotorHandle1, RELEASE); // Release left motor
    DcMotor_run(&dcmotorHandle2, RELEASE); // Release right motor
    HAL_Delay(5000); // Wait for 1 second
    DcMotor_run(&dcmotorHandle1, FORWARD); // Run left motor backward
    DcMotor_run(&dcmotorHandle2, FORWARD); // Run right motor backward
    HAL_Delay(5000); // Run for 5 seconds
    DcMotor_run(&dcmotorHandle1, RELEASE); // Release left motor
    DcMotor_run(&dcmotorHandle2, RELEASE); // Release right motor
    HAL_Delay(5000); // Wait for 5 seconds

先设2个电机的速度是150,正转5s,停5s,反转5s,停5s, 这是写在while(1)大循环里面的,如果这时就这样的话,大循环可以一直这样电机正转反转。
我想改变一下速度看看,我就将速度改成100, 反转5s,停5s,正转5s,停5s。 中间停止了10s, 中间停止10s的过程,电机已经停止5s了。在这停止10s的过程中,单片机会复位。
我用示波器看了T_NRST的波形,确实会出现一个电压忽然跌到0的跳变,不知道为什么?

img

请各位帮我看看,为什么会出现这个问题呢?我应该怎么解决?

谢谢!

  • 写回答

6条回答 默认 最新

  • dqsh06 2025-08-05 16:26
    关注

    各位,
    通过讨论,这个问题的根本原因是看门狗没有及时喂狗。我设置了一个30s的看门狗,而前面的处理加上20s的第一轮直流电机动作,再等10s的时候,已经超过看门狗的30s了,看门狗将系统复位了。所以,看到NRST拉低了。一个漂亮的弧度。VDD和5V电压都是好的,没有什么波动。就是看门狗复位。我将看门狗取消了之后,程序运行良好,没有复位了。

    谢谢!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 8月13日
  • 已采纳回答 8月5日
  • 创建了问题 8月4日