인프런 커뮤니티 질문&답변

장영도님의 프로필 이미지
장영도

작성한 질문수

STM32 FFT 구현

FFT

작성

·

226

·

수정됨

0

WinIDT에서 Read ADC0에서 fft값을 보기 위해서는 기존 코드를 수정해야 하는 건가요?

현재 stm보드는 강의와는 달리 stm32f429를 사용하고 있습니다.

본 강의자료에서의 세팅을 제 보드에 맞게 설정 진행했는데, WinIDT 연결은 확인이 되지만 fft값을 보는 과정에서 잘 이루어지지 않았습니다.

 

adc 핀에는 제가 보유한 마이크 센서인 MAX9814를 활용했고, 출력핀이 하나여서 PC13에만 연결 진행했습니다.

답변 1

0

alex님의 프로필 이미지
alex
지식공유자

안녕하세요.

증상이 어떤지 명확하지가 않지만 아래 사항 확인해 보시길 바랍니다.

1) WinIDT 에 메시지가 안나올 때 : Uart등 기본적인 설정들을 확인합니다.

2) 데이터값이 0 나 가비지 값이 나올 때 : ADC, DMA 설정을 확인합니다. 또는 ADC 입력(HW)을 확인합니다. max9814 대신에 로직 아날라이저나 기타 입력을 넣어서 확인합니다. 3V ~ 0V를 입력해 봅니다.

stm32f311이나 stm32f429나 큰 차이는 없을 것 같습니다.

감사합니다 ~!!

 

장영도님의 프로필 이미지
장영도
질문자

답변 감사합니다.

1번 상황에서 맨 처음 연결 메세지가 정상적으로 나오고, FFT 값을 보려고 FFT ADC 0를 누르면 값이 올라오지 않는데, 이 이유가 무엇인지 궁금합니다.

alex님의 프로필 이미지
alex
지식공유자

먼저 PC에서 보드로 전송하는 Uart 데이터를 확인해야 합니다. "FFT ADC 0 " 라디오 버튼을 클릭시, "FFT CH-0 buf : A (or B)" 라는 메시지는 나오는지요? 프로그램 내부에 adc data 저장을 위하여 더블 버퍼(buf-A, buf-B)을 사용하고 있습니다. 아래 코드는 "FFT ADC 0" 라디오 버튼 클릭시 실행되는 내용입니다. 이 내용대로 한라인씩 디버깅 해보시길 바랍니다.

// comm_task.c

// FFT adc ch0

else if( (comm_buf[0]=='f') && (comm_buf[1]=='f') && (comm_buf[2]=='0') )

{

gAdcWriteStop = 1;

if(gAdcWriteFlag == ADC_BUFA)

{

uart1_puts((uint8_t *)"\r\n FFT CH-0 buf : B ");

arm_hexa2f32(&gAdcDataB[0], 0);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);

fft_index = arm_fft_adc_test();

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

uart1_puts_16d((uint8_t *)"\r\n arm_fft_index : ", fft_index);

uart1_puts_16d((uint8_t )", freq : ", (uint16_t)(fft_index2000.0 / FFT_SIZE));

}

else

{

uart1_puts((uint8_t *)"\r\n FFT CH-0 buf : A ");

arm_hexa2f32(&gAdcDataA[0], 0);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);

fft_index = arm_fft_adc_test();

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);

uart1_puts_16d((uint8_t *)", arm_fft_index : ", fft_index);

uart1_puts_16d((uint8_t )", freq : ", (uint16_t)(fft_index2000.0 / FFT_SIZE));

}

gAdcWriteStop = 0;

}

 

장영도님의 프로필 이미지
장영도

작성한 질문수

질문하기