압력센서 관련 코드 정리
- battery_saadc.c/.h: 압력센서 미탑재로 관련 코드 제거
This commit is contained in:
@@ -7,22 +7,17 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* [모듈 개요] 배터리 전압 및 압력센서 ADC 측정 모듈 ---> 압력 센서 미탑재로 압력 센서 부분 삭제 예정
|
* [모듈 개요] 배터리 전압 ADC 측정 모듈
|
||||||
*
|
*
|
||||||
* nRF52840의 SAADC(Successive Approximation ADC)를 사용하여 다음을 수행:
|
* nRF52840의 SAADC(Successive Approximation ADC)를 사용하여 배터리 전압을 측정:
|
||||||
* 1) 배터리 전압 측정 (AIN2 채널, 1/3 프리스케일링)
|
* - AIN2 채널, 10bit 해상도
|
||||||
* - 5초 주기 타이머(battery_loop)로 반복 측정
|
* - 5초 주기 타이머(battery_loop)로 반복 측정
|
||||||
* - 저전압(3100mV 이하) 10회 연속 감지 시 자동 전원 OFF
|
* - 저전압(3500mV 이하) 10회 연속 감지 시 자동 전원 OFF
|
||||||
* - info4 모드(전체 센서 수집)에서는 info_batt에 저장 후 온도 측정으로 전환
|
* - info4 모드(전체 센서 수집)에서는 info_batt에 저장 후 온도 측정으로 전환
|
||||||
* 2) 압력센서 2채널 측정 (AIN7=P1, AIN4=P2)
|
|
||||||
* - 12bit ADC 값을 mV로 변환하여 BLE 또는 UART로 전송
|
|
||||||
*
|
*
|
||||||
* 배터리 전압 변환 공식:
|
* 배터리 전압 변환 공식:
|
||||||
* 전압(mV) = ADC값 x (600mV / 1023) x 6 x 1.42 (분압 저항 보정 계수)
|
* 전압(mV) = ADC값 x (600mV / 1023) x 6 x 1.42 (분압 저항 보정 계수)
|
||||||
*
|
*
|
||||||
* 압력센서 전압 변환 공식:
|
|
||||||
* 전압(mV) = ADC값 x 0.805(uV/LSB) / 1000, 범위 0~3500mV 클램핑
|
|
||||||
*
|
|
||||||
* info4 모드 순서: 배터리 -> 온도(go_temp) -> IMU(motion_raw_data_enabled)
|
* info4 모드 순서: 배터리 -> 온도(go_temp) -> IMU(motion_raw_data_enabled)
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
@@ -53,10 +48,6 @@
|
|||||||
|
|
||||||
/* 10비트 ADC 최대 디지털 값 */
|
/* 10비트 ADC 최대 디지털 값 */
|
||||||
#define BATTERY_ADC_RES_10BITS 1023 /**< Maximum digital value for 10-bit ADC conversion. */
|
#define BATTERY_ADC_RES_10BITS 1023 /**< Maximum digital value for 10-bit ADC conversion. */
|
||||||
//#define PRESSURE_RESULT_IN_MILLI_VOLTS(adc) ((adc * 3600) / 1023)
|
|
||||||
|
|
||||||
#define PRESSURE_OFFSET_DEFAULT 0 // 압력 offset. 캘리브레이션 시 사용 가능
|
|
||||||
#define MV_PER_ADC_STEP 805 // 약 0.805mV per 1 LSB (nRF 12bit + scaling)
|
|
||||||
|
|
||||||
/**@brief Macro to convert the result of ADC conversion in millivolts.
|
/**@brief Macro to convert the result of ADC conversion in millivolts.
|
||||||
*
|
*
|
||||||
@@ -70,9 +61,6 @@
|
|||||||
/* 배터리 측정용 더블 버퍼 (SAADC가 비동기로 교대 사용) */
|
/* 배터리 측정용 더블 버퍼 (SAADC가 비동기로 교대 사용) */
|
||||||
static nrf_saadc_value_t adc_bufs[2];
|
static nrf_saadc_value_t adc_bufs[2];
|
||||||
|
|
||||||
/* 압력센서 2채널 ADC 버퍼 [0]=AIN7(P1), [1]=AIN4(P2) */
|
|
||||||
static int16_t pressure_adc_buf[2]; //cj add 25/11/19
|
|
||||||
static uint16_t convert_adc_to_mV(int16_t raw_adc); //cj add 25/11/19
|
|
||||||
|
|
||||||
/* 배터리 모니터링 반복 타이머 정의 */
|
/* 배터리 모니터링 반복 타이머 정의 */
|
||||||
APP_TIMER_DEF(m_battery_loop_timer_id);
|
APP_TIMER_DEF(m_battery_loop_timer_id);
|
||||||
@@ -83,13 +71,9 @@ APP_TIMER_DEF(m_battery_loop_timer_id);
|
|||||||
/* 저전압 체크 플래그 — battery_loop에서 true로 설정, 핸들러에서 소비 */
|
/* 저전압 체크 플래그 — battery_loop에서 true로 설정, 핸들러에서 소비 */
|
||||||
bool low_battery_check = false;
|
bool low_battery_check = false;
|
||||||
|
|
||||||
/* info4: 전체 센서 데이터 수집 모드 플래그 (cmd_parse에서 설정) */
|
/* info4: 전체 센서 데이터 수집 모드 플래그 */
|
||||||
extern bool info4; // main.c
|
extern bool info4; // main.c
|
||||||
|
|
||||||
// cj add edit 25/11/24
|
|
||||||
/* info4 모드에서 압력센서 측정값을 임시 저장하는 변수 (mV 단위) */
|
|
||||||
volatile uint16_t info_p1;
|
|
||||||
volatile uint16_t info_p2;
|
|
||||||
|
|
||||||
extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN];
|
extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN];
|
||||||
|
|
||||||
@@ -120,97 +104,6 @@ extern bool motion_data_once ;
|
|||||||
* percentage and send it to peer.
|
* percentage and send it to peer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 압력센서 ADC 원시값을 밀리볼트(mV)로 변환
|
|
||||||
*
|
|
||||||
* 변환 공식: mV = raw_adc x 805(uV/LSB) / 1000
|
|
||||||
* 결과를 0~3500mV 범위로 클램핑하여 이상치 방지
|
|
||||||
*
|
|
||||||
* @param raw_adc SAADC에서 읽은 원시 ADC 값 (12bit)
|
|
||||||
* @return 변환된 전압값 (mV), 0~3500 범위
|
|
||||||
*/
|
|
||||||
static uint16_t convert_adc_to_mV(int16_t raw_adc)
|
|
||||||
{
|
|
||||||
/* 음수 ADC 값은 0으로 처리 (노이즈 등으로 발생 가능) */
|
|
||||||
if (raw_adc < 0)
|
|
||||||
{
|
|
||||||
raw_adc = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 805 uV/LSB 스케일링: raw x 805 = uV, /1000 = mV */
|
|
||||||
int32_t mv = (int32_t)raw_adc * MV_PER_ADC_STEP; // 단위: 805 uV
|
|
||||||
mv /= 1000;
|
|
||||||
|
|
||||||
/* 0~3500mV 범위로 클램핑하여 유효 범위 보장 */
|
|
||||||
if (mv < 0)
|
|
||||||
{
|
|
||||||
mv = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mv > 3500)
|
|
||||||
{
|
|
||||||
mv = 3500;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (uint16_t)mv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 압력센서 2채널 ADC 완료 콜백
|
|
||||||
*
|
|
||||||
* SAADC 변환 완료 시 호출된다.
|
|
||||||
* AIN7(P1)과 AIN4(P2) 두 채널의 ADC 값을 mV로 변환한 뒤,
|
|
||||||
* info4 모드이면 글로벌 변수에 저장하고, 아니면 BLE/UART로 즉시 전송한다.
|
|
||||||
* 변환 후 SAADC를 해제하여 다른 ADC 측정(배터리, 온도)과 공유한다.
|
|
||||||
*/
|
|
||||||
void pressure_all_event_handler(nrf_drv_saadc_evt_t const * p_event)
|
|
||||||
{
|
|
||||||
if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
|
|
||||||
{
|
|
||||||
/* 버퍼에서 2채널 ADC 원시값 추출 */
|
|
||||||
int16_t p1_adc = p_event->data.done.p_buffer[0]; // AIN7 (압력센서1)
|
|
||||||
int16_t p2_adc = p_event->data.done.p_buffer[1]; // AIN4 (압력센서2)
|
|
||||||
|
|
||||||
|
|
||||||
/* ADC 원시값 → 밀리볼트 변환 */
|
|
||||||
uint16_t p1_mV = convert_adc_to_mV(p1_adc);
|
|
||||||
uint16_t p2_mV = convert_adc_to_mV(p2_adc);
|
|
||||||
|
|
||||||
/* info4(전체 센서 수집) 모드일 때 글로벌 변수에 저장 */
|
|
||||||
if(info4 == true)
|
|
||||||
{
|
|
||||||
info_p1 = p1_mV;
|
|
||||||
info_p2 = p2_mV;
|
|
||||||
}
|
|
||||||
/* 다음 변환을 위해 버퍼 재등록 */
|
|
||||||
APP_ERROR_CHECK(nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, 2));
|
|
||||||
|
|
||||||
/* SAADC 해제 — 배터리/온도 측정과 하드웨어를 공유하므로 사용 후 반드시 해제 */
|
|
||||||
nrf_drv_saadc_uninit();
|
|
||||||
nrf_drv_saadc_channel_uninit(0);
|
|
||||||
nrf_drv_saadc_channel_uninit(1);
|
|
||||||
|
|
||||||
/* 결과 전송: 명령 소스에 따라 UART 또는 BLE로 전송 */
|
|
||||||
if(cmd_type_t == CMD_UART)
|
|
||||||
{
|
|
||||||
DBG_PRINTF("P1:%d P2:%d\r\n", p1_mV, p2_mV);
|
|
||||||
}
|
|
||||||
/* BLE 모드이고 info4가 아닌 경우(단독 압력 측정) → BLE 바이너리 전송 */
|
|
||||||
else if(cmd_type_t == CMD_BLE && info4 == false)
|
|
||||||
{
|
|
||||||
DBG_PRINTF("P1:%d P2:%d\r\n", p1_mV, p2_mV);
|
|
||||||
// uint16_t len = sprintf((char*)ble_bin_buffer,
|
|
||||||
// "rpn:%04x,%04x", p1_mV, p2_mV);
|
|
||||||
/* 2채널 압력값을 "rpn:" 헤더와 함께 바이너리 포맷으로 BLE 전송 */
|
|
||||||
uint16_t result_data[2];
|
|
||||||
result_data[0] = p1_mV;
|
|
||||||
result_data[1] = p2_mV;
|
|
||||||
format_data(ble_bin_buffer, "rpn:", result_data,2);
|
|
||||||
dr_binary_tx_safe(ble_bin_buffer,4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 배터리 전압 ADC 완료 콜백
|
* @brief 배터리 전압 ADC 완료 콜백
|
||||||
@@ -329,58 +222,6 @@ static void battery_configure(void)
|
|||||||
APP_ERROR_CHECK(err_code);
|
APP_ERROR_CHECK(err_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SAADC를 압력센서 2채널 측정용으로 설정
|
|
||||||
*
|
|
||||||
* AIN7(압력센서1)과 AIN4(압력센서2)를 싱글엔드 모드로 초기화한다.
|
|
||||||
* 이미 초기화된 상태(NRF_ERROR_INVALID_STATE)는 무시하여 안전하게 처리한다.
|
|
||||||
* 콜백: pressure_all_event_handler
|
|
||||||
*/
|
|
||||||
void pressure_all_configure(void)
|
|
||||||
{
|
|
||||||
ret_code_t err_code;
|
|
||||||
|
|
||||||
/* SAADC 드라이버 초기화 (이미 초기화된 경우 무시) */
|
|
||||||
err_code = nrf_drv_saadc_init(NULL, pressure_all_event_handler);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS && err_code != NRF_ERROR_INVALID_STATE)
|
|
||||||
{
|
|
||||||
DBG_PRINTF("SAADC init err=%d\r\n", err_code);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 채널 0: AIN7 (압력센서1, P1) */
|
|
||||||
nrf_saadc_channel_config_t ch0_cfg = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN7);
|
|
||||||
|
|
||||||
/* 채널 1: AIN4 (압력센서2, P2) */
|
|
||||||
nrf_saadc_channel_config_t ch1_cfg = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN4);
|
|
||||||
|
|
||||||
err_code = nrf_drv_saadc_channel_init(0, &ch0_cfg);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS && err_code != NRF_ERROR_INVALID_STATE)
|
|
||||||
{
|
|
||||||
DBG_PRINTF("SAADC ch0 init err=%d\r\n", err_code);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
err_code = nrf_drv_saadc_channel_init(1, &ch1_cfg);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS && err_code != NRF_ERROR_INVALID_STATE)
|
|
||||||
{
|
|
||||||
DBG_PRINTF("SAADC ch1 init err=%d\r\n", err_code);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 2채널 ADC 버퍼 등록 ([0]=P1, [1]=P2) */
|
|
||||||
err_code = nrf_drv_saadc_buffer_convert(pressure_adc_buf, 2);
|
|
||||||
|
|
||||||
if (err_code != NRF_SUCCESS)
|
|
||||||
{
|
|
||||||
DBG_PRINTF("SAADC buf conv err=%d\r\n", err_code);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 배터리 전압 1회 측정 시작
|
* @brief 배터리 전압 1회 측정 시작
|
||||||
*
|
*
|
||||||
@@ -396,23 +237,6 @@ void battery_level_meas(void)
|
|||||||
APP_ERROR_CHECK(err_code);
|
APP_ERROR_CHECK(err_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 압력센서 2채널 1회 측정 시작 - 압력센서 미탑재
|
|
||||||
*
|
|
||||||
* SAADC를 압력센서 2채널용으로 설정 후 샘플링을 트리거한다.
|
|
||||||
* 결과는 pressure_all_event_handler 콜백에서 비동기로 처리된다.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
void pressure_all_level_meas(void) //add cj add 25/11/19
|
|
||||||
{
|
|
||||||
ret_code_t err_code;
|
|
||||||
|
|
||||||
pressure_all_configure();
|
|
||||||
|
|
||||||
err_code = nrf_drv_saadc_sample();
|
|
||||||
APP_ERROR_CHECK(err_code);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 배터리 모니터링 타이머 콜백 (5초 주기)
|
* @brief 배터리 모니터링 타이머 콜백 (5초 주기)
|
||||||
|
|||||||
@@ -7,17 +7,15 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* [헤더 개요] 배터리 전압 및 압력센서 SAADC 측정 인터페이스
|
* [헤더 개요] 배터리 전압 SAADC 측정 인터페이스
|
||||||
*
|
*
|
||||||
* nRF52840 SAADC를 이용한 배터리 전압 측정과 압력센서 2채널 측정의
|
* nRF52840 SAADC를 이용한 배터리 전압 측정 API를 선언한다.
|
||||||
* 외부 호출용 API를 선언한다.
|
|
||||||
*
|
*
|
||||||
* 주요 API:
|
* 주요 API:
|
||||||
* - battery_level_meas() : 배터리 전압 1회 측정 (AIN2)
|
* - battery_level_meas() : 배터리 전압 1회 측정 (AIN2)
|
||||||
* - pressure_all_level_meas() : 압력센서 2채널 1회 측정 (AIN7, AIN4)
|
|
||||||
* - battery_timer_init/start/stop() : 5초 주기 배터리 모니터링 타이머 제어
|
* - battery_timer_init/start/stop() : 5초 주기 배터리 모니터링 타이머 제어
|
||||||
*
|
*
|
||||||
* LOW_BATTERY_VOLTAGE(3100mV) 이하가 10회 연속 감지되면 자동 전원 OFF
|
* LOW_BATTERY_VOLTAGE(3500mV) 이하가 10회 연속 감지되면 자동 전원 OFF
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#ifndef _BATTERY_SAADC_H_
|
#ifndef _BATTERY_SAADC_H_
|
||||||
@@ -29,8 +27,6 @@
|
|||||||
|
|
||||||
/** @brief 배터리 전압 1회 측정 시작 (비동기, 결과는 콜백에서 처리) */
|
/** @brief 배터리 전압 1회 측정 시작 (비동기, 결과는 콜백에서 처리) */
|
||||||
void battery_level_meas(void);
|
void battery_level_meas(void);
|
||||||
/** @brief 압력센서 2채널(AIN7, AIN4) 1회 측정 시작 (비동기) */
|
|
||||||
//void pressure_all_level_meas(void); // 압력센서 미탑재
|
|
||||||
/** @brief 배터리 모니터링 5초 반복 타이머 시작 */
|
/** @brief 배터리 모니터링 5초 반복 타이머 시작 */
|
||||||
void battery_timer_start(void);
|
void battery_timer_start(void);
|
||||||
/** @brief 배터리 모니터링 타이머 정지 */
|
/** @brief 배터리 모니터링 타이머 정지 */
|
||||||
|
|||||||
Reference in New Issue
Block a user