1.0
This commit is contained in:
@@ -119,6 +119,7 @@ void Set_Motor_Output(Motor_ID_t id, int16_t control_out)
|
|||||||
int32_t hw_command = (int32_t)control_out;
|
int32_t hw_command = (int32_t)control_out;
|
||||||
bool forward;
|
bool forward;
|
||||||
uint16_t pwm_val;
|
uint16_t pwm_val;
|
||||||
|
uint16_t in1_pwm, in2_pwm;
|
||||||
|
|
||||||
if ((id == MOTOR_FL) || (id == MOTOR_RL))
|
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);
|
forward = (hw_command < 0);
|
||||||
pwm_val = Motor_ClampAbsToPwm(hw_command);
|
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)
|
switch (id)
|
||||||
{
|
{
|
||||||
case MOTOR_FL:
|
case MOTOR_FL:
|
||||||
if (forward)
|
Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, in1_pwm, in2_pwm);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOTOR_RL:
|
case MOTOR_RL:
|
||||||
if (forward)
|
Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, in1_pwm, in2_pwm);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOTOR_FR:
|
case MOTOR_FR:
|
||||||
if (forward)
|
Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, in1_pwm, in2_pwm);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOTOR_RR:
|
case MOTOR_RR:
|
||||||
if (forward)
|
Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, in1_pwm, in2_pwm);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -181,10 +182,11 @@ void Set_Motor_Output(Motor_ID_t id, int16_t control_out)
|
|||||||
|
|
||||||
void Motor_Brake_All(void)
|
void Motor_Brake_All(void)
|
||||||
{
|
{
|
||||||
Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, 0U, 0U);
|
/* AT8236 的主动刹车 (慢衰减) 逻辑为 IN1=1, IN2=1,因此传入最大占空比 */
|
||||||
Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, 0U, 0U);
|
Motor_WriteBridge(&htim2, TIM_CHANNEL_3, TIM_CHANNEL_4, MAX_PWM_DUTY, MAX_PWM_DUTY);
|
||||||
Motor_WriteBridge(&htim8, TIM_CHANNEL_1, TIM_CHANNEL_2, 0U, 0U);
|
Motor_WriteBridge(&htim9, TIM_CHANNEL_1, TIM_CHANNEL_2, MAX_PWM_DUTY, MAX_PWM_DUTY);
|
||||||
Motor_WriteBridge(&htim8, TIM_CHANNEL_3, TIM_CHANNEL_4, 0U, 0U);
|
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)
|
void Motor_Update_RPM(float dt_s)
|
||||||
|
|||||||
Reference in New Issue
Block a user