Electricity/缓进缓出功能说明.md

5.8 KiB
Raw Blame History

缓进缓出功能说明

功能概述

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

  • 缓进阶段2秒强度从0逐渐增加到设定最大值
  • 保持阶段6秒:保持最大强度
  • 缓出阶段2秒强度从最大值逐渐降低到0

实现原理

1. 时间控制

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

// 计算每个强度步进的时间间隔(微秒)
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. 阶段控制

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

配置参数

1. 结构体定义

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. 当前配置

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. 缓进缓出处理函数

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. 电刺激处理函数

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. 修改时间分配

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

2. 修改目标强度

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

3. 禁用缓进缓出

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

优势特点

1. 用户体验

  • 避免突然的强度变化
  • 减少刺痛感
  • 提供舒适的刺激体验

2. 安全性

  • 渐进式强度控制
  • 避免过度刺激
  • 可控的强度范围

3. 灵活性

  • 可调节的时间分配
  • 可配置的目标强度
  • 可启用的功能开关

注意事项

1. 时间精度

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

2. 强度范围

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

3. 系统资源

  • 缓进缓出处理在2ms中断中执行
  • 保持中断处理简洁
  • 避免影响其他功能

测试验证

1. 硬件测试

  • 用示波器观察梯形波形
  • 验证时间精度
  • 检查强度变化平滑性

2. 软件测试

  • 通过UART观察调试输出
  • 确认阶段切换正确
  • 验证强度计算准确

3. 功能验证

  • 测试不同强度值
  • 验证时间分配
  • 确认循环工作正常