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;
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user