forth commit

This commit is contained in:
ZhangJinLong 2025-09-29 09:35:45 +08:00
parent aa5edb1e1d
commit b04950de34
22 changed files with 5402 additions and 8616 deletions

View File

@ -1 +1 @@
33d9c494907a9f6ffbde494b135227f9 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin 2480e295a6720eac43ef0ee8cc58eb9d C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/SIM_S3_1.bin

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
52541c9f3f488e236c16b0e074f47f40b3cdfaed aa5edb1e1d1e2c9228e9ebe7a2633a8ec50ab3b3

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -132,3 +132,5 @@
61 342 7807322132320852 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec 61 342 7807322132320852 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
52 297 7807323764513411 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec 52 297 7807323764513411 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
52 297 7807323764513411 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec 52 297 7807323764513411 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
32 271 7808122893643811 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec
32 271 7808122893643811 C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 478611ec8c141aec

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1 @@
Command: ninja all

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
{ {
"version": "1.2", "version": "1.2",
"project_name": "SIM_S3_1", "project_name": "SIM_S3_1",
"project_version": "52541c9-dirty", "project_version": "aa5edb1-dirty",
"project_path": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1", "project_path": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1",
"idf_path": "C:/Espressif/frameworks/esp-idf-v5.5", "idf_path": "C:/Espressif/frameworks/esp-idf-v5.5",
"build_dir": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build", "build_dir": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build",

View File

@ -12,6 +12,13 @@ extern "C" {
typedef enum { typedef enum {
ECG_LEAD_I = 0, // I导联右手到左手 ECG_LEAD_I = 0, // I导联右手到左手
ECG_LEAD_II = 1, // II导联右手到左腿 ECG_LEAD_II = 1, // II导联右手到左腿
ECG_LEAD_III = 2, // III导联左手到左腿
ECG_LEAD_V1 = 3, // V1导联胸骨右缘第四肋间
ECG_LEAD_V2 = 4, // V2导联
ECG_LEAD_V3 = 5, // V3导联过渡区
ECG_LEAD_V4 = 6, // V4导联高R波
ECG_LEAD_V5 = 7, // V5导联
ECG_LEAD_V6 = 8 // V6导联
} ecg_lead_t; } ecg_lead_t;
// ECG生成器结构体 // ECG生成器结构体
@ -32,6 +39,7 @@ typedef struct {
float r_amp_ratio; // R波幅度比例 float r_amp_ratio; // R波幅度比例
float s_amp_ratio; // S波幅度比例 float s_amp_ratio; // S波幅度比例
float t_amp_ratio; // T波幅度比例 float t_amp_ratio; // T波幅度比例
bool p_bidirectional; // P波是否双向
// 固定时间参数 (保持正常ECG时序) // 固定时间参数 (保持正常ECG时序)
float p_width; // P波宽度 float p_width; // P波宽度

View File

@ -52,6 +52,7 @@ void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t le
generator->r_amp_ratio = 0.7f; // R波中等 generator->r_amp_ratio = 0.7f; // R波中等
generator->s_amp_ratio = 0.3f; // S波 generator->s_amp_ratio = 0.3f; // S波
generator->t_amp_ratio = 0.3f; // T波中等 generator->t_amp_ratio = 0.3f; // T波中等
generator->p_bidirectional = false;
break; break;
case ECG_LEAD_II: case ECG_LEAD_II:
@ -61,9 +62,78 @@ void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t le
generator->r_amp_ratio = 1.0f; // R波最大 generator->r_amp_ratio = 1.0f; // R波最大
generator->s_amp_ratio = 0.4f; // S波 generator->s_amp_ratio = 0.4f; // S波
generator->t_amp_ratio = 0.4f; // T波明显 generator->t_amp_ratio = 0.4f; // T波明显
generator->p_bidirectional = false;
break; break;
case ECG_LEAD_III:
// III导联参数 - 左手到左腿
generator->p_amp_ratio = 0.18f; // P波
generator->q_amp_ratio = 0.35f; // Q波可能较深
generator->r_amp_ratio = 0.8f; // R波
generator->s_amp_ratio = 0.35f; // S波
generator->t_amp_ratio = 0.35f; // T波
generator->p_bidirectional = false;
break;
case ECG_LEAD_V1:
// V1导联参数 - 胸骨右缘第四肋间
generator->p_amp_ratio = 0.08f; // P波双向
generator->q_amp_ratio = 0.0f; // 无Q波
generator->r_amp_ratio = 0.25f; // 小r波
generator->s_amp_ratio = 1.0f; // 深S波
generator->t_amp_ratio = -0.15f; // T波倒置
generator->p_bidirectional = true; // V1导联启用双向P波
break;
case ECG_LEAD_V2:
// V2导联参数
generator->p_amp_ratio = 0.10f;
generator->q_amp_ratio = 0.0f;
generator->r_amp_ratio = 0.45f;
generator->s_amp_ratio = 0.85f;
generator->t_amp_ratio = -0.10f;
generator->p_bidirectional = false;
break;
case ECG_LEAD_V3:
// V3导联参数 - 过渡区
generator->p_amp_ratio = 0.12f;
generator->q_amp_ratio = 0.05f;
generator->r_amp_ratio = 0.80f;
generator->s_amp_ratio = 0.50f;
generator->t_amp_ratio = 0.10f;
generator->p_bidirectional = false;
break;
case ECG_LEAD_V4:
// V4导联参数 - 高R波
generator->p_amp_ratio = 0.12f;
generator->q_amp_ratio = 0.08f;
generator->r_amp_ratio = 1.20f;
generator->s_amp_ratio = 0.25f;
generator->t_amp_ratio = 0.25f;
generator->p_bidirectional = false;
break;
case ECG_LEAD_V5:
// V5导联参数 - 高R波
generator->p_amp_ratio = 0.12f;
generator->q_amp_ratio = 0.10f;
generator->r_amp_ratio = 1.10f;
generator->s_amp_ratio = 0.15f;
generator->t_amp_ratio = 0.30f;
generator->p_bidirectional = false;
break;
case ECG_LEAD_V6:
// V6导联参数 - 高R波
generator->p_amp_ratio = 0.12f;
generator->q_amp_ratio = 0.12f;
generator->r_amp_ratio = 0.90f;
generator->s_amp_ratio = 0.10f;
generator->t_amp_ratio = 0.25f;
generator->p_bidirectional = false;
break;
default: default:
// 默认使用II导联 // 默认使用II导联
@ -72,6 +142,7 @@ void ecg_generator_set_lead_parameters(ecg_generator_t *generator, ecg_lead_t le
generator->r_amp_ratio = 1.0f; generator->r_amp_ratio = 1.0f;
generator->s_amp_ratio = 0.4f; generator->s_amp_ratio = 0.4f;
generator->t_amp_ratio = 0.4f; generator->t_amp_ratio = 0.4f;
generator->p_bidirectional = false;
break; break;
} }
@ -209,8 +280,17 @@ float ecg_generator_calculate_sample_realtime(ecg_generator_t *generator) {
float qrs_width_ratio = 0.0125f; // QRS宽度增加到2.5%确保Q、R、S充分重叠 float qrs_width_ratio = 0.0125f; // QRS宽度增加到2.5%确保Q、R、S充分重叠
float t_width_ratio = 0.0625f; // T波宽度0.05/0.8 = 6.25% float t_width_ratio = 0.0625f; // T波宽度0.05/0.8 = 6.25%
// P波 - 修正后的计算 // P波 - 支持双向P波
float p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio)); float p;
if (generator->p_bidirectional) {
// 双向P波先正后负
float p_positive = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
float p_negative = -p_amp * 0.6f * expf(-(t_norm - (p_time_ratio + 0.02f)) * (t_norm - (p_time_ratio + 0.02f)) / (2.0f * p_width_ratio * p_width_ratio));
p = p_positive + p_negative;
} else {
// 单向P波
p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
}
// QRS波群 - 修正后的计算 // QRS波群 - 修正后的计算
float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio)); float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
@ -298,8 +378,17 @@ void ecg_generator_generate_lookup_table(ecg_generator_t *generator) {
float qrs_width_ratio = 0.0125f; // QRS宽度1.25% float qrs_width_ratio = 0.0125f; // QRS宽度1.25%
float t_width_ratio = 0.0625f; // T波宽度6.25% float t_width_ratio = 0.0625f; // T波宽度6.25%
// P波计算 // P波计算 - 支持双向P波
float p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio)); float p;
if (generator->p_bidirectional) {
// 双向P波先正后负
float p_positive = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
float p_negative = -p_amp * 0.6f * expf(-(t_norm - (p_time_ratio + 0.02f)) * (t_norm - (p_time_ratio + 0.02f)) / (2.0f * p_width_ratio * p_width_ratio));
p = p_positive + p_negative;
} else {
// 单向P波
p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
}
// QRS波群计算 // QRS波群计算
float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio)); float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));

