Electricity/间断性放电功能说明.md

4.4 KiB
Raw Blame History

间断性放电功能说明

功能概述

本系统实现了间断性电刺激放电功能,具体表现为:

  • 前10秒:开启电刺激,输出方波信号
  • 后10秒:关闭电刺激,停止输出
  • 循环往复每20秒为一个完整周期

实现原理

1. 控制变量

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

2. 时间控制逻辑

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

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. 电刺激控制函数

启动电刺激

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

停止电刺激

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

处理电刺激

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. 可扩展性

  • 可以轻松修改开启/关闭时间
  • 支持不同的电刺激参数

参数配置

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

// 修改开启时间(秒)
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 变量状态
  • 确认条件判断逻辑正确