# 缓进缓出功能说明

## 功能概述

缓进缓出功能实现了电刺激强度的渐进式控制，避免突然的强度变化给用户带来的不适感。整个10秒的电刺激周期被分为三个阶段：

- **缓进阶段（2秒）**：强度从0逐渐增加到设定最大值
- **保持阶段（6秒）**：保持最大强度
- **缓出阶段（2秒）**：强度从最大值逐渐降低到0

## 实现原理

### 1. 时间控制

基于2ms定时器中断，实现精确的强度控制：

```c
// 计算每个强度步进的时间间隔（微秒）
uint32_t step_interval = (g_ems_config.ramp_up_time * 2000000) / g_ems_config.intensity;
// 例如：2秒 = 2000000微秒，强度128，则每15625微秒增加1个强度单位
```

### 2. 强度计算

根据您的计算：
- 总时间：2秒 = 2,000,000微秒
- 目标强度：128
- 步进间隔：2,000,000 / 128 = 15,625微秒
- 每15,625微秒增加/减少1个强度单位

### 3. 阶段控制

```c
switch (g_ramp_phase) {
    case 0:  // 缓进阶段
        // 强度从0增加到设定值
        break;
    case 1:  // 保持阶段
        // 保持最大强度
        break;
    case 2:  // 缓出阶段
        // 强度从设定值降低到0
        break;
}
```

## 配置参数

### 1. 结构体定义

```c
typedef struct {
    uint16_t frequency;      // 频率 (Hz)
    uint16_t duration;       // 持续时间 (ms)
    uint16_t intensity;      // 强度 (0-255)
    uint16_t rest_time;      // 休息时间 (ms)
    uint16_t silent_time;    // 静默时间 (ms)
    
    // 缓进缓出控制参数
    uint8_t ramp_up_time;     // 缓进时间：2秒
    uint8_t hold_time;        // 保持时间：6秒
    uint8_t ramp_down_time;   // 缓出时间：2秒
    uint8_t enable_ramp;      // 启用渐进控制
} EMS_Config_TypeDef;
```

### 2. 当前配置

```c
EMS_Config_TypeDef ems_config = {
    .frequency = 100,        // 100Hz
    .duration = 1000,        // 1000ms
    .intensity = 128,        // 中等强度
    .rest_time = 100,        // 100ms休息时间
    .silent_time = 50,       // 50ms静默时间
    
    // 缓进缓出控制参数
    .ramp_up_time = 2,       // 缓进时间：2秒
    .hold_time = 6,          // 保持时间：6秒
    .ramp_down_time = 2,     // 缓出时间：2秒
    .enable_ramp = 1         // 启用渐进控制
};
```

## 工作流程

### 1. 系统启动
- 初始化缓进缓出变量
- 设置初始强度为0
- 进入缓进阶段

### 2. 缓进阶段（0-2秒）
- 每15,625微秒增加1个强度单位
- 从0逐渐增加到128
- 2秒后进入保持阶段

### 3. 保持阶段（2-8秒）
- 保持强度为128
- 持续6秒
- 8秒后进入缓出阶段

### 4. 缓出阶段（8-10秒）
- 每15,625微秒减少1个强度单位
- 从128逐渐降低到0
- 10秒后停止电刺激

### 5. 休息阶段（10-20秒）
- 电刺激完全停止
- 持续10秒
- 20秒后重新开始新周期

## 关键函数

### 1. 缓进缓出处理函数

```c
void EMS_Process_Ramp(void)
{
    // 计算步进间隔
    uint32_t step_interval = (g_ems_config.ramp_up_time * 2000000) / g_ems_config.intensity;
    
    // 根据当前阶段调整强度
    switch (g_ramp_phase) {
        case 0:  // 缓进
            if (g_ramp_timer >= step_interval) {
                g_current_intensity++;
            }
            break;
        case 1:  // 保持
            g_current_intensity = g_ems_config.intensity;
            break;
        case 2:  // 缓出
            if (g_ramp_timer >= step_interval) {
                g_current_intensity--;
            }
            break;
    }
}
```

### 2. 电刺激处理函数

```c
void EMS_Process(void)
{
    if(g_ems_running) {
        // 使用当前缓进缓出的强度
        uint16_t current_intensity = g_current_intensity;
        
        // 生成方波信号
        wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity);
    }
}
```

## 波形特征

### 1. 梯形波形
在示波器上观察到的波形将呈现梯形特征：
- **上升沿**：2秒内从0V逐渐上升到最大电压
- **平顶**：6秒内保持最大电压
- **下降沿**：2秒内从最大电压逐渐下降到0V
- **平底**：10秒内保持0V

### 2. 时间精度
- 基于2ms定时器中断
- 强度变化精度：15,625微秒
- 总时间精度：±2ms

## 调试输出

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

```
缓进缓出控制已启动 - 缓进阶段开始
缓进完成 - 进入保持阶段, 强度: 128
保持完成 - 进入缓出阶段
缓出完成 - 强度降至0
电刺激已停止
```

## 参数调整

### 1. 修改时间分配

```c
// 修改为3秒缓进，4秒保持，3秒缓出
.ramp_up_time = 3,     // 缓进时间：3秒
.hold_time = 4,        // 保持时间：4秒
.ramp_down_time = 3,   // 缓出时间：3秒
```

### 2. 修改目标强度

```c
.intensity = 200,      // 修改目标强度为200
```

### 3. 禁用缓进缓出

```c
.enable_ramp = 0       // 禁用渐进控制，直接使用设定强度
```

## 优势特点

### 1. 用户体验
- 避免突然的强度变化
- 减少刺痛感
- 提供舒适的刺激体验

### 2. 安全性
- 渐进式强度控制
- 避免过度刺激
- 可控的强度范围

### 3. 灵活性
- 可调节的时间分配
- 可配置的目标强度
- 可启用的功能开关

## 注意事项

### 1. 时间精度
- 确保2ms定时器正常工作
- 注意微秒计时器的溢出处理
- 验证步进间隔的计算准确性

### 2. 强度范围
- 强度值范围：0-255
- 避免超出硬件限制
- 考虑用户承受能力

### 3. 系统资源
- 缓进缓出处理在2ms中断中执行
- 保持中断处理简洁
- 避免影响其他功能

## 测试验证

### 1. 硬件测试
- 用示波器观察梯形波形
- 验证时间精度
- 检查强度变化平滑性

### 2. 软件测试
- 通过UART观察调试输出
- 确认阶段切换正确
- 验证强度计算准确

### 3. 功能验证
- 测试不同强度值
- 验证时间分配
- 确认循环工作正常
