refactor: 重写黄灯故障指示 — 断开次数编码闪烁
- 无线圈上电: 黄灯快闪 (200ms) - 线圈断开 N 次: N 短闪 (80ms亮/200ms灭 × N, 1.2s间隔) - 不计入上电前未接线的情况 - 删除旧状态机 (g_led_loop_reconnect 等 4 个变量) - 新增 g_disconnect_count/active + g_fault_phase/tick
This commit is contained in:
@@ -115,13 +115,18 @@ extern uint32_t LC_Hold_CNT; // 安全复位计数器
|
|||||||
extern uint16_t g_safe_max_cnt; // 安全复位超时
|
extern uint16_t g_safe_max_cnt; // 安全复位超时
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 故障指示相关 (DLD154V4B 特有,M1H 无黄灯)
|
* 故障指示相关 — 黄灯 (LEDC, PA10)
|
||||||
|
*
|
||||||
|
* 行为:
|
||||||
|
* - 无线圈上电:黄灯快闪(200ms 周期)
|
||||||
|
* - 线圈断开 N 次(N≥1):N 短闪(N×80ms 亮,间隔 200ms 灭,长灭 1.2s 重复)
|
||||||
|
* - 线圈正常连接:黄灯灭
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
extern uint8_t g_loop_power_up_state; // 上电后线圈是否曾连接
|
extern uint8_t g_loop_power_up_state; // 上电后线圈是否曾连接 (0=否, 1=是)
|
||||||
extern uint8_t g_led_loop_reconnect; // 线圈重连状态 (0=正常, >0=故障闪烁)
|
extern uint8_t g_disconnect_count; // 当前上电周期内线圈断开次数 (0~3)
|
||||||
extern uint8_t g_flag_faul_reconnect; // 故障灯切相
|
extern uint8_t g_disconnect_active; // 当前处于断开状态 (0=连接/从未连, 1=断开中)
|
||||||
extern uint8_t g_step_fault_led; // 故障灯步骤
|
extern uint8_t g_fault_phase; // 黄灯闪烁阶段
|
||||||
extern uint16_t g_counter_fault_led; // 故障灯计数器
|
extern uint16_t g_fault_tick; // 黄灯闪烁计时器 (每5ms+1)
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 调试计数器
|
* 调试计数器
|
||||||
|
|||||||
@@ -81,13 +81,13 @@ uint32_t LC_Hold_CNT = 0;
|
|||||||
uint16_t g_safe_max_cnt = LC_HOLD_TIME;
|
uint16_t g_safe_max_cnt = LC_HOLD_TIME;
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 故障指示相关 (DLD154V4B 特有黄灯)
|
* 故障指示相关 — 黄灯
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
uint8_t g_loop_power_up_state = 0;
|
uint8_t g_loop_power_up_state = 0;
|
||||||
uint8_t g_led_loop_reconnect = 0;
|
uint8_t g_disconnect_count = 0;
|
||||||
uint8_t g_flag_faul_reconnect = 0;
|
uint8_t g_disconnect_active = 0;
|
||||||
uint8_t g_step_fault_led = 0;
|
uint8_t g_fault_phase = 0;
|
||||||
uint16_t g_counter_fault_led = 0;
|
uint16_t g_fault_tick = 0;
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 调试计数器
|
* 调试计数器
|
||||||
@@ -184,79 +184,72 @@ void LEDA_ON_OFF(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
* 黄灯故障指示 (LEDC, PA10) — DLD154V4B 特有
|
* 黄灯故障指示 (LEDC, PA10)
|
||||||
* 状态机由 TMR15 ISR 每 5ms 驱动
|
*
|
||||||
|
* 由 TMR15 ISR 每 5ms 驱动一次。
|
||||||
|
*
|
||||||
|
* 闪烁模式:
|
||||||
|
* 无线圈上电 (g_loop_power_up_state==0):
|
||||||
|
* → 快闪 (200ms 亮 / 200ms 灭)
|
||||||
|
* 线圈断开过 N 次 (g_disconnect_count >= 1):
|
||||||
|
* → N 短闪 (80ms 亮, 200ms 灭, 重复 N 次后长灭 1.2s)
|
||||||
|
* 线圈正常连接:
|
||||||
|
* → 灭
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
void poll_yellow_led(void)
|
void poll_yellow_led(void)
|
||||||
{
|
{
|
||||||
#define YELLOW_ON_SHORT 16 // 80ms
|
#define FLT_ON_SHORT 16 // 80ms (16 × 5ms)
|
||||||
#define YELLOW_OFF_MIDDLE 40 // 200ms
|
#define FLT_GAP_SHORT 40 // 200ms
|
||||||
#define YELLOW_OFF_LONG 290 // ~1.45s
|
#define FLT_GAP_LONG 240 // 1.2s (240 × 5ms)
|
||||||
|
#define FLT_FAST_HALF 40 // 200ms 快闪半周期
|
||||||
|
|
||||||
if (!g_loop_power_up_state) return;
|
uint8_t N = g_disconnect_count;
|
||||||
|
|
||||||
g_counter_fault_led++;
|
g_fault_tick++;
|
||||||
|
|
||||||
if (g_led_loop_reconnect == 0x01) {
|
if (!g_loop_power_up_state) {
|
||||||
// 线圈重连:长灭 + 短亮
|
/*--- 模式0: 无线圈上电 → 快闪 ---*/
|
||||||
if (g_flag_faul_reconnect) {
|
if (g_fault_tick >= FLT_FAST_HALF) {
|
||||||
if (g_counter_fault_led > YELLOW_ON_SHORT) {
|
g_fault_tick = 0;
|
||||||
g_counter_fault_led = 0;
|
LED_YELLOW_GPIO->odt ^= LED_YELLOW_PIN; // toggle
|
||||||
g_flag_faul_reconnect = 0;
|
|
||||||
LED_YELLOW_OFF;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (g_counter_fault_led > YELLOW_OFF_LONG) {
|
|
||||||
g_flag_faul_reconnect = 1;
|
|
||||||
g_counter_fault_led = 0;
|
|
||||||
LED_YELLOW_ON;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (g_led_loop_reconnect >= 0x02) {
|
return;
|
||||||
// 线圈断开:编码闪烁
|
}
|
||||||
if (g_step_fault_led == 0) {
|
|
||||||
if (g_counter_fault_led > YELLOW_ON_SHORT) {
|
|
||||||
LED_YELLOW_OFF;
|
|
||||||
g_step_fault_led = 1;
|
|
||||||
g_counter_fault_led = 0;
|
|
||||||
}
|
|
||||||
} else if (g_step_fault_led == 1) {
|
|
||||||
if (g_counter_fault_led > YELLOW_OFF_MIDDLE) {
|
|
||||||
LED_YELLOW_ON;
|
|
||||||
g_step_fault_led = 2;
|
|
||||||
g_counter_fault_led = 0;
|
|
||||||
}
|
|
||||||
} else if (g_step_fault_led == 2) {
|
|
||||||
if (g_counter_fault_led > YELLOW_ON_SHORT) {
|
|
||||||
LED_YELLOW_OFF;
|
|
||||||
g_step_fault_led = 3;
|
|
||||||
g_counter_fault_led = 0;
|
|
||||||
}
|
|
||||||
} else if (g_step_fault_led == 3) {
|
|
||||||
if (g_counter_fault_led > (g_led_loop_reconnect >= 0x03
|
|
||||||
? YELLOW_OFF_MIDDLE
|
|
||||||
: YELLOW_OFF_LONG)) {
|
|
||||||
LED_YELLOW_ON;
|
|
||||||
g_step_fault_led = 0;
|
|
||||||
g_counter_fault_led = 0;
|
|
||||||
|
|
||||||
// 慢闪模式(低频故障)需要额外步骤
|
if (N == 0) {
|
||||||
if (g_led_loop_reconnect >= 0x03) {
|
/*--- 模式1: 无断开记录 → 灭 ---*/
|
||||||
g_step_fault_led = 4;
|
LED_YELLOW_OFF;
|
||||||
}
|
g_fault_tick = 0;
|
||||||
}
|
g_fault_phase = 0;
|
||||||
} else if (g_step_fault_led == 4) {
|
return;
|
||||||
if (g_counter_fault_led > YELLOW_ON_SHORT) {
|
}
|
||||||
LED_YELLOW_OFF;
|
|
||||||
g_step_fault_led = 5;
|
/*--- 模式2: N 短闪 (N=1,2,3) ---*/
|
||||||
g_counter_fault_led = 0;
|
if (N > 3) N = 3; // 最多 3 闪
|
||||||
}
|
|
||||||
} else if (g_step_fault_led == 5) {
|
uint8_t phases_total = N * 2; // N 个 ON_short + N 个 GAP_short
|
||||||
if (g_counter_fault_led > YELLOW_OFF_LONG) {
|
uint16_t duration;
|
||||||
LED_YELLOW_ON;
|
|
||||||
g_step_fault_led = 0;
|
if (g_fault_phase < phases_total) {
|
||||||
g_counter_fault_led = 0;
|
/* ON 或 GAP 阶段 */
|
||||||
}
|
duration = (g_fault_phase & 1) ? FLT_GAP_SHORT : FLT_ON_SHORT;
|
||||||
|
|
||||||
|
if (g_fault_phase & 1) {
|
||||||
|
LED_YELLOW_OFF; // 奇数阶段: 灭
|
||||||
|
} else {
|
||||||
|
LED_YELLOW_ON; // 偶数阶段: 亮
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* LONG 间隔阶段 */
|
||||||
|
duration = FLT_GAP_LONG;
|
||||||
|
LED_YELLOW_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_fault_tick >= duration) {
|
||||||
|
g_fault_tick = 0;
|
||||||
|
g_fault_phase++;
|
||||||
|
if (g_fault_phase > phases_total) {
|
||||||
|
g_fault_phase = 0; // 循环
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,10 +290,10 @@ void INIT_VD(void)
|
|||||||
Hold_CNT = 0;
|
Hold_CNT = 0;
|
||||||
|
|
||||||
g_loop_power_up_state = 0;
|
g_loop_power_up_state = 0;
|
||||||
g_led_loop_reconnect = 0;
|
g_disconnect_count = 0;
|
||||||
g_flag_faul_reconnect = 0;
|
g_disconnect_active = 0;
|
||||||
g_step_fault_led = 0;
|
g_fault_phase = 0;
|
||||||
g_counter_fault_led = 0;
|
g_fault_tick = 0;
|
||||||
|
|
||||||
/* 读取拨码初始状态 */
|
/* 读取拨码初始状态 */
|
||||||
sw0 = gpio_input_data_bit_read(SW5_BUTTON_PORT, SW5_BUTTON_PIN) << 4;
|
sw0 = gpio_input_data_bit_read(SW5_BUTTON_PORT, SW5_BUTTON_PIN) << 4;
|
||||||
@@ -647,7 +640,7 @@ void loop_task_function(void *pvParameters)
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (loop1_LOOP_OK) {
|
if (loop1_LOOP_OK) {
|
||||||
/*--- 线圈重连检测 ---*/
|
/*--- 线圈重连 ---*/
|
||||||
if (!loop1_LOOP_OK0) {
|
if (!loop1_LOOP_OK0) {
|
||||||
/* 线圈恢复:绿灯闪烁提示 */
|
/* 线圈恢复:绿灯闪烁提示 */
|
||||||
int i;
|
int i;
|
||||||
@@ -658,25 +651,22 @@ void loop_task_function(void *pvParameters)
|
|||||||
vTaskDelay(200);
|
vTaskDelay(200);
|
||||||
}
|
}
|
||||||
loop1_LOOP_OK0 = 1;
|
loop1_LOOP_OK0 = 1;
|
||||||
|
g_disconnect_active = 0; // 重连,清除断开标记
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loop1_CAP_OK) {
|
if (loop1_CAP_OK) {
|
||||||
loop1_CAP_OK = 0;
|
loop1_CAP_OK = 0;
|
||||||
|
|
||||||
|
/* 首次成功测量 → 标记线圈已连接 */
|
||||||
|
if (!g_loop_power_up_state) {
|
||||||
|
g_loop_power_up_state = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* 核心检测算法 */
|
/* 核心检测算法 */
|
||||||
vd1_task();
|
vd1_task();
|
||||||
|
|
||||||
/* 拨码开关轮询 */
|
/* 拨码开关轮询 */
|
||||||
poll_sw_state();
|
poll_sw_state();
|
||||||
|
|
||||||
/* 线圈重连故障指示 */
|
|
||||||
if (g_led_loop_reconnect) {
|
|
||||||
g_led_loop_reconnect &= 0x0F;
|
|
||||||
g_led_loop_reconnect++;
|
|
||||||
if (g_led_loop_reconnect > 3) {
|
|
||||||
g_led_loop_reconnect = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/*--- 线圈断开 ---*/
|
/*--- 线圈断开 ---*/
|
||||||
@@ -685,11 +675,19 @@ void loop_task_function(void *pvParameters)
|
|||||||
RLY2_OFF;
|
RLY2_OFF;
|
||||||
LEDB_OFF;
|
LEDB_OFF;
|
||||||
|
|
||||||
/* 首次检测到断开:标记故障 */
|
/*
|
||||||
if (!g_led_loop_reconnect) {
|
* 断开计数规则:
|
||||||
g_led_loop_reconnect = 0x02;
|
* - 从未连接过上电 (g_loop_power_up_state == 0): 不计入
|
||||||
g_counter_fault_led = 0;
|
* - g_disconnect_active == 0: 新的断开 → 计数+1
|
||||||
g_step_fault_led = 0;
|
* - g_disconnect_active == 1: 同一次断开,不重复计数
|
||||||
|
*/
|
||||||
|
if (g_loop_power_up_state && !g_disconnect_active) {
|
||||||
|
g_disconnect_active = 1;
|
||||||
|
if (g_disconnect_count < 3) {
|
||||||
|
g_disconnect_count++;
|
||||||
|
}
|
||||||
|
g_fault_phase = 0;
|
||||||
|
g_fault_tick = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
vTaskDelay(150);
|
vTaskDelay(150);
|
||||||
|
|||||||
Reference in New Issue
Block a user