| | |
| | | #include "stm32h7xx_hal_dma.h" |
| | | #include <string.h> |
| | | #include "pwm_ctrol.h" |
| | | #include "PythonLink.h" |
| | | |
| | | /******************************************************************************* |
| | | * Macro * |
| | |
| | | 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 * |
| | |
| | | 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; |
| | | } |
| | | |
| | | // 只有在手动模式下才更新 PWM |
| | | if (g_u8ControlMode == 0) |
| | | { |
| | | SBUS_Control_PWM(); |
| | | } |
| | | |
| | | return HIDO_TRUE; |
| | | } |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | 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; |
| | | } |