View File

@ -21,6 +21,12 @@ static const char *TAG = "MAIN";
// 信号生成器相关 // 信号生成器相关
static ecg_generator_t g_ecg_gen_i; // I导联ECG生成器 static ecg_generator_t g_ecg_gen_i; // I导联ECG生成器
static ecg_generator_t g_ecg_gen_ii; // II导联ECG生成器 static ecg_generator_t g_ecg_gen_ii; // II导联ECG生成器
static ecg_generator_t g_ecg_gen_v1; // V1导联ECG生成器
static ecg_generator_t g_ecg_gen_v2; // V2导联ECG生成器
static ecg_generator_t g_ecg_gen_v3; // V3导联ECG生成器
static ecg_generator_t g_ecg_gen_v4; // V4导联ECG生成器
static ecg_generator_t g_ecg_gen_v5; // V5导联ECG生成器
static ecg_generator_t g_ecg_gen_v6; // V6导联ECG生成器
static sine_generator_t g_sine_gen; static sine_generator_t g_sine_gen;
static esp_timer_handle_t signal_timer = NULL; static esp_timer_handle_t signal_timer = NULL;
static uint32_t signal_sample_count = 0; static uint32_t signal_sample_count = 0;
@ -38,7 +44,7 @@ static void signal_timer_callback(void* arg) {
// 输出到DAC通道2 // 输出到DAC通道2
set_channel_voltage(2, signal_voltage); set_channel_voltage(2, signal_voltage);
} else { } else {
// ECG模式同时输出I导联和II导联 // ECG模式同时输出多个导联
// I导联输出到通道2 // I导联输出到通道2
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_i); signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_i);
set_channel_voltage(2, signal_voltage); set_channel_voltage(2, signal_voltage);
@ -46,6 +52,26 @@ static void signal_timer_callback(void* arg) {
// II导联输出到通道3 // II导联输出到通道3
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii); signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
set_channel_voltage(3, signal_voltage); set_channel_voltage(3, signal_voltage);
// V1导联输出到通道4
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v1);
set_channel_voltage(4, signal_voltage);
// V2导联输出到通道5
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v2);
set_channel_voltage(5, signal_voltage);
// V3导联输出到通道6
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v3);
set_channel_voltage(6, signal_voltage);
// V4导联输出到通道7
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_v4);
set_channel_voltage(7, signal_voltage);
// V5、V6导联生成器已实现但不输出到通道
ecg_generator_get_next_sample(&g_ecg_gen_v5);
ecg_generator_get_next_sample(&g_ecg_gen_v6);
} }
signal_sample_count++; signal_sample_count++;
@ -56,7 +82,7 @@ static void signal_timer_callback(void* arg) {
if (use_sine_wave) { if (use_sine_wave) {
ESP_LOGI(TAG, "Generated %u samples at 20kHz (Sine Wave)", signal_sample_count); ESP_LOGI(TAG, "Generated %u samples at 20kHz (Sine Wave)", signal_sample_count);
} else { } else {
ESP_LOGI(TAG, "Generated %u samples at 20kHz (ECG I导联+II导联)", signal_sample_count); ESP_LOGI(TAG, "Generated %u samples at 20kHz (ECG I+II+V1+V2+V3+V4)", signal_sample_count);
} }
signal_sample_count = 0; signal_sample_count = 0;
signal_last_log_time = esp_timer_get_time() / 1000; signal_last_log_time = esp_timer_get_time() / 1000;
@ -81,6 +107,24 @@ void test_signal_generation(void) {
ecg_generator_init(&g_ecg_gen_ii, 20000.0f, ECG_LEAD_II); // II导联20kHz生成率 ecg_generator_init(&g_ecg_gen_ii, 20000.0f, ECG_LEAD_II); // II导联20kHz生成率
ecg_param_set(&g_ecg_gen_ii, 5.0f, 75.0f); ecg_param_set(&g_ecg_gen_ii, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v1, 20000.0f, ECG_LEAD_V1); // V1导联20kHz生成率
ecg_param_set(&g_ecg_gen_v1, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v2, 20000.0f, ECG_LEAD_V2); // V2导联20kHz生成率
ecg_param_set(&g_ecg_gen_v2, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v3, 20000.0f, ECG_LEAD_V3); // V3导联20kHz生成率
ecg_param_set(&g_ecg_gen_v3, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v4, 20000.0f, ECG_LEAD_V4); // V4导联20kHz生成率
ecg_param_set(&g_ecg_gen_v4, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v5, 20000.0f, ECG_LEAD_V5); // V5导联20kHz生成率
ecg_param_set(&g_ecg_gen_v5, 5.0f, 75.0f);
ecg_generator_init(&g_ecg_gen_v6, 20000.0f, ECG_LEAD_V6); // V6导联20kHz生成率
ecg_param_set(&g_ecg_gen_v6, 5.0f, 75.0f);
// 初始化正弦波生成器 // 初始化正弦波生成器
sine_generator_init(&g_sine_gen, 20000.0f); // 20kHz生成率 sine_generator_init(&g_sine_gen, 20000.0f); // 20kHz生成率
sine_generator_set_frequency(&g_sine_gen, 10.0f); // 10Hz正弦波 sine_generator_set_frequency(&g_sine_gen, 10.0f); // 10Hz正弦波
@ -104,10 +148,16 @@ void test_signal_generation(void) {
sine_generator_start(&g_sine_gen); sine_generator_start(&g_sine_gen);
ESP_LOGI(TAG, "Started sine wave generator: 10Hz, 5mV"); ESP_LOGI(TAG, "Started sine wave generator: 10Hz, 5mV");
} else { } else {
// 同时启动个ECG导联 // 同时启动个ECG导联
ecg_generator_start(&g_ecg_gen_i); ecg_generator_start(&g_ecg_gen_i);
ecg_generator_start(&g_ecg_gen_ii); ecg_generator_start(&g_ecg_gen_ii);
ESP_LOGI(TAG, "Started ECG generators: I导联+II导联, 75 BPM, 5mV"); ecg_generator_start(&g_ecg_gen_v1);
ecg_generator_start(&g_ecg_gen_v2);
ecg_generator_start(&g_ecg_gen_v3);
ecg_generator_start(&g_ecg_gen_v4);
ecg_generator_start(&g_ecg_gen_v5);
ecg_generator_start(&g_ecg_gen_v6);
ESP_LOGI(TAG, "Started ECG generators: I+II+V1+V2+V3+V4+V5+V6, 75 BPM, 5mV");
} }
// 启动定时器 (50us = 20kHz) // 启动定时器 (50us = 20kHz)
@ -125,10 +175,16 @@ void test_signal_generation(void) {
void switch_to_ecg_mode(void) { void switch_to_ecg_mode(void) {
if (use_sine_wave) { if (use_sine_wave) {
sine_generator_stop(&g_sine_gen); sine_generator_stop(&g_sine_gen);
// 同时启动I导联和II导联 // 同时启动多个ECG导联
ecg_generator_start(&g_ecg_gen_i); ecg_generator_start(&g_ecg_gen_i);
ecg_generator_start(&g_ecg_gen_ii); ecg_generator_start(&g_ecg_gen_ii);
ESP_LOGI(TAG, "Switched to ECG mode (I导联+II导联)"); ecg_generator_start(&g_ecg_gen_v1);
ecg_generator_start(&g_ecg_gen_v2);
ecg_generator_start(&g_ecg_gen_v3);
ecg_generator_start(&g_ecg_gen_v4);
ecg_generator_start(&g_ecg_gen_v5);
ecg_generator_start(&g_ecg_gen_v6);
ESP_LOGI(TAG, "Switched to ECG mode (I+SII+V1+V2+V3+V4)");
use_sine_wave = false; use_sine_wave = false;
} }
} }
@ -136,9 +192,15 @@ void switch_to_ecg_mode(void) {
// 切换到正弦波模式 // 切换到正弦波模式
void switch_to_sine_mode(void) { void switch_to_sine_mode(void) {
if (!use_sine_wave) { if (!use_sine_wave) {
// 停止两个ECG导联 // 停止所有ECG导联
ecg_generator_stop(&g_ecg_gen_i); ecg_generator_stop(&g_ecg_gen_i);
ecg_generator_stop(&g_ecg_gen_ii); ecg_generator_stop(&g_ecg_gen_ii);
ecg_generator_stop(&g_ecg_gen_v1);
ecg_generator_stop(&g_ecg_gen_v2);
ecg_generator_stop(&g_ecg_gen_v3);
ecg_generator_stop(&g_ecg_gen_v4);
ecg_generator_stop(&g_ecg_gen_v5);
ecg_generator_stop(&g_ecg_gen_v6);
sine_generator_start(&g_sine_gen); sine_generator_start(&g_sine_gen);
use_sine_wave = true; use_sine_wave = true;
ESP_LOGI(TAG, "Switched to sine wave mode"); ESP_LOGI(TAG, "Switched to sine wave mode");