Files
firmware-test/data/260311 VesiScan-Basic_VB0HW0100_Firmware Dev 버전 개발 사양.md
jhchun 831dbc2844 fix: BLE TX 먹통 해결 및 메모리 안전성 개선
- binary_tx_handler를 dr_binary_tx_safe로 전체 교체 (APP_ERROR_CHECK 제거)
- data_tx_handler APP_ERROR_CHECK → DBG_PRINTF 교체
- memset/memcpy 하드코딩 크기를 define 상수로 교체 (버퍼 오버런 수정)
- SERIAL_NO_LENGTH, HW_NO_LENGTH, PASSKEY_LENGTH를 main.h로 통합
- 미사용 HW 드라이버/EEPROM 코드 삭제, TWI를 i2c_manager.c로 통합
- EEPROM → FDS 전환, 코드 리뷰 현황 문서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:39:26 +09:00

343 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# VB0HW0100 — Firmware Dev. 버전 개발 사양서
## 1. 시스템 개요
### 1-1. 보드 기능
초음파 방광 모니터링을 위한 웨어러블 디바이스.
6채널 Piezo 트랜스듀서를 순차 구동하여 A-mode 초음파 측정을 수행하고, BLE를 통해 데이터를 전송한다.
Dev. 버전은 모든 명령이 앱에서 내려지도록 개발.
### 1-2. 기능 블록 구분
| 블록 | 명칭 | 주요 IC | 역할 |
|------|------|---------|------|
| 제어부 | Control | nRF52840 (U26) | MCU, BLE, 전체 제어 |
| | | W25Q32 (U16) | Flash Memory (데이터 저장) |
| | | ICM-42670 (U10) | IMU 센서 (6축) |
| TX | Transmit | MD1822 (U27) | MOSFET Driver |
| | | TC7920 (U30) | MOSFET (고전압 스위칭) |
| | | MAX14778 (U31) | 8채널 MUX (채널 선택) |
| | | Misc | TMP235 (U22) | 온도 센서 |
| RX | Receive | MD0100 (U34) | T/R 스위치 (수신 보호) |
| | | OPA2836 (U2) | 2단 수신 증폭기 |
| | | ADL5513 (U23) | 로그 디텍터 (AGC) |
| | | ADC121S051 (U37) | 12비트 SPI ADC |
| 전원 | Power | MIC5528 (U5) | LDO → +3.3V_M (제어부) |
| | | MIC5528 (U42) | LDO → +3.3V_PZT_TX (TX) |
| | | MIC5528 (U41) | LDO → +3.3V_PZT_RX (RX) |
| | | LT3463 (U32) | DC-DC → ±25V (펄서 전원) |
| | | MCP1804 (U33) | LDO → +10V |
| | | LM27762 (U38) | Charge Pump → ±2.75V (Op-Amp 전원) |
| | | MCP73838 (U3) | 배터리 충전 IC |
### 1-3. 신호 흐름
```
[TX 경로]
nRF52840 → MD1822 (Driver) → TC7920 (MOSFET) → MAX14778 (MUX) → Piezo (6ch 중 1개)
[RX 경로]
Piezo (6ch 중 1개) → MAX14778 (MUX) → MD0100 (T/R 보호) → OPA2836 (2단 증폭) → ADL5513 (로그 디텍터) → ADC121S051 → nRF52840
```
---
## 2. 전원 시퀀싱
### 2-1. 전원 도메인
| 도메인 | 전원넷 | LDO | Enable 신호 | 공급 대상 |
|--------|--------|-----|-------------|-----------|
| 제어부 | +3.3V_M | U5 (MIC5528) | PWR_MCU_EN | nRF52840, W25Q32, ICM-42670 |
| TX | +3.3V_PZT_TX | U42 (MIC5528) | PZT_PWR_EN | 펄서 관련 회로 (MD1822, TC7920 등) |
| RX | +3.3V_PZT_RX | U41 (MIC5528) | PZT_PWR_EN | 수신 회로 (OPA2836, ADC121S051 등) |
- TX와 RX는 **동일한 PZT_PWR_EN** 신호로 동시에 ON/OFF
### 2-2. 전원 켜기 (Power ON)
1. 사용자가 **SW2**를 누름
2. PWR_MCU_EN = **High** → U5 활성화 → +3.3V_M 출력
3. nRF52840 부팅 시작
4. MCU가 SW2 눌림 상태를 확인하며 **2초간** 유지 여부 판단
5. 조건 충족 시 MCU가 **PWR_HOLD = High** 출력 → 자기유지 (Self-Latch)
6. 이후 SW2를 놓아도 전원 유지됨
### 2-3. 전원 끄기 (Power OFF)
1. MCU는 **BUTTON_CHECK** 핀으로 SW2 상태를 상시 감시
2. SW2가 **3초간** 눌림 유지 감지
3. MCU가 **PWR_HOLD = Low** 출력
4. U5 이네이블 해제 → +3.3V_M 차단 → 전체 전원 OFF
### 2-4. 동작 모드
| 모드 | 제어부 (+3.3V_M) | TX (+3.3V_PZT_TX) | RX (+3.3V_PZT_RX) | 설명 |
|------|:-:|:-:|:-:|------|
| **Sleep Mode** | ON | OFF | OFF | 모든 IC 저전력 모드 동작, MCU BLE 유지, 명령 대기 |
| **Active Mode** | ON | ON | ON | 초음파 측정 가능 상태 |
- Sleep → Active: MCU가 **PZT_PWR_EN = High**
- Active → Sleep: MCU가 **PZT_PWR_EN = Low**
- 기본 상태는 항상 **Sleep Mode**
- W25Q32와 ICM-42670는 초기설정을 **Deep Power-Down** 모드로 세팅
- 모든 측정 후에는 항상 **Sleep Mode**로 복귀
---
## 3. 측정 명령
### 3-1. 측정 명령 종류
| 측정 명령 | 측정 대상 | 필요 모드 | 비고 |
|-----------|-----------|:-:|------|
| 배터리 전압 측정 | ADC_BAT | Sleep | +3.3V_M 도메인, Active 전환 불필요 |
| IMU 측정 | ICM-42670 (I2C) | Sleep | +3.3V_M 도메인, Active 전환 불필요 |
| 온도 측정 | TMP235 (ADC_TEMP) | **Active** | TX/RX 전원 필요 |
| 초음파 측정 | Piezo 6ch | **Active** | TX/RX 전원 필요 |
| 모두 측정 | 전체 | **Active** | TX/RX 전원 필요 |
-
### 3-2. 명령별 동작 흐름
**Sleep Mode에서 처리 (Active 전환 불필요)**
```
배터리 측정 명령 → 동작모드 전환 → ADC_BAT 읽기 → BLE 전송 → Deep Power-Down 모드 전환
IMU 측정 명령 → 동작모드 전환 → I2C로 ICM-42670 읽기 → BLE 전송 → Deep Power-Down 모드 또는 필요 모드 전환
```
**Active Mode 필요**
```
온도 측정 명령 → Active 진입 → ADC_TEMP 읽기 → BLE 전송 → Sleep 복귀
초음파 측정 명령 → Active 진입 → 6ch 스캔 → BLE 전송 → Sleep 복귀
모두 측정 명령 → Active 진입 → 배터리 + IMU + 온도 + 초음파 → BLE 전송 → Sleep 복귀
```
---
## 4. Piezo 초음파 측정
### 4-1. 측정 파라미터
| 파라미터 | 범위 | 설명 |
|----------|------|------|
| Frequency | 1.8 / 1.9 / 2.0 / 2.1 / 2.2 MHz | 송신 펄스 주파수 |
| Cycle | 3 ~ 7 | 송신 펄스 사이클 수 |
| 평균화 수 (Avg) | 1 ~ 10 | 채널당 반복 측정 횟수 |
| 측정 Channel 개수 (N) | 1 ~ 6 | 측정 대상 채널 수 |
| 대기 시간 (Delay) | 0~30 (default: 10) | TX 펄수 출력 후 ADC 시작 시까지 대기 시간 (μs) |
| 측정 샘플 수 (Num_samples) | 80 ~ 140 | 측정 ADC 샘플 개수 |
### 4-2. 채널 정의
-**6채널**: CH0, CH1, CH2, CH3, CH4, CH5
- Channel 개수 = N이면 **CH0 ~ CH(N-1)** 을 순차 측정
- 예: N=4 → CH0, CH1, CH2, CH3만 측정
### 4-3. 평균화 동작
각 채널별로 평균화 수(Avg)만큼 반복 측정한 후, 평균값을 해당 채널의 최종 측정값으로 사용한다.
예: Avg=5, N=3인 경우
```
CH0: 측정①②③④⑤ → 평균 → CH0 최종값
CH1: 측정①②③④⑤ → 평균 → CH1 최종값
CH2: 측정①②③④⑤ → 평균 → CH2 최종값
```
### 4-4. TX 송신 절차
1. **MAX14778 (MUX)** 채널 선택 (해당 Piezo 연결)
2. **1.3ms 대기** (MAX14778 채널 스위칭 안정화 시간)
3. **PZT_PE = High** (펄서 활성화)
4. **MD1822**에 설정된 Frequency / Cycle로 펄스 신호 입력
5. **TC7920 (MOSFET)** 이 ±25V 펄스를 Piezo에 인가
| 관련 핀/넷 | 연결 |
|------------|------|
| PZT_CH_SEL0 | U26.A20 → U31 (MUX 채널 선택 비트 0) |
| PZT_CH_SEL1 | U26.B11 → U31 (MUX 채널 선택 비트 1) |
| PZT_EN_MUXA | U26.AC17 → U31 (MUX A 활성화) |
| PZT_EN_MUXB | U26.AC19 → U31 (MUX B 활성화) |
| PZT_PE | U26.AC21 → U27.15 (펄서 이네이블) |
| PZT_P_PULSE | U26.P23 → R30 (48.7Ω) → U27 (양의 펄스) |
| PZT_N_PULSE | U26.R24 → R40 (48.7Ω) → U27 (음의 펄스) |
| PZT_DMP | U26.AD22 → R12 (48.7Ω) → U27 (댐핑 제어) |
### 4-5. RX 수신 절차
1. TX 펄스 출력 후 약 **10μs 대기** (근거리 잔향 회피)
2. 에코 신호 경로:
Piezo → MAX14778 (MUX) → MD0100 (T/R 보호) → OPA2836 (2단 증폭, 총 ~40dB) → ADL5513 (로그 디텍터)
3. **ADC121S051**에서 약 **300μs 동안** ADC 값 연속 수집
4. MCU가 SPI를 통해 ADC 데이터 읽기
| 관련 핀/넷 | 연결 |
|------------|------|
| \PZT_SPI_CS | U26.AC15 → U37 (ADC 칩셀렉트) |
| SPI_SCK | U26.AC9 (Flash와 공유) |
| SPI_MISO | U26.AD10 (Flash와 공유) |
### 4-6. 단일 측정 타이밍
```
|←── TX ──→|← 10μs →|←─────── 300μs RX 수집 ───────→|
펄스 출력 대기 ADC121S051 연속 샘플링
```
### 4-7. 전체 스캔 시퀀스 (예: Avg=5, N=3)
```
측정 명령 수신
Active Mode 진입 (PZT_PWR_EN = High)
├─ CH0 선택 (MUX → A0) → 1.3ms 대기
│ ├─ 1회: TX → 10μs → 300μs RX
│ ├─ 2회: TX → 10μs → 300μs RX
│ ├─ 3회: TX → 10μs → 300μs RX
│ ├─ 4회: TX → 10μs → 300μs RX
│ └─ 5회: TX → 10μs → 300μs RX
│ → CH0 평균값 산출
├─ CH1 선택 (MUX → A1) → 1.3ms 대기
│ └─ 5회 반복 → CH1 평균값 산출
├─ CH2 선택 (MUX → A2) → 1.3ms 대기
│ └─ 5회 반복 → CH2 평균값 산출
BLE 전송
Sleep Mode 복귀 (PZT_PWR_EN = Low)
```
---
## 5. 참고 사항
### 5-1. 배터리 전압 측정
- R28 (806kΩ) / R29 (2MΩ) 분압 → ADC_BAT
- 분압비: 2M / (806k + 2M) ≈ 0.713
- nRF52840 내장 ADC로 읽기
### 5-2. 충전 / 동작 상태 표시 LED
| LED | 색상 | 연결 네트 | 상태 | 표시 |
|-----|------|------|------|------|
| LED1 | 오렌지 | U3.STAT1 | 충전중 | 상시 점등 |
| LED2 | 블루 | U3.STAT2 | 충전 완료 | 상시 점등 |
| LED3 | 초록 | LED_BLE | BLE Advertising | 1초 간격 점멸 |
| LED3 | 초록 | LED_BLE | BLE 연결 후, Piezo 초음파 측정 후 복부 부착으로 감지된 경우 | 소등 |
| LED3 | 초록 | LED_BLE | Piezo 초음파 측정 후 탈착으로 감지된 경우 | 점등 1초 소등 3초 반복 |
| LED4 | 오렌지 | FUNCTION_LED | 기기 정렬모드에서 방광위치를 탐지하지 못하고 있을 경우 | 1초 간격 점멸 |
| LED3 | 초록 | LED_BLE | 기기 정렬모드에서 방광위치를 탐지하고 있을 경우 | 점등 3초 소등 1초 반복 |
- 기기 정렬 모드 : 빠른 주기로 초음파 측정
- 복부 부착, 탈착, 방광위치 탐지 유무는 앱에서 판단, LED 동작 모드 명령 송신
### 5-3. 펄서 고전압 전원
| 전원 | 생성 IC | 전압 | 용도 |
|------|---------|------|------|
| PZT_+25V | LT3463 (U32) | +25V | 양의 펄스 전압 |
| PZT_-25V | LT3463 (U32) | -25V | 음의 펄스 전압 |
| PZT_+10V | MCP1804 (U33) | +10V | MD1822 공급 전원 |
### 5-4. 수신부 아날로그 전원
| 전원 | 생성 IC | 전압 | 용도 |
|------|---------|------|------|
| +2.75V_CP | LM27762 (U38) | +2.75V | OPA2836 양전원 |
| -2.75V_CP | LM27762 (U38) | -2.75V | OPA2836 음전원 |
### 5-5. DFU 관련 주의사항
- nRF52840 DFU(Device Firmware Update) 부트로더에서 **P0.25를 사용하지 않도록** 수정 필요
- 기본 DFU 부트로더가 P0.25를 버튼 입력 등으로 사용할 수 있으므로, 커스텀 DFU 빌드 시 해당 핀 설정을 제거 또는 변경할 것
### 5-6. MAX14778 채널 스위칭 지연
- MAX14778 채널 전환 후 신호 경로가 안정되기까지 **1.3ms delay** 필요
- MUX_SelectChannel() 호출 후 반드시 1.3ms 대기 후 TX 펄스를 출력할 것
- 동일 채널 내 반복 측정 시에는 추가 delay 불필요 (채널 전환 시에만 적용)
---
## 6. 전력 절감 방안
### 6-1. Sleep Mode 소비 전류 줄이기
Sleep Mode에서 +3.3V_M에 상시 전원을 받는 IC는 3개이며, 각각에 대해 저전력 제어가 가능하다.
**nRF52840 (MCU)**
- BLE 연결 유지를 위해 System ON 슬립 상태를 사용
- 사용하지 않는 peripheral 클럭을 모두 비활성화
- RAM 리텐션 영역을 최소한으로 설정
- 위 조치를 통해 수 μA 수준까지 소비 전류 절감 가능
**W25Q32 (Flash Memory)**
- 대기 상태에서도 수 μA 소모
- 측정/저장 시에만 깨우고, 평소에는 **Deep Power-Down** 모드 사용
- Deep Power-Down 진입: SPI로 0xB9 커맨드 전송 → 소비 전류 약 1μA 이하
- 복귀: 0xAB 커맨드 전송 후 수 μs 대기
- \SPI_CS_FLASH를 High로 유지하는 것만으로는 불충분하며, 명시적으로 커맨드를 전송해야 함
| 상태 | 소비 전류 (대략) | 진입 방법 |
|------|:-:|------|
| Normal Standby | ~수 μA | 기본 상태 |
| Deep Power-Down | ~1μA 이하 | SPI 커맨드 0xB9 |
**ICM-42670 (IMU Sensor)**
- IMU를 상시 켜둘 필요 없음
- 측정 명령이 올 때만 Wake → 측정 → 다시 Sleep 시키는 방식 사용
- I2C로 슬립 모드 진입 또는 ODR(Output Data Rate)을 최소로 설정
| 상태 | 소비 전류 (대략) | 비고 |
|------|:-:|------|
| Full Rate 동작 | ~수백 μA | 가속도 + 자이로 활성 |
| Low Power / Sleep | ~수 μA 이하 | 측정 시에만 Wake |
### 6-2. Active Mode 체류 시간 최소화
Active Mode에서는 TX/RX LDO(U42, U41)뿐 아니라 LT3463(±25V), MCP1804(+10V), LM27762(±2.75V) 등 고전압/아날로그 전원이 모두 켜지므로 소비 전류가 크게 증가한다. 따라서 Active Mode 체류 시간을 최소화하는 것이 전력 절감에 가장 효과적이다.
**원칙: 측정 직전에 Active 진입, 측정 직후 즉시 Sleep 복귀**
**전원 안정화 시간 관리**
- PZT_PWR_EN = High 후 LDO/DC-DC 출력이 안정될 때까지 대기 필요
- 이 안정화 시간을 실측하여 필요 최소한으로 설정
- 불필요하게 긴 마진을 두지 않도록 주의
**스캔 시간 분석**
| 항목 | 시간 |
|------|------|
| MUX 채널 스위칭 안정화 | 1.3ms (채널 전환 시 1회) |
| 1회 측정 (TX + 10μs 대기 + 300μs RX) | ~310μs |
| 1채널 (Avg=5) | 1.3ms + 5 × 310μs ≈ 2.85ms |
| 6채널 전체 (Avg=5, N=6) | 6 × 2.85ms ≈ 17.1ms |
- 6채널 전체 스캔 자체는 약 17ms 이내로 완료 가능
- 전원 안정화 대기 시간이 오히려 더 큰 비중을 차지할 수 있음
- 채널 전환 → TX → RX를 타이트하게 구성하여 불필요한 간격 제거
**측정 파라미터에 의한 시간 절감**
| 파라미터 조절 | 효과 |
|--------------|------|
| Channel 개수 줄이기 | 측정 채널 수에 비례하여 Active 시간 단축 |
| 평균화 수 줄이기 | 반복 횟수에 비례하여 Active 시간 단축 |
| 간헐 측정 (측정 주기 늘리기) | Active 진입 빈도 자체를 줄임 |