2024年9月17日火曜日

STM32 ADC→DMA→MEM→DMA→DAC データスルー

残暑厳しい折、信号処理LOVERSの皆様におかれましては益々ご健勝のことと存じます.

STM32H723の自作基板の火入れをしています.

動作確認のため、ADCとDACをDMAで直結するのを試しました.動きました.
DAC CH1について:
1)TIM15で32kHzを発生し、ADCのtriggerとする
2)ADC-DMAで一気に1024サンプルをメモリに積ませる
3)DAC-DMAでDAC CH1に送る メモリは2を共用
4)DAC CH1から出るのはアナログ信号のスルーである
5)ADCとDACが等しいレートで動く必要があるのでDACもTIM15でtriggerされる

DAC CH2について:
・DAC内蔵の三角波発生機能を動かす
・0~4095のloopなので、32kHz/4096/2=3.9Hz が出てくる

「ADCもDACもTIM15でtriggerされる」という点が今回の動作検証の最重要ポイントです.入りと出しのレートがピッタンコ合わないとデータロストしますからね.

ーーーー
ADCの設定
画面はSTM32CubeMX.
重要かと思うところに下線を引きました.
・12bitにしたのは、DACが12bitなのに合わせました
・continuous conv. mode = disabledはDMAが1024積み後に割り込んでもらうため.これをenableにしてしまうと毎サンプル割り込んできやがる
・DMAの相手先メモリをリングバッファにしたいのでDMA circular modeです
・TIM15 trigger out eventで32kHzサンプルにします
↓ADCのDMA設定

ーーーー
DACの設定
・TIM15 trigger out eventで32kHzサンプルにします これ重要
・CH2はTriangle wave gen.にして、0~4095を動きます
・DACのフルスケールは12bit=4095=3.3V
↓DACのDMA設定

ーーーー
main()のキモのところ
ADC~DACのdata flowの全てがhardwareで処理されるので、3つのSTARTを行えば自走してくれます.ソフトでメモリ操作はしません.
uint32_t ADCfifo[1030];
int main(void) {
 HAL_ADC_Start_DMA(ADCPORT, &ADCfifo[0], 1024);
 HAL_DAC_Start_DMA(DACPORT, DAC_CHANNEL_1, &ADCfifo[0], 1024, DAC_ALIGN_12B_R);
 HAL_DAC_Start(DACPORT, DAC_CHANNEL_2);
 while(1){ }


以上です

かしこ

2 件のコメント:

  1. すっかり忘れてました・・・
    https://www.youtube.com/watch?v=kvEFOHIt1Vg
    謎企画「桃ワショ」ゲーム実況
    ※アーカイブが残ってるみたいです、というか、終わった後に、
    ・YouTube の、おススメ
    に、出てきました(笑)
    ※まだ全部見てないけど、結構難しい?みたいですね。でもやっぱり、
    ・まんま「Unity(か、何かのゲームプラットフォーム)」っぽい作りに見える
    のですが・・・知らんけど

    返信削除
    返信
    1. リアタイしました
      前から飛んでくる缶ビールが難易度を高くしています
      放映時間終了ちかくなってあっけなくクリアしたのはたぶんルパさんでした

      オツトゲ~

      削除