forth commit
This commit is contained in:
parent
aa5edb1e1d
commit
b04950de34
|
|
@ -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.
1813
build/.ninja_log
1813
build/.ninja_log
File diff suppressed because it is too large
Load Diff
|
|
@ -1 +1 @@
|
|||
52541c9f3f488e236c16b0e074f47f40b3cdfaed
|
||||
aa5edb1e1d1e2c9228e9ebe7a2633a8ec50ab3b3
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
8335
build/SIM_S3_1.map
8335
build/SIM_S3_1.map
File diff suppressed because one or more lines are too long
|
|
@ -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
|
||||
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
|
||||
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
|
||||
|
|
|
|||
3621
build/build.ninja
3621
build/build.ninja
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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
Command: ninja all
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"version": "1.2",
|
||||
"project_name": "SIM_S3_1",
|
||||
"project_version": "52541c9-dirty",
|
||||
"project_version": "aa5edb1-dirty",
|
||||
"project_path": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1",
|
||||
"idf_path": "C:/Espressif/frameworks/esp-idf-v5.5",
|
||||
"build_dir": "C:/Users/29096/Desktop/work/SIM/SIM_S3_1/build",
|
||||
|
|
|
|||
|
|
@ -12,6 +12,13 @@ extern "C" {
|
|||
typedef enum {
|
||||
ECG_LEAD_I = 0, // I导联:右手到左手
|
||||
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生成器结构体
|
||||
|
|
@ -32,6 +39,7 @@ typedef struct {
|
|||
float r_amp_ratio; // R波幅度比例
|
||||
float s_amp_ratio; // S波幅度比例
|
||||
float t_amp_ratio; // T波幅度比例
|
||||
bool p_bidirectional; // P波是否双向
|
||||
|
||||
// 固定时间参数 (保持正常ECG时序)
|
||||
float p_width; // P波宽度
|
||||
|
|
|
|||
|
|
@ -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->s_amp_ratio = 0.3f; // S波
|
||||
generator->t_amp_ratio = 0.3f; // T波中等
|
||||
generator->p_bidirectional = false;
|
||||
break;
|
||||
|
||||
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->s_amp_ratio = 0.4f; // S波
|
||||
generator->t_amp_ratio = 0.4f; // T波明显
|
||||
generator->p_bidirectional = false;
|
||||
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:
|
||||
// 默认使用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->s_amp_ratio = 0.4f;
|
||||
generator->t_amp_ratio = 0.4f;
|
||||
generator->p_bidirectional = false;
|
||||
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 t_width_ratio = 0.0625f; // T波宽度:0.05/0.8 = 6.25%
|
||||
|
||||
// P波 - 修正后的计算
|
||||
float p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
|
||||
// P波 - 支持双向P波
|
||||
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波群 - 修正后的计算
|
||||
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 t_width_ratio = 0.0625f; // T波宽度:6.25%
|
||||
|
||||
// P波计算
|
||||
float p = p_amp * expf(-(t_norm - p_time_ratio) * (t_norm - p_time_ratio) / (2.0f * p_width_ratio * p_width_ratio));
|
||||
// P波计算 - 支持双向P波
|
||||
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波群计算
|
||||
float q = -q_amp * expf(-(t_norm - q_time_ratio) * (t_norm - q_time_ratio) / (2.0f * qrs_width_ratio * qrs_width_ratio));
|
||||
|
|
|
|||
76
main/main.c
76
main/main.c
|
|
@ -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_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 esp_timer_handle_t signal_timer = NULL;
|
||||
static uint32_t signal_sample_count = 0;
|
||||
|
|
@ -38,7 +44,7 @@ static void signal_timer_callback(void* arg) {
|
|||
// 输出到DAC通道2
|
||||
set_channel_voltage(2, signal_voltage);
|
||||
} else {
|
||||
// ECG模式:同时输出I导联和II导联
|
||||
// ECG模式:同时输出多个导联
|
||||
// I导联输出到通道2
|
||||
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_i);
|
||||
set_channel_voltage(2, signal_voltage);
|
||||
|
|
@ -46,6 +52,26 @@ static void signal_timer_callback(void* arg) {
|
|||
// II导联输出到通道3
|
||||
signal_voltage = ecg_generator_get_next_sample(&g_ecg_gen_ii);
|
||||
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++;
|
||||
|
|
@ -56,7 +82,7 @@ static void signal_timer_callback(void* arg) {
|
|||
if (use_sine_wave) {
|
||||
ESP_LOGI(TAG, "Generated %u samples at 20kHz (Sine Wave)", signal_sample_count);
|
||||
} 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_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_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_set_frequency(&g_sine_gen, 10.0f); // 10Hz正弦波
|
||||
|
|
@ -104,10 +148,16 @@ void test_signal_generation(void) {
|
|||
sine_generator_start(&g_sine_gen);
|
||||
ESP_LOGI(TAG, "Started sine wave generator: 10Hz, 5mV");
|
||||
} else {
|
||||
// 同时启动两个ECG导联
|
||||
// 同时启动多个ECG导联
|
||||
ecg_generator_start(&g_ecg_gen_i);
|
||||
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)
|
||||
|
|
@ -125,10 +175,16 @@ void test_signal_generation(void) {
|
|||
void switch_to_ecg_mode(void) {
|
||||
if (use_sine_wave) {
|
||||
sine_generator_stop(&g_sine_gen);
|
||||
// 同时启动I导联和II导联
|
||||
// 同时启动多个ECG导联
|
||||
ecg_generator_start(&g_ecg_gen_i);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -136,9 +192,15 @@ void switch_to_ecg_mode(void) {
|
|||
// 切换到正弦波模式
|
||||
void switch_to_sine_mode(void) {
|
||||
if (!use_sine_wave) {
|
||||
// 停止两个ECG导联
|
||||
// 停止所有ECG导联
|
||||
ecg_generator_stop(&g_ecg_gen_i);
|
||||
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);
|
||||
use_sine_wave = true;
|
||||
ESP_LOGI(TAG, "Switched to sine wave mode");
|
||||
|
|
|
|||
Loading…
Reference in New Issue