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

199 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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