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. 功能验证
|
||
- 测试不同强度值
|
||
- 验证时间分配
|
||
- 确认循环工作正常
|