diff --git a/pc_firm/parser.c b/pc_firm/parser.c index 46a8b39..d35a750 100644 --- a/pc_firm/parser.c +++ b/pc_firm/parser.c @@ -90,7 +90,8 @@ extern int imu_read_direct(void); /* IMU 레지스터 직접 읽기 + BLE 전 extern volatile uint16_t info_batt; /* 배터리 전압 (mV) */ extern volatile uint16_t info_temp; /* 온도 (°C x 100) */ extern volatile uint16_t info_imu[6]; /* IMU 6축 (accel XYZ + gyro XYZ) */ -extern volatile bool tmp235_saadc_done; /* TMP235 SAADC 콜백 완료 플래그 */ +extern volatile bool tmp235_saadc_done; /* TMP235 SAADC 콜백 완료 플래그 */ +extern volatile bool battery_saadc_done; /* 배터리 SAADC 콜백 완료 플래그 */ extern void pressure_all_level_meas(void); /* 압력 센서 전체 측정 */ extern void battery_timer_stop(void); /* 배터리 타이머 중지 */ @@ -1008,8 +1009,12 @@ static void all_sensors(void) info4 = true; /* 센서값을 전역 변수에 저장 (BLE 전송 안 함) */ /* 1. 배터리 전압 측정 → info_batt에 저장 */ + battery_saadc_done = false; battery_level_meas(); - dr_sd_delay_ms(1); /* SAADC 콜백 완료 대기 */ + for (timeout_cnt = 0; !battery_saadc_done && timeout_cnt < 100; timeout_cnt++) + { + dr_sd_delay_ms(1); /* 콜백 오면 즉시 탈출, 최대 100ms */ + } /* 2. IMU 6축 단발 읽기 → info_imu[6]에 저장 */ hw_i2c_init_once(); diff --git a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c index ca6b3dc..a64d338 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c +++ b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c @@ -71,6 +71,9 @@ APP_TIMER_DEF(m_battery_loop_timer_id); /* 저전압 체크 플래그 — battery_loop에서 true로 설정, 핸들러에서 소비 */ bool low_battery_check = false; +/* SAADC 콜백 완료 플래그 — all_sensors()에서 배터리 측정 완료 대기용 */ +volatile bool battery_saadc_done = false; + /* info4: 전체 센서 데이터 수집 모드 플래그 */ extern bool info4; // main.c @@ -139,6 +142,9 @@ void battery_event_handler( nrf_drv_saadc_evt_t const * p_event ) nrf_drv_saadc_uninit(); nrf_drv_saadc_channel_uninit(0); + /* 콜백 완료 알림 (all_sensors 대기 해제용) */ + battery_saadc_done = true; + /* ADC값 → mV 변환 (매크로: ADC x 600/1023 x 6) */ batt_lvl_in_milli_volt_0 = BATTERY_RESULT_IN_MILLI_VOLTS(register_val); @@ -214,7 +220,7 @@ static void battery_configure(void) /* AIN2 채널 설정: 싱글엔드 입력, 1/6 gain, burst + TACQ 20μs */ nrf_saadc_channel_config_t config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2); config.burst = NRF_SAADC_BURST_ENABLED; - config.acq_time = NRF_SAADC_ACQTIME_20US; // TACQ test + config.acq_time = NRF_SAADC_ACQTIME_10US; err_code = nrf_drv_saadc_channel_init(0, &config); APP_ERROR_CHECK(err_code); diff --git a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.h b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.h index 76b8a65..dcaa9dd 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.h +++ b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.h @@ -25,6 +25,9 @@ #define LOW_BATTERY_VOLTAGE 3500 /* Low Battery 임계값 */ +/** @brief 배터리 SAADC 콜백 완료 플래그 (all_sensors 대기용) */ +extern volatile bool battery_saadc_done; + /** @brief 배터리 전압 1회 측정 시작 (비동기, 결과는 콜백에서 처리) */ void battery_level_meas(void); /** @brief 배터리 모니터링 5초 반복 타이머 시작 */