diff --git a/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c b/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c index a79e426..051ef23 100644 --- a/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c +++ b/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c @@ -83,20 +83,26 @@ uint8_t g_rs485_id = 0; #define OPT_IN1 (GPIOB_ReadPortPin(GPIO_Pin_10)) /*=========================================================================== - * LEDB 红色呼吸灯 (PB23, PWM11) — 快速心跳指示 (~2s 周期) + * LEDB 红色呼吸灯 (PB23, PWM11) — 心跳指示 * PWM freq ≈ 60MHz / (PWM_CLK_DIV * 128) ≈ 5.86kHz @DIV=80 - * 周期 = 16步渐亮 + 3tick高亮 + 16步渐灭 + 3tick低亮 - * ≈ (16*50ms)*2 + 150ms*2 ≈ 1.9s + * 无光耦信号: 周期 ≈ 16步×2 + 3tick×2 ≈ 1.9s (DUTY_STEP=8, HOLD=3) + * 光耦有信号: 周期 ≈ 8步×2 + 1tick×2 ≈ 0.9s (DUTY_STEP=16, HOLD=1) + * 复位模式(6)除外,光耦有信号不加速 *===========================================================================*/ #define PWM_CLK_DIV 80 #define PWM_CYCLE 128 // 7-bit 分辨率 (0~127) #define BREATH_STEP_DELAY 1 // 每 50ms 更新一次 #define BREATH_DUTY_STEP 8 // 每步跳 8 级占空比 +#define BREATH_HOLD_TICKS 3 // 高/低电平保持 tick 数 #define BREATH_FADE_IN 0 #define BREATH_HOLD_HIGH 1 #define BREATH_FADE_OUT 2 #define BREATH_HOLD_LOW 3 +/* 光耦有信号时加速参数 (周期 ~1s) */ +#define BREATH_OPTO_DUTY_STEP 16 // 步长加倍 → 渐亮/渐灭各 8 步 +#define BREATH_OPTO_HOLD_TICKS 1 // 保持 50ms + static uint8_t g_breath_phase = BREATH_FADE_IN; static uint8_t g_breath_duty = 0; static uint8_t g_breath_tick = 0; @@ -1335,47 +1341,60 @@ void TMR1_IRQHandler(void) } } - /*--- LEDB 红色呼吸灯 (PWM11, 50ms tick, ~1.9s 心跳周期) ---*/ - g_breath_tick++; - switch (g_breath_phase) { - case BREATH_FADE_IN: // 渐亮 0 → max, ~800ms - if (g_breath_tick >= BREATH_STEP_DELAY) { - g_breath_tick = 0; - if (g_breath_duty + BREATH_DUTY_STEP >= PWM_CYCLE) { - g_breath_duty = PWM_CYCLE - 1; - g_breath_phase = BREATH_HOLD_HIGH; + /*--- LEDB 红色呼吸灯 (PWM11, 50ms tick, 光耦有信号时加速 ~1s) ---*/ + { + uint8_t _step, _hold; + + /* 非复位模式下光耦有信号 → 红灯快闪 (现场判断光耦是否正常) */ + if (g_opt_trigger && g_output_radar_mode != OUTPUT_MODE_LOOP_X_RESET) { + _step = BREATH_OPTO_DUTY_STEP; + _hold = BREATH_OPTO_HOLD_TICKS; + } else { + _step = BREATH_DUTY_STEP; + _hold = BREATH_HOLD_TICKS; + } + + g_breath_tick++; + switch (g_breath_phase) { + case BREATH_FADE_IN: + if (g_breath_tick >= BREATH_STEP_DELAY) { g_breath_tick = 0; - } else { - g_breath_duty += BREATH_DUTY_STEP; + if (g_breath_duty + _step >= PWM_CYCLE) { + g_breath_duty = PWM_CYCLE - 1; + g_breath_phase = BREATH_HOLD_HIGH; + g_breath_tick = 0; + } else { + g_breath_duty += _step; + } + PWM11_ActDataWidth(g_breath_duty); } - PWM11_ActDataWidth(g_breath_duty); - } - break; - case BREATH_HOLD_HIGH: // 最亮保持 ~150ms - if (g_breath_tick >= 3) { - g_breath_phase = BREATH_FADE_OUT; - g_breath_tick = 0; - } - break; - case BREATH_FADE_OUT: // 渐灭 max → 0, ~800ms - if (g_breath_tick >= BREATH_STEP_DELAY) { - g_breath_tick = 0; - if (g_breath_duty <= BREATH_DUTY_STEP) { - g_breath_duty = 0; - g_breath_phase = BREATH_HOLD_LOW; + break; + case BREATH_HOLD_HIGH: + if (g_breath_tick >= _hold) { + g_breath_phase = BREATH_FADE_OUT; g_breath_tick = 0; - } else { - g_breath_duty -= BREATH_DUTY_STEP; } - PWM11_ActDataWidth(g_breath_duty); - } - break; - case BREATH_HOLD_LOW: // 最暗保持 ~150ms - if (g_breath_tick >= 3) { - g_breath_phase = BREATH_FADE_IN; - g_breath_tick = 0; - } - break; + break; + case BREATH_FADE_OUT: + if (g_breath_tick >= BREATH_STEP_DELAY) { + g_breath_tick = 0; + if (g_breath_duty <= _step) { + g_breath_duty = 0; + g_breath_phase = BREATH_HOLD_LOW; + g_breath_tick = 0; + } else { + g_breath_duty -= _step; + } + PWM11_ActDataWidth(g_breath_duty); + } + break; + case BREATH_HOLD_LOW: + if (g_breath_tick >= _hold) { + g_breath_phase = BREATH_FADE_IN; + g_breath_tick = 0; + } + break; + } } }