This commit is contained in:
2026-03-28 18:55:41 +08:00
parent 1bc1f7a87c
commit f13d7eb686

View File

@@ -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)