5.8 KiB
5.8 KiB
缓进缓出功能说明
功能概述
缓进缓出功能实现了电刺激强度的渐进式控制,避免突然的强度变化给用户带来的不适感。整个10秒的电刺激周期被分为三个阶段:
- 缓进阶段(2秒):强度从0逐渐增加到设定最大值
- 保持阶段(6秒):保持最大强度
- 缓出阶段(2秒):强度从最大值逐渐降低到0
实现原理
1. 时间控制
基于2ms定时器中断,实现精确的强度控制:
// 计算每个强度步进的时间间隔(微秒)
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. 阶段控制
switch (g_ramp_phase) {
case 0: // 缓进阶段
// 强度从0增加到设定值
break;
case 1: // 保持阶段
// 保持最大强度
break;
case 2: // 缓出阶段
// 强度从设定值降低到0
break;
}
配置参数
1. 结构体定义
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. 当前配置
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. 缓进缓出处理函数
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. 电刺激处理函数
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. 修改时间分配
// 修改为3秒缓进,4秒保持,3秒缓出
.ramp_up_time = 3, // 缓进时间:3秒
.hold_time = 4, // 保持时间:4秒
.ramp_down_time = 3, // 缓出时间:3秒
2. 修改目标强度
.intensity = 200, // 修改目标强度为200
3. 禁用缓进缓出
.enable_ramp = 0 // 禁用渐进控制,直接使用设定强度
优势特点
1. 用户体验
- 避免突然的强度变化
- 减少刺痛感
- 提供舒适的刺激体验
2. 安全性
- 渐进式强度控制
- 避免过度刺激
- 可控的强度范围
3. 灵活性
- 可调节的时间分配
- 可配置的目标强度
- 可启用的功能开关
注意事项
1. 时间精度
- 确保2ms定时器正常工作
- 注意微秒计时器的溢出处理
- 验证步进间隔的计算准确性
2. 强度范围
- 强度值范围:0-255
- 避免超出硬件限制
- 考虑用户承受能力
3. 系统资源
- 缓进缓出处理在2ms中断中执行
- 保持中断处理简洁
- 避免影响其他功能
测试验证
1. 硬件测试
- 用示波器观察梯形波形
- 验证时间精度
- 检查强度变化平滑性
2. 软件测试
- 通过UART观察调试输出
- 确认阶段切换正确
- 验证强度计算准确
3. 功能验证
- 测试不同强度值
- 验证时间分配
- 确认循环工作正常