perf: 呼吸灯加速至 ~1.9s 心跳周期

- 步进: 1→8 级/50ms, 渐亮/渐灭各 ~800ms
- Hold: 0.5s/0.3s→150ms/150ms
- 总周期 13.5s→1.9s, 快速判断设备存活
This commit is contained in:
wangfq
2026-07-21 17:20:38 +08:00
parent 9a490ca29d
commit f89457cebe
@@ -71,13 +71,15 @@ uint32_t g_sys_freq = 0;
#define OPT_IN1 (GPIOB_ReadPortPin(GPIO_Pin_10))
/*===========================================================================
* LEDB 红色呼吸灯 (PB23, PWM11)
* LEDB 红色呼吸灯 (PB23, PWM11) — 快速心跳指示 (~2s 周期)
* PWM freq ≈ 60MHz / (PWM_CLK_DIV * 128) ≈ 5.86kHz @DIV=80
* 呼吸周期 ≈ (127*2*50ms) + 0.5s + 0.3s ≈ 13.5s
* 周期 = 16步渐亮 + 3tick高亮 + 16步渐灭 + 3tick低亮
* ≈ (16*50ms)*2 + 150ms*2 ≈ 1.9s
*===========================================================================*/
#define PWM_CLK_DIV 80
#define PWM_CYCLE 128 // 7-bit 分辨率 (0~127)
#define BREATH_STEP_DELAY 1 // 每 50ms 更新一次占空比 (步进平滑)
#define BREATH_STEP_DELAY 1 // 每 50ms 更新一次
#define BREATH_DUTY_STEP 8 // 每步跳 8 级占空比
#define BREATH_FADE_IN 0
#define BREATH_HOLD_HIGH 1
#define BREATH_FADE_OUT 2
@@ -1125,39 +1127,43 @@ void TMR1_IRQHandler(void)
}
}
/*--- LEDB 红色呼吸灯 (PWM11, 50ms tick) ---*/
/*--- LEDB 红色呼吸灯 (PWM11, 50ms tick, ~1.9s 心跳周期) ---*/
g_breath_tick++;
switch (g_breath_phase) {
case BREATH_FADE_IN: // 渐亮 0 → max, 每300ms一步
case BREATH_FADE_IN: // 渐亮 0 → max, ~800ms
if (g_breath_tick >= BREATH_STEP_DELAY) {
g_breath_tick = 0;
g_breath_duty++;
PWM11_ActDataWidth(g_breath_duty);
if (g_breath_duty >= PWM_CYCLE - 1) {
if (g_breath_duty + 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 += BREATH_DUTY_STEP;
}
PWM11_ActDataWidth(g_breath_duty);
}
break;
case BREATH_HOLD_HIGH: // 最亮保持 ~0.5s
if (g_breath_tick >= 10) {
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, 每300ms一步
case BREATH_FADE_OUT: // 渐灭 max → 0, ~800ms
if (g_breath_tick >= BREATH_STEP_DELAY) {
g_breath_tick = 0;
g_breath_duty--;
PWM11_ActDataWidth(g_breath_duty);
if (g_breath_duty == 0) {
if (g_breath_duty <= BREATH_DUTY_STEP) {
g_breath_duty = 0;
g_breath_phase = BREATH_HOLD_LOW;
g_breath_tick = 0;
} else {
g_breath_duty -= BREATH_DUTY_STEP;
}
PWM11_ActDataWidth(g_breath_duty);
}
break;
case BREATH_HOLD_LOW: // 最暗保持 ~0.3s
if (g_breath_tick >= 6) {
case BREATH_HOLD_LOW: // 最暗保持 ~150ms
if (g_breath_tick >= 3) {
g_breath_phase = BREATH_FADE_IN;
g_breath_tick = 0;
}