# 缓进缓出功能说明 ## 功能概述 缓进缓出功能实现了电刺激强度的渐进式控制,避免突然的强度变化给用户带来的不适感。整个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. 功能验证 - 测试不同强度值 - 验证时间分配 - 确认循环工作正常