255 lines
5.8 KiB
Markdown
255 lines
5.8 KiB
Markdown
|
|
# 缓进缓出功能说明
|
|||
|
|
|
|||
|
|
## 功能概述
|
|||
|
|
|
|||
|
|
缓进缓出功能实现了电刺激强度的渐进式控制,避免突然的强度变化给用户带来的不适感。整个10秒的电刺激周期被分为三个阶段:
|
|||
|
|
|
|||
|
|
- **缓进阶段(2秒)**:强度从0逐渐增加到设定最大值
|
|||
|
|
- **保持阶段(6秒)**:保持最大强度
|
|||
|
|
- **缓出阶段(2秒)**:强度从最大值逐渐降低到0
|
|||
|
|
|
|||
|
|
## 实现原理
|
|||
|
|
|
|||
|
|
### 1. 时间控制
|
|||
|
|
|
|||
|
|
基于2ms定时器中断,实现精确的强度控制:
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// 计算每个强度步进的时间间隔(微秒)
|
|||
|
|
uint32_t step_interval = (g_ems_config.ramp_up_time * 2000000) / g_ems_config.intensity;
|
|||
|
|
// 例如:2秒 = 2000000微秒,强度128,则每15625微秒增加1个强度单位
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 强度计算
|
|||
|
|
|
|||
|
|
根据您的计算:
|
|||
|
|
- 总时间:2秒 = 2,000,000微秒
|
|||
|
|
- 目标强度:128
|
|||
|
|
- 步进间隔:2,000,000 / 128 = 15,625微秒
|
|||
|
|
- 每15,625微秒增加/减少1个强度单位
|
|||
|
|
|
|||
|
|
### 3. 阶段控制
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
switch (g_ramp_phase) {
|
|||
|
|
case 0: // 缓进阶段
|
|||
|
|
// 强度从0增加到设定值
|
|||
|
|
break;
|
|||
|
|
case 1: // 保持阶段
|
|||
|
|
// 保持最大强度
|
|||
|
|
break;
|
|||
|
|
case 2: // 缓出阶段
|
|||
|
|
// 强度从设定值降低到0
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 配置参数
|
|||
|
|
|
|||
|
|
### 1. 结构体定义
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
typedef struct {
|
|||
|
|
uint16_t frequency; // 频率 (Hz)
|
|||
|
|
uint16_t duration; // 持续时间 (ms)
|
|||
|
|
uint16_t intensity; // 强度 (0-255)
|
|||
|
|
uint16_t rest_time; // 休息时间 (ms)
|
|||
|
|
uint16_t silent_time; // 静默时间 (ms)
|
|||
|
|
|
|||
|
|
// 缓进缓出控制参数
|
|||
|
|
uint8_t ramp_up_time; // 缓进时间:2秒
|
|||
|
|
uint8_t hold_time; // 保持时间:6秒
|
|||
|
|
uint8_t ramp_down_time; // 缓出时间:2秒
|
|||
|
|
uint8_t enable_ramp; // 启用渐进控制
|
|||
|
|
} EMS_Config_TypeDef;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 当前配置
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
EMS_Config_TypeDef ems_config = {
|
|||
|
|
.frequency = 100, // 100Hz
|
|||
|
|
.duration = 1000, // 1000ms
|
|||
|
|
.intensity = 128, // 中等强度
|
|||
|
|
.rest_time = 100, // 100ms休息时间
|
|||
|
|
.silent_time = 50, // 50ms静默时间
|
|||
|
|
|
|||
|
|
// 缓进缓出控制参数
|
|||
|
|
.ramp_up_time = 2, // 缓进时间:2秒
|
|||
|
|
.hold_time = 6, // 保持时间:6秒
|
|||
|
|
.ramp_down_time = 2, // 缓出时间:2秒
|
|||
|
|
.enable_ramp = 1 // 启用渐进控制
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 工作流程
|
|||
|
|
|
|||
|
|
### 1. 系统启动
|
|||
|
|
- 初始化缓进缓出变量
|
|||
|
|
- 设置初始强度为0
|
|||
|
|
- 进入缓进阶段
|
|||
|
|
|
|||
|
|
### 2. 缓进阶段(0-2秒)
|
|||
|
|
- 每15,625微秒增加1个强度单位
|
|||
|
|
- 从0逐渐增加到128
|
|||
|
|
- 2秒后进入保持阶段
|
|||
|
|
|
|||
|
|
### 3. 保持阶段(2-8秒)
|
|||
|
|
- 保持强度为128
|
|||
|
|
- 持续6秒
|
|||
|
|
- 8秒后进入缓出阶段
|
|||
|
|
|
|||
|
|
### 4. 缓出阶段(8-10秒)
|
|||
|
|
- 每15,625微秒减少1个强度单位
|
|||
|
|
- 从128逐渐降低到0
|
|||
|
|
- 10秒后停止电刺激
|
|||
|
|
|
|||
|
|
### 5. 休息阶段(10-20秒)
|
|||
|
|
- 电刺激完全停止
|
|||
|
|
- 持续10秒
|
|||
|
|
- 20秒后重新开始新周期
|
|||
|
|
|
|||
|
|
## 关键函数
|
|||
|
|
|
|||
|
|
### 1. 缓进缓出处理函数
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
void EMS_Process_Ramp(void)
|
|||
|
|
{
|
|||
|
|
// 计算步进间隔
|
|||
|
|
uint32_t step_interval = (g_ems_config.ramp_up_time * 2000000) / g_ems_config.intensity;
|
|||
|
|
|
|||
|
|
// 根据当前阶段调整强度
|
|||
|
|
switch (g_ramp_phase) {
|
|||
|
|
case 0: // 缓进
|
|||
|
|
if (g_ramp_timer >= step_interval) {
|
|||
|
|
g_current_intensity++;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 1: // 保持
|
|||
|
|
g_current_intensity = g_ems_config.intensity;
|
|||
|
|
break;
|
|||
|
|
case 2: // 缓出
|
|||
|
|
if (g_ramp_timer >= step_interval) {
|
|||
|
|
g_current_intensity--;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 电刺激处理函数
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
void EMS_Process(void)
|
|||
|
|
{
|
|||
|
|
if(g_ems_running) {
|
|||
|
|
// 使用当前缓进缓出的强度
|
|||
|
|
uint16_t current_intensity = g_current_intensity;
|
|||
|
|
|
|||
|
|
// 生成方波信号
|
|||
|
|
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 波形特征
|
|||
|
|
|
|||
|
|
### 1. 梯形波形
|
|||
|
|
在示波器上观察到的波形将呈现梯形特征:
|
|||
|
|
- **上升沿**:2秒内从0V逐渐上升到最大电压
|
|||
|
|
- **平顶**:6秒内保持最大电压
|
|||
|
|
- **下降沿**:2秒内从最大电压逐渐下降到0V
|
|||
|
|
- **平底**:10秒内保持0V
|
|||
|
|
|
|||
|
|
### 2. 时间精度
|
|||
|
|
- 基于2ms定时器中断
|
|||
|
|
- 强度变化精度:15,625微秒
|
|||
|
|
- 总时间精度:±2ms
|
|||
|
|
|
|||
|
|
## 调试输出
|
|||
|
|
|
|||
|
|
系统会输出以下调试信息:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
缓进缓出控制已启动 - 缓进阶段开始
|
|||
|
|
缓进完成 - 进入保持阶段, 强度: 128
|
|||
|
|
保持完成 - 进入缓出阶段
|
|||
|
|
缓出完成 - 强度降至0
|
|||
|
|
电刺激已停止
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 参数调整
|
|||
|
|
|
|||
|
|
### 1. 修改时间分配
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
// 修改为3秒缓进,4秒保持,3秒缓出
|
|||
|
|
.ramp_up_time = 3, // 缓进时间:3秒
|
|||
|
|
.hold_time = 4, // 保持时间:4秒
|
|||
|
|
.ramp_down_time = 3, // 缓出时间:3秒
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 修改目标强度
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
.intensity = 200, // 修改目标强度为200
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 禁用缓进缓出
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
.enable_ramp = 0 // 禁用渐进控制,直接使用设定强度
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 优势特点
|
|||
|
|
|
|||
|
|
### 1. 用户体验
|
|||
|
|
- 避免突然的强度变化
|
|||
|
|
- 减少刺痛感
|
|||
|
|
- 提供舒适的刺激体验
|
|||
|
|
|
|||
|
|
### 2. 安全性
|
|||
|
|
- 渐进式强度控制
|
|||
|
|
- 避免过度刺激
|
|||
|
|
- 可控的强度范围
|
|||
|
|
|
|||
|
|
### 3. 灵活性
|
|||
|
|
- 可调节的时间分配
|
|||
|
|
- 可配置的目标强度
|
|||
|
|
- 可启用的功能开关
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
### 1. 时间精度
|
|||
|
|
- 确保2ms定时器正常工作
|
|||
|
|
- 注意微秒计时器的溢出处理
|
|||
|
|
- 验证步进间隔的计算准确性
|
|||
|
|
|
|||
|
|
### 2. 强度范围
|
|||
|
|
- 强度值范围:0-255
|
|||
|
|
- 避免超出硬件限制
|
|||
|
|
- 考虑用户承受能力
|
|||
|
|
|
|||
|
|
### 3. 系统资源
|
|||
|
|
- 缓进缓出处理在2ms中断中执行
|
|||
|
|
- 保持中断处理简洁
|
|||
|
|
- 避免影响其他功能
|
|||
|
|
|
|||
|
|
## 测试验证
|
|||
|
|
|
|||
|
|
### 1. 硬件测试
|
|||
|
|
- 用示波器观察梯形波形
|
|||
|
|
- 验证时间精度
|
|||
|
|
- 检查强度变化平滑性
|
|||
|
|
|
|||
|
|
### 2. 软件测试
|
|||
|
|
- 通过UART观察调试输出
|
|||
|
|
- 确认阶段切换正确
|
|||
|
|
- 验证强度计算准确
|
|||
|
|
|
|||
|
|
### 3. 功能验证
|
|||
|
|
- 测试不同强度值
|
|||
|
|
- 验证时间分配
|
|||
|
|
- 确认循环工作正常
|