yincheng.zhong
3 天以前 26db5e14522173c274ac954c867d2ebe5d8ca3ac
STM32H743/FML/SBUS.c
@@ -15,6 +15,7 @@
#include "stm32h7xx_hal_dma.h"
#include <string.h>
#include "pwm_ctrol.h"
#include "PythonLink.h"
/*******************************************************************************
 *                                  Macro                                      *
@@ -48,6 +49,9 @@
static HIDO_UINT32 g_u32DebugLastDmaRemaining = 0;
// SBUS failsafe active flag
static volatile HIDO_UINT8 g_bSBUSFailsafeActive = 0;
// 控制模式状态 (0=手动遥控器, 1=自动Python)
static volatile HIDO_UINT8 g_u8ControlMode = 0;
/*******************************************************************************
 *                             Local Function                                  *
@@ -106,13 +110,33 @@
    g_stSBUSData.m_u32LastUpdateTick = HAL_GetTick();
    g_stSBUSData.m_u32FrameCount++;
    // 5. 检查 CH8 (通道7, 索引7) 决定控制模式
    // CH8 > 1500: 自动模式 (Python控制)
    // CH8 < 1500: 手动模式 (遥控器控制)
    HIDO_UINT16 ch8_value = g_stSBUSData.m_au16Channels[7];
    if (ch8_value > 1500)
    {
        // 自动模式: 不更新 PWM, 由 Python 控制
        g_u8ControlMode = 1;
    }
    else
    {
        // 手动模式: 使用遥控器信号控制
        g_u8ControlMode = 0;
    }
    // 解析成功后立即触发 PWM 控制(最小延迟)
    // 同时清除 failsafe 标志(如果之前触发过)
    if (g_bSBUSFailsafeActive)
    {
        g_bSBUSFailsafeActive = 0;
    }
    SBUS_Control_PWM();
    // 只有在手动模式下才更新 PWM
    if (g_u8ControlMode == 0)
    {
        SBUS_Control_PWM();
    }
    return HIDO_TRUE;
}
@@ -283,6 +307,28 @@
            g_bSBUSFailsafeActive = 1;
        }
    }
    // 自动模式: 应用Python下发的控制命令
    if (g_u8ControlMode == 1)
    {
        HIDO_UINT16 steering_pwm = 1500;
        HIDO_UINT16 throttle_pwm = 1500;
        HIDO_UINT32 cmd_timestamp = 0;
        // 获取Python控制命令
        if (PythonLink_GetControl(&steering_pwm, &throttle_pwm, &cmd_timestamp) == HIDO_TRUE)
        {
            // 应用控制命令到PWM输出
            Set_Steering_Pulse(steering_pwm);
            Set_Motor_Pulse(throttle_pwm);
        }
        else
        {
            // 没有有效的Python命令时,使用安全的中位值
            Set_Steering_Pulse(1500);
            Set_Motor_Pulse(1500);
        }
    }
}
/**
@@ -430,3 +476,13 @@
    }
    HIDO_Debug2("====================================\r\n\r\n");
}
/**
 * @brief 判断是否处于自动模式
 * @return HIDO_TRUE: 自动模式 (CH8 > 1500, Python控制)
 *         HIDO_FALSE: 手动模式 (CH8 < 1500, 遥控器控制)
 */
HIDO_BOOL SBUS_IsAutoMode(HIDO_VOID)
{
    return (g_u8ControlMode == 1) ? HIDO_TRUE : HIDO_FALSE;
}