burst 주파수 옵션 추가: 1.8 MHz ~ 2.3 MHz
This commit is contained in:
@@ -10,14 +10,23 @@
|
||||
#include "app_nvs.h"
|
||||
#include "debug_print.h"
|
||||
|
||||
/* burst 주파수 */
|
||||
#define PIEZO_CFG_FREQ_1_8MHZ 0
|
||||
#define PIEZO_CFG_FREQ_1_9MHZ 1
|
||||
#define PIEZO_CFG_FREQ_2_0MHZ 2
|
||||
#define PIEZO_CFG_FREQ_2_1MHZ 3
|
||||
#define PIEZO_CFG_FREQ_2_2MHZ 4
|
||||
#define PIEZO_CFG_FREQ_2_3MHZ 5
|
||||
|
||||
/* 앱에서 저장/변경 가능한 piezo 측정 기본값 */
|
||||
#define PIEZO_CFG_FREQ_DEFAULT 1
|
||||
#define PIEZO_CFG_FREQ_DEFAULT PIEZO_CFG_FREQ_2_1MHZ
|
||||
#define PIEZO_CFG_CYCLES_DEFAULT 7
|
||||
#define PIEZO_CFG_DELAY_DEFAULT 10
|
||||
#define PIEZO_CFG_SAMPLES_DEFAULT 100
|
||||
#define PIEZO_CFG_AVG_DEFAULT 3
|
||||
|
||||
/* 설정값 검증 범위 */
|
||||
#define PIEZO_CFG_FREQ_MAX PIEZO_CFG_FREQ_2_3MHZ
|
||||
#define PIEZO_CFG_AVG_MAX 10
|
||||
#define PIEZO_CFG_SAMPLES_MIN 80
|
||||
#define PIEZO_CFG_SAMPLES_MAX 117
|
||||
@@ -60,27 +69,27 @@ bool piezo_config_validate(const piezo_config_t *cfg)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cfg->freq != PIEZO_CFG_FREQ_DEFAULT)
|
||||
if (cfg->freq > PIEZO_CFG_FREQ_MAX) // 주파수 : 1.8 MHz (00 00) ~ 2.3 MHz (00 05) 범위에서만 동작하도록 제한
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((cfg->cycles < 3U) || (cfg->cycles > 7U))
|
||||
if ((cfg->cycles < 3U) || (cfg->cycles > 7U)) // burst cycles : 3 ~ 7 범위만 허용
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((cfg->avg == 0U) || (cfg->avg > PIEZO_CFG_AVG_MAX))
|
||||
if ((cfg->avg == 0U) || (cfg->avg > PIEZO_CFG_AVG_MAX)) // averaging : 1 ~ 10 범위만 허용
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (cfg->delay_us > PIEZO_CFG_DELAY_MAX_US)
|
||||
if (cfg->delay_us > PIEZO_CFG_DELAY_MAX_US) // burst-to-capture delay : 0 ~ 50 us 범위만 허용
|
||||
{
|
||||
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)) // sample count : 80 ~ 117 범위만 허용
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -148,8 +157,6 @@ const uint16_t *piezo_measure_single_buffer(void)
|
||||
*/
|
||||
int piezo_measure_start_session(void)
|
||||
{
|
||||
DBG_PRINTF("[SWEEP] piezo session start\r\n");
|
||||
|
||||
int err = piezo_init();
|
||||
if (err)
|
||||
{
|
||||
@@ -185,7 +192,12 @@ int piezo_measure_start_session(void)
|
||||
int piezo_measure_sweep(void)
|
||||
{
|
||||
const piezo_config_t *cfg = piezo_config_get();
|
||||
|
||||
uint8_t freq = cfg->freq;
|
||||
uint8_t cycles = cfg->cycles;
|
||||
uint16_t capture_delay_us = cfg->delay_us;
|
||||
uint16_t samples = cfg->samples;
|
||||
uint8_t avg = cfg->avg;
|
||||
|
||||
// 너무 짧은 delay가 들어오면 burst 직후 ADC capture가 겹치므로 최소 delay 보장
|
||||
if (capture_delay_us < PIEZO_BURST_TO_ADC_DELAY_US)
|
||||
@@ -193,9 +205,11 @@ int piezo_measure_sweep(void)
|
||||
capture_delay_us = PIEZO_BURST_TO_ADC_DELAY_US;
|
||||
}
|
||||
|
||||
DBG_PRINTF("[SWEEP] freq=0x%04X cycles=%u avg=%u delay_us=%u samples=%u\r\n", cfg->freq, cfg->cycles, cfg->avg, cfg->delay_us, cfg->samples);
|
||||
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[SWEEP] ch=%d start\r\n", ch);
|
||||
//DBG_PRINTF("[SWEEP] ch=%d start\r\n", ch);
|
||||
|
||||
// MUX 채널 선택
|
||||
int err = piezo_select_channel(ch);
|
||||
@@ -215,16 +229,24 @@ int piezo_measure_sweep(void)
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
}
|
||||
|
||||
if (ch == 0U) // 채널 0 시작 전에만 dummy burst 수행 TESTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
|
||||
if (ch == 0U) // 채널 0 시작 전에만 dummy burst + ADC capture 수행
|
||||
{
|
||||
// Dummy burst - ADC caputre는 수행하지 않음
|
||||
for (uint8_t dummy = 0; dummy < PIEZO_DUMMY_CAPTURE_COUNT; dummy++)
|
||||
{
|
||||
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);
|
||||
// 실제 측정 신호 흔들림 방지를 위해 dummy 측정에도 IRQ 잠금 적용
|
||||
unsigned int key = irq_lock();
|
||||
|
||||
// burst + delay + capture
|
||||
piezo_burst_sw_freq(freq, cycles); // 주파수 옵션 있는 burst 함수
|
||||
k_busy_wait(capture_delay_us);
|
||||
err = echo_adc_capture(echo_capture, samples);
|
||||
|
||||
// IRQ 잠금 해제
|
||||
irq_unlock(key);
|
||||
|
||||
if (err)
|
||||
{
|
||||
DBG_PRINTF("[ECHO] dummy capture fail ch=%d dummy=%d err=%d\r\n", ch, dummy, err);
|
||||
@@ -239,7 +261,7 @@ int piezo_measure_sweep(void)
|
||||
// 여기부터 실제 평균에 들어갈 capture
|
||||
memset(echo_accum, 0, sizeof(echo_accum));
|
||||
|
||||
for (uint16_t avg = 0; avg < cfg->avg; avg++)
|
||||
for (uint16_t a = 0; a < avg; a++)
|
||||
{
|
||||
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
|
||||
|
||||
@@ -247,35 +269,36 @@ int piezo_measure_sweep(void)
|
||||
unsigned int key = irq_lock();
|
||||
|
||||
// burst + delay + capture
|
||||
piezo_burst_sw((uint8_t)cfg->cycles);
|
||||
piezo_burst_sw_freq(freq, cycles); // 주파수 옵션 있는 burst 함수
|
||||
k_busy_wait(capture_delay_us);
|
||||
err = echo_adc_capture(echo_capture, cfg->samples);
|
||||
err = echo_adc_capture(echo_capture, samples);
|
||||
|
||||
// IRQ 잠금 해제
|
||||
irq_unlock(key);
|
||||
|
||||
if (err)
|
||||
{
|
||||
DBG_PRINTF("[ECHO] capture fail ch=%d avg=%d err=%d\r\n", ch, avg, err);
|
||||
DBG_PRINTF("[ECHO] capture fail ch=%d avg=%d err=%d\r\n", ch, a, err);
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
}
|
||||
|
||||
// 같은 sample index끼리 누적
|
||||
for (uint16_t i = 0; i < cfg->samples; i++)
|
||||
for (uint16_t i = 0; i < samples; i++)
|
||||
{
|
||||
echo_accum[i] += echo_capture[i];
|
||||
}
|
||||
}
|
||||
|
||||
// 채널별 최종 평균 파형 저장 - 이후 cmd handler가 reb: 패킷으로 전송
|
||||
for (uint16_t i = 0; i < cfg->samples; i++)
|
||||
for (uint16_t i = 0; i < samples; i++)
|
||||
{
|
||||
piezo_channels[ch][i] = (uint16_t)(echo_accum[i] / cfg->avg);
|
||||
piezo_channels[ch][i] = (uint16_t)(echo_accum[i] / avg);
|
||||
}
|
||||
|
||||
DBG_PRINTF("[SWEEP] ch=%d done\r\n", ch);
|
||||
//DBG_PRINTF("[SWEEP] ch=%d done\r\n", ch);
|
||||
}
|
||||
|
||||
DBG_PRINTF("[SWEEP] done\r\n");
|
||||
//DBG_PRINTF("[SWEEP] done\r\n");
|
||||
return ECHO_STATUS_OK;
|
||||
}
|
||||
|
||||
@@ -284,7 +307,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 freq, uint8_t cycles, uint16_t delay_us, uint16_t num_samples, uint16_t averaging, uint8_t channel)
|
||||
{
|
||||
if (channel >= PIEZO_NUM_CHANNELS)
|
||||
{
|
||||
@@ -320,7 +343,7 @@ int piezo_measure_single_capture(uint8_t cycles, uint16_t delay_us, uint16_t num
|
||||
for (uint8_t dummy = 0; dummy < PIEZO_DUMMY_CAPTURE_COUNT; dummy++)
|
||||
{
|
||||
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
|
||||
piezo_burst_sw(cycles);
|
||||
piezo_burst_sw_freq(freq, cycles);
|
||||
k_busy_wait(delay_us);
|
||||
|
||||
err = echo_adc_capture(echo_capture, num_samples);
|
||||
@@ -343,11 +366,13 @@ int piezo_measure_single_capture(uint8_t cycles, uint16_t delay_us, uint16_t num
|
||||
}
|
||||
|
||||
unsigned int key = irq_lock();
|
||||
piezo_burst_sw(cycles);
|
||||
k_busy_wait(delay_us);
|
||||
|
||||
piezo_burst_sw_freq(freq, cycles);
|
||||
k_busy_wait(delay_us);
|
||||
err = echo_adc_capture(echo_capture, num_samples);
|
||||
|
||||
irq_unlock(key);
|
||||
|
||||
if (err)
|
||||
{
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
@@ -414,8 +439,11 @@ int piezo_measure_adc_only_capture(uint16_t num_samples, uint16_t averaging, uin
|
||||
|
||||
// burst가 없으므로 ADC capture 자체의 간섭만 줄이기 위해 짧게 IRQ를 잠금
|
||||
unsigned int key = irq_lock();
|
||||
|
||||
err = echo_adc_capture(echo_capture, num_samples);
|
||||
|
||||
irq_unlock(key);
|
||||
|
||||
if (err)
|
||||
{
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
|
||||
@@ -38,14 +38,8 @@ int piezo_config_set(const piezo_config_t *cfg);
|
||||
|
||||
int piezo_measure_start_session(void);
|
||||
int piezo_measure_sweep(void);
|
||||
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_adc_only_capture(uint16_t num_samples,
|
||||
uint16_t averaging,
|
||||
uint8_t channel);
|
||||
int piezo_measure_single_capture(uint8_t freq, uint8_t cycles, uint16_t delay_us, 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);
|
||||
|
||||
const uint16_t *piezo_measure_channel_buffer(uint8_t channel);
|
||||
const uint16_t *piezo_measure_single_buffer(void);
|
||||
|
||||
Reference in New Issue
Block a user