4.4 KiB
4.4 KiB
间断性放电功能说明
功能概述
本系统实现了间断性电刺激放电功能,具体表现为:
- 前10秒:开启电刺激,输出方波信号
- 后10秒:关闭电刺激,停止输出
- 循环往复:每20秒为一个完整周期
实现原理
1. 控制变量
static uint8_t ems_control_count = 0; // 电刺激控制计数器
static uint8_t ems_state = 0; // 电刺激状态:0=关闭,1=开启
2. 时间控制逻辑
基于1秒定时器中断,在1秒任务中实现控制:
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. 电刺激控制函数
启动电刺激
void EMS_Start(void)
{
wavegen_Start();
printf("电刺激已启动\n");
}
停止电刺激
void EMS_Stop(void)
{
g_ems_running = 0;
g_ems_count = 0; // 重置计数器
wavegen_Stop(WAVE_GEN_DRVA_BLK0);
printf("电刺激已停止\n");
}
处理电刺激
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. 可扩展性
- 可以轻松修改开启/关闭时间
- 支持不同的电刺激参数
参数配置
可以通过修改以下参数来调整功能:
// 修改开启时间(秒)
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变量状态 - 确认条件判断逻辑正确