From 293b52a6ec21b065fa24d520718c8dbe8d0e422e Mon Sep 17 00:00:00 2001 From: jhChun Date: Mon, 30 Mar 2026 12:10:53 +0900 Subject: [PATCH] =?UTF-8?q?SAADC=20=EC=95=88=EC=A0=95=EC=84=B1=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0:=20=EB=B2=84=ED=8D=BC/=ED=95=B4=EC=A0=9C=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 배터리 SAADC 더블 버퍼 -> 싱글 버퍼(1회 측정 후 해제이므로 불필요) - 콜백 내 buffer_convert 제거(해제 직전 다음 버퍼 등록 제거) - uninit 순서 변경: channel_uninit -> uninit(채널 먼저 해제) - 5초마다 배터리를 측정하는 battery_loop에 info4(전체 측정) 체크 추가(전체 측정 중 SAADC 동시 init 충돌 방지) --- .../ble_app_bladder_patch/battery_saadc.c | 39 ++++++++++--------- .../ble_app_bladder_patch/tmp235_q1.c | 4 +- 2 files changed, 23 insertions(+), 20 deletions(-) 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 826d8ac..4107fc6 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c +++ b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c @@ -58,8 +58,9 @@ #define BATTERY_RESULT_IN_MILLI_VOLTS(ADC_VALUE)\ ((((ADC_VALUE) * BATTERY_REF_VOLTAGE_IN_MILLIVOLTS) / BATTERY_ADC_RES_12BITS) * BATTERY_PRE_SCALING_COMPENSATION) -/* 배터리 측정용 더블 버퍼 (SAADC가 비동기로 교대 사용) */ -static nrf_saadc_value_t adc_bufs[2]; +/* 배터리 측정용 싱글 버퍼 (1회 측정 후 uninit하므로 더블 버퍼 불필요) */ +static nrf_saadc_value_t adc_buf; +//static nrf_saadc_value_t adc_bufs[2]; // 이전: 더블 버퍼 (연속 측정용) /* 배터리 모니터링 반복 타이머 정의 */ @@ -129,18 +130,17 @@ void battery_event_handler( nrf_drv_saadc_evt_t const * p_event ) nrf_saadc_value_t register_val = 0; float batt_lvl_in_milli_volt_0 = 0; /* 보정 전 전압 (부동소수점) */ float batt_lvl_in_milli_volt_1 = 0; /* 분압 보정 후 최종 전압 (부동소수점) */ - uint32_t err_code = 0; /* ADC 변환 결과 읽기 */ register_val = p_event->data.done.p_buffer[0]; - - /* 다음 변환을 위해 버퍼 재등록 */ - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 1); - APP_ERROR_CHECK(err_code); + + //err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 1); // 이전: 다음 변환을 위해 버퍼 재등록 + //APP_ERROR_CHECK(err_code); /* SAADC 해제 — 다른 ADC 측정(온도, 압력)과 하드웨어 공유 */ - nrf_drv_saadc_uninit(); + /* 1회 측정 후 해제이므로 buffer_convert(다음 버퍼 등록) 불필요 */ nrf_drv_saadc_channel_uninit(0); + nrf_drv_saadc_uninit(); /* 콜백 완료 알림 (all_sensors 대기 해제용) */ battery_saadc_done = true; @@ -211,9 +211,9 @@ void battery_event_handler( nrf_drv_saadc_evt_t const * p_event ) */ static void battery_configure(void) { - /* SAADC 드라이버 초기화 (16x 오버샘플링으로 노이즈 저감) */ + /* SAADC 드라이버 초기화 (4x 오버샘플링으로 노이즈 저감) */ nrf_drv_saadc_config_t saadc_config = NRF_DRV_SAADC_DEFAULT_CONFIG; - saadc_config.resolution = NRF_SAADC_RESOLUTION_12BIT; + saadc_config.resolution = NRF_SAADC_RESOLUTION_12BIT; // 10 -> 12bit saadc_config.oversample = NRF_SAADC_OVERSAMPLE_4X; ret_code_t err_code = nrf_drv_saadc_init(&saadc_config, battery_event_handler); APP_ERROR_CHECK(err_code); @@ -225,12 +225,13 @@ static void battery_configure(void) err_code = nrf_drv_saadc_channel_init(0, &config); APP_ERROR_CHECK(err_code); - /* 더블 버퍼 등록 — SAADC가 교대로 사용하여 데이터 손실 방지 */ - err_code = nrf_drv_saadc_buffer_convert(&adc_bufs[0], 1); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(&adc_bufs[1], 1); + /* 싱글 버퍼 등록 (1회 측정 후 uninit) */ + err_code = nrf_drv_saadc_buffer_convert(&adc_buf, 1); APP_ERROR_CHECK(err_code); + //err_code = nrf_drv_saadc_buffer_convert(&adc_bufs[0], 1); // 이전: 더블 버퍼 + //APP_ERROR_CHECK(err_code); + //err_code = nrf_drv_saadc_buffer_convert(&adc_bufs[1], 1); + //APP_ERROR_CHECK(err_code); } /** @@ -250,17 +251,17 @@ void battery_level_meas(void) /** - * @brief 배터리 모니터링 타이머 콜백 (5초 주기) + * @brief 배터리 모니터링 타이머 콜백 (5초 주기) - 주기 확인 필요(너무 짧음) * + * 저전압 체크 플래그를 설정하고 배터리 측정을 시작한다. * 다른 작업(IMU 등) 처리 중이면 측정을 건너뛴다. - * 그렇지 않으면 저전압 체크 플래그를 설정하고 배터리 측정을 시작한다. */ void battery_loop(void * p_context) /* For 1sec */ { UNUSED_PARAMETER(p_context); - /* 다른 센서 처리 중이면 배터리 측정 스킵 (충돌 방지) */ - if(processing==true) + /* 다른 센서 처리 중 또는 MBB 센서 수집 중이면 배터리 측정 스킵 (SAADC 충돌 방지) */ + if (processing == true || info4 == true) { processing = false ; // add 20241218 //low_battery_check = true; diff --git a/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c b/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c index af8ef19..ae6f286 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c +++ b/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c @@ -106,8 +106,10 @@ void tmp235_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* TMP325 Vout //DBG_PRINTF("[TMP] adc=%d\r\n", adc_result); /* SAADC 해제 — 배터리/압력센서 측정과 하드웨어 공유 */ + nrf_drv_saadc_channel_uninit(0); // 채널 먼저 해제 nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); + //nrf_drv_saadc_uninit(); // 이전: 드라이버 먼저 해제 + //nrf_drv_saadc_channel_uninit(0); /* ADC값 → TMP235 출력전압(mV) 변환 */ tmp235_voltage_in_milli_volts = TMP235_VOUT_IN_MILLI_VOLTS(adc_result);