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

199 lines
4.4 KiB
Markdown
Raw Normal View History

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