# 间断性放电功能说明

## 功能概述

本系统实现了间断性电刺激放电功能，具体表现为：
- **前10秒**：开启电刺激，输出方波信号
- **后10秒**：关闭电刺激，停止输出
- **循环往复**：每20秒为一个完整周期

## 实现原理

### 1. 控制变量

```c
static uint8_t ems_control_count = 0;  // 电刺激控制计数器
static uint8_t ems_state = 0;          // 电刺激状态：0=关闭，1=开启
```

### 2. 时间控制逻辑

基于1秒定时器中断，在1秒任务中实现控制：

```c
if (time_flags->T_1s) {
    ems_control_count++;  // 每秒递增计数器
    
    if (ems_control_count <= 10) {
        // 前10秒：开启电刺激
        if (ems_state == 0) {
            ems_state = 1;
            EMS_Start();  // 启动电刺激
        }
        EMS_Process();  // 处理电刺激
    } else if (ems_control_count <= 20) {
        // 后10秒：关闭电刺激
        if (ems_state == 1) {
            ems_state = 0;
            EMS_Stop();  // 停止电刺激
        }
    } else {
        // 重置计数器，开始新的周期
        ems_control_count = 0;
    }
}
```

### 3. 电刺激控制函数

#### 启动电刺激
```c
void EMS_Start(void)
{
    wavegen_Start();
    printf("电刺激已启动\n");
}
```

#### 停止电刺激
```c
void EMS_Stop(void)
{
    g_ems_running = 0;
    g_ems_count = 0;  // 重置计数器
    wavegen_Stop(WAVE_GEN_DRVA_BLK0);
    printf("电刺激已停止\n");
}
```

#### 处理电刺激
```c
void EMS_Process(void)
{
    if(g_ems_running) {
        // 只有在运行状态时才处理电刺激
        g_ems_count++;
        // ... 电刺激处理逻辑
    }
}
```

## 工作流程

### 1. 系统启动
- 初始化电刺激参数
- 设置初始状态为关闭
- 计数器清零

### 2. 第一个10秒周期（开启阶段）
- 第1秒：检测到状态变化，调用 `EMS_Start()`
- 第1-10秒：每1秒调用 `EMS_Process()` 处理电刺激
- 输出方波信号

### 3. 第二个10秒周期（关闭阶段）
- 第11秒：检测到状态变化，调用 `EMS_Stop()`
- 第11-20秒：停止电刺激处理
- 无信号输出

### 4. 周期重置
- 第21秒：计数器重置为0
- 开始新的20秒周期

## 调试输出

系统会输出以下调试信息：

```
电刺激开启 - 第1秒
电刺激已启动
1s定时任务执行 - 系统运行正常，电刺激状态: 开启
...
电刺激关闭 - 第11秒
电刺激已停止
1s定时任务执行 - 系统运行正常，电刺激状态: 关闭
...
电刺激周期重置
```

## 关键改进点

### 1. 变量作用域
- 使用 `static` 关键字确保变量在函数调用间保持状态
- 避免每次循环重新初始化计数器

### 2. 状态管理
- 使用 `ems_state` 标志位跟踪当前状态
- 只在状态变化时执行启动/停止操作

### 3. 函数调用
- 明确调用 `EMS_Start()` 和 `EMS_Stop()` 函数
- 确保电刺激模块正确响应控制命令

### 4. 计数器重置
- 在停止时重置内部计数器
- 确保下次启动时从正确状态开始

## 测试验证

### 1. 硬件测试
- 用示波器监测电刺激输出
- 观察10秒开启/10秒关闭的周期
- 验证GPIO19的1秒翻转

### 2. 软件测试
- 通过UART观察调试输出
- 确认状态切换正确
- 验证计数器正常工作

### 3. 功能验证
- 电刺激强度：128（中等强度）
- 频率：100Hz
- 升压电压：26V
- 工作周期：20秒（10秒开启 + 10秒关闭）

## 注意事项

### 1. 安全性
- 确保电刺激停止时完全关闭输出
- 避免意外的高强度输出

### 2. 实时性
- 基于1秒定时器，时间精度较高
- 状态切换响应及时

### 3. 可扩展性
- 可以轻松修改开启/关闭时间
- 支持不同的电刺激参数

## 参数配置

可以通过修改以下参数来调整功能：

```c
// 修改开启时间（秒）
if (ems_control_count <= 10) {  // 改为其他值

// 修改关闭时间（秒）
} else if (ems_control_count <= 20) {  // 改为其他值

// 修改电刺激强度
EMS_Config_TypeDef ems_config = {
    .intensity = 128,  // 改为其他值
    // ...
};
```

## 故障排除

### 1. 电刺激不停止
- 检查 `EMS_Stop()` 函数是否正确调用
- 确认 `g_ems_running` 标志位被正确清零

### 2. 时间控制不准确
- 检查定时器中断是否正常工作
- 确认计数器逻辑正确

### 3. 状态切换异常
- 检查 `ems_state` 变量状态
- 确认条件判断逻辑正确
