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