From f13d7eb6861a8e23a9f8b2beaec147a0ea231771 Mon Sep 17 00:00:00 2001 From: nitiantuhao <2062405236@qq.com> Date: Sat, 28 Mar 2026 18:55:41 +0800 Subject: [PATCH] 1.0 --- Core/Src/motor.c | 74 +++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/Core/Src/motor.c b/Core/Src/motor.c index a794417..0fc9e36 100644 --- a/Core/Src/motor.c +++ b/Core/Src/motor.c @@ -119,6 +119,7 @@ void Set_Motor_Output(Motor_ID_t id, int16_t control_out) int32_t hw_command = (int32_t)control_out; bool forward; uint16_t pwm_val; + uint16_t in1_pwm, in2_pwm; if ((id == MOTOR_FL) || (id == MOTOR_RL)) { @@ -128,50 +129,50 @@ void Set_Motor_Output(Motor_ID_t id, int16_t control_out) forward = (hw_command < 0); pwm_val = Motor_ClampAbsToPwm(hw_command); + /* + * --- 慢衰减 (Slow Decay) 实现 --- + * 正转:IN1 = 100% (常高), IN2 = 100% - PWM + * 反转:IN1 = 100% - PWM, IN2 = 100% (常高) + * 此时 PWM 关断期间的状态均为 IN1=1, IN2=1 (短接刹车) + */ + if (forward) + { + in1_pwm = MAX_PWM_DUTY; + in2_pwm = MAX_PWM_DUTY - pwm_val; + } + else + { + in1_pwm = MAX_PWM_DUTY - pwm_val; + in2_pwm = MAX_PWM_DUTY; + } + + /* + * 选配:如果希望目标速度为 0 时芯片进入低功耗待机(Standby)让电机自由滑行, + * 可以取消下面这段注释。如果不取消,速度为 0 时电机将被死死刹住。 + */ + /* + if (pwm_val == 0) { + in1_pwm = 0U; + in2_pwm = 0U; + } + */ + switch (id) { case MOTOR_FL: - if (forward) - { - Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, pwm_val, 0U); - } - else - { - Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, 0U, pwm_val); - } + Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, in1_pwm, in2_pwm); break; case MOTOR_RL: - if (forward) - { - Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, pwm_val, 0U); - } - else - { - Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, 0U, pwm_val); - } + Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, in1_pwm, in2_pwm); break; case MOTOR_FR: - if (forward) - { - Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, pwm_val, 0U); - } - else - { - Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, 0U, pwm_val); - } + Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, in1_pwm, in2_pwm); break; case MOTOR_RR: - if (forward) - { - Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, pwm_val, 0U); - } - else - { - Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, 0U, pwm_val); - } + Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, in1_pwm, in2_pwm); break; default: @@ -181,10 +182,11 @@ void Set_Motor_Output(Motor_ID_t id, int16_t control_out) void Motor_Brake_All(void) { - Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, 0U, 0U); - Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, 0U, 0U); - Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, 0U, 0U); - Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, 0U, 0U); + /* AT8236 的主动刹车 (慢衰减) 逻辑为 IN1=1, IN2=1,因此传入最大占空比 */ + Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, MAX_PWM_DUTY, MAX_PWM_DUTY); + Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, MAX_PWM_DUTY, MAX_PWM_DUTY); + Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, MAX_PWM_DUTY, MAX_PWM_DUTY); + Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, MAX_PWM_DUTY, MAX_PWM_DUTY); } void Motor_Update_RPM(float dt_s)