# 间断性放电功能说明 ## 功能概述 本系统实现了间断性电刺激放电功能,具体表现为: - **前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` 变量状态 - 确认条件判断逻辑正确