spi LCDにFFT結果を表示させる

前回からの続きですが、spi LCD (320*240 : st7789)に結果を表示させます

一点ハマりどころは、ドライバーの標準サポートが240*240までのこと

https://github.com/AlexKaut/ST7789-STM32-DMA

実は単純に数字の書き換えだけではうまくいかなくて、結局数箇所変更

物理インターフェースはspi2使うように.hファイル変更(これは以前に実施済み)

/* choose a Hardware SPI port to use. */
#define ST7789_SPI_PORT hspi2		// to accommodate with actual usage
extern SPI_HandleTypeDef ST7789_SPI_PORT;

画面サイズの定義は、これも.hファイル変更

#ifdef USING_240X320
    #if ST7789_ROTATION == 0 || ST7789_ROTATION == 2
        #define ST7789_WIDTH  240
        #define ST7789_HEIGHT 320
    #else
        #define ST7789_WIDTH  320
        #define ST7789_HEIGHT 240
    #endif

    #define X_SHIFT 0
    #define Y_SHIFT 0
#endif

に変更


初期化の処理に最後に、これは.cファイル変更

void ST7789_Init(void)

 	ST7789_SetRotation(ST7789_ROTATION);	// to change for using 320*240 Panel
 	
 を追加、

この変更で、320*240でかつローテーション表示(横方表示)ができるようになりました、結果表示はこんな感じですが、

<動画はこちら>

マイムービー – 大- 540p

 

<気付き>

① ノイズレベルがかなり変動、それはFFT処理の中身からしてそう言うものらしいので見せるための処理、例えば平均化とかが必要、USBオシロのFFT機能で見るとフラットに見える、ただしS/Nが基本波で60db程度取れているのはほぼ同等

② 基本波と第三高調波の差が見かけ20db程度ある、入力は5KHzのDuty 50%のPWMなので理屈ではおよそ9dbぐらいの際になるはず、ノイズレベルのカーブからするとADCの入力にこんな周波数特性があるのかもしれない

LCDへの表示処理は見かけ1秒近くかかっているので、FFT処理は比較すると瞬時

実測でFFT計算関連書処理時間はおよそ3.2ms、512samples*40Kspsだとおよそ13msなので十分にFFT処理は高速、実際のFFT計算は0.5msぐらいで完了するだろうから前後の処理が大半を占めています

<rtosの処理>

・ADCサンプル/FFT実行タスク

表示タスクにはFETした結果が準備できたら通知(xTaskNotifyGive)、LCD表示タスク側の処理が終わったら送られる通知を待つ(ulTaskNotifyTake)

void StartTask02(void *argument) {
	/* USER CODE BEGIN StartTask02 */
	// ADC DMA start & Hann window coefficient calculation
	Init_HannWindow();	// to prepare Hann window coefficient
	Init_Iir_FFT_Instance();	// to initialize IIR filter and FFT instance

	HAL_ADC_Start_DMA(&hadc1, (uint32_t*) adc_dma_buff, DMA_COUNTS);
	HAL_TIM_Base_Start(&htim3);

	/* Infinite loop */
	for (;;) {
		Adc_Process();
		xTaskNotifyGive(lcd_TaskHandle);	// start LCD display task
		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);// wait for LCD display completion
		osDelay(1);
	}
	/* USER CODE END StartTask02 */
}

・LCD表示タスク

void StartTask03(void *argument) {
	/* USER CODE BEGIN StartTask03 */
	ST7789_Init();
	ST7789_SetRotation(1);   // 90度回転
	ST7789_Fill_Color(BLACK);
	draw_fft_frame();
	/* Infinite loop */
	for (;;) {
		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);	// wait for FFT data ready
		Lcd_Process();
		xTaskNotifyGive(adc_TaskHandle);	// restart FFT task
		osDelay(1);
	}
	/* USER CODE END StartTask03 */
}

もう少し中身を吟味して次のアクション決めよう

 

admin

コメントを残す