Initial Commit

This commit is contained in:
2026-07-06 11:14:35 +09:00
parent e6de6e8cc3
commit e55b283b39
31 changed files with 1023 additions and 2123 deletions
+18 -32
View File
@@ -23,13 +23,10 @@
#define PIEZO_CFG_SAMPLES_MAX 117
#define PIEZO_CFG_DELAY_MAX_US 50
/*
* piezo_select_channel() 안에서 MUX settle 1.3 ms를 이미 기다린 뒤,
* measurement layer에서 analog path/ADC 입력 안정화를 위해 0.5 ms를 한 번 더 기다린다.
*/
/* piezo_select_channel() 안에서 MUX settle 1.3 ms를 이미 기다린 뒤 analog path/ADC 입력 안정화를 위해 0.5 ms를 한 번 더 기다림 */
#define PIEZO_POST_SELECT_SETTLE_US 500
/* 평균/dummy burst 사이의 회복 시간 */
/* burst 사이의 회복 시간 */
#define PIEZO_AVG_INTER_BURST_GAP_US 650
/* real capture 전에 같은 채널에서 버스트+ADC capture를 버리는 횟수(dummy) */
@@ -83,8 +80,7 @@ bool piezo_config_validate(const piezo_config_t *cfg)
return false;
}
if ((cfg->samples < PIEZO_CFG_SAMPLES_MIN) ||
(cfg->samples > PIEZO_CFG_SAMPLES_MAX))
if ((cfg->samples < PIEZO_CFG_SAMPLES_MIN) || (cfg->samples > PIEZO_CFG_SAMPLES_MAX))
{
return false;
}
@@ -219,24 +215,20 @@ int piezo_measure_sweep(void)
return ECHO_STATUS_CAPTURE;
}
// Dummy burst + dummy capture - 결과는 버리고, piezo/mux/ADC 입력의 이전 상태가 real 평균에 섞이지 않도록 함
for (uint8_t dummy = 0; dummy < PIEZO_DUMMY_CAPTURE_COUNT; dummy++)
if (ch == 0U) // 채널 0 시작 전에만 dummy burst 수행 TESTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
{
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
piezo_burst_sw((uint8_t)cfg->cycles);
k_busy_wait(capture_delay_us);
err = echo_adc_capture(echo_capture, cfg->samples);
if (err)
// Dummy burst - ADC caputre는 수행하지 않음
for (uint8_t dummy = 0; dummy < PIEZO_DUMMY_CAPTURE_COUNT; dummy++)
{
DBG_PRINTF("[ECHO] dummy capture fail ch=%d dummy=%d err=%d\r\n", ch, dummy, err);
return ECHO_STATUS_CAPTURE;
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
piezo_burst_sw((uint8_t)cfg->cycles);
k_busy_wait(capture_delay_us);
}
// 마지막 dummy capture와 첫 real capture 사이에도 같은 회복 시간
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US + 3000);
}
// 마지막 dummy capture와 첫 real capture 사이에도 같은 회복 시간
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
// 여기부터 실제 평균에 들어갈 capture
memset(echo_accum, 0, sizeof(echo_accum));
@@ -285,11 +277,7 @@ int piezo_measure_sweep(void)
* 단일 채널 burst + echo capture
* mec? 디버그/테스트 명령에서 사용하며, 결과는 echo_capture에 평균 저장
*/
int piezo_measure_single_capture(uint8_t cycles,
uint16_t delay_us,
uint16_t num_samples,
uint16_t averaging,
uint8_t channel)
int piezo_measure_single_capture(uint8_t cycles, uint16_t delay_us, uint16_t num_samples, uint16_t averaging, uint8_t channel)
{
if (channel >= PIEZO_NUM_CHANNELS)
{
@@ -321,7 +309,7 @@ int piezo_measure_single_capture(uint8_t cycles,
return ECHO_STATUS_CAPTURE;
}
/* real capture 전에 같은 채널에서 dummy burst/capture를 수행하고 버림 */
// real capture 전에 같은 채널에서 dummy burst/capture를 수행하고 버림
for (uint8_t dummy = 0; dummy < PIEZO_DUMMY_CAPTURE_COUNT; dummy++)
{
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
@@ -335,7 +323,7 @@ int piezo_measure_single_capture(uint8_t cycles,
}
}
/* 마지막 dummy capture와 첫 real capture 사이에도 같은 회복 시간 */
// 마지막 dummy capture와 첫 real capture 사이에도 같은 회복 시간
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
memset(echo_accum, 0, sizeof(echo_accum));
@@ -377,9 +365,7 @@ int piezo_measure_single_capture(uint8_t cycles,
* 단일 채널 ADC-only capture
* piezo burst 없이 현재 echo ADC 입력만 평균해서 확인할 때 사용
*/
int piezo_measure_adc_only_capture(uint16_t num_samples,
uint16_t averaging,
uint8_t channel)
int piezo_measure_adc_only_capture(uint16_t num_samples, uint16_t averaging, uint8_t channel)
{
if (channel >= PIEZO_NUM_CHANNELS)
{
@@ -419,7 +405,7 @@ int piezo_measure_adc_only_capture(uint16_t num_samples,
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
}
/* burst가 없으므로 ADC capture 자체의 간섭만 줄이기 위해 짧게 IRQ를 잠금 */
// burst가 없으므로 ADC capture 자체의 간섭만 줄이기 위해 짧게 IRQ를 잠금
unsigned int key = irq_lock();
err = echo_adc_capture(echo_capture, num_samples);
irq_unlock(key);