JR2BMU logo

STM32 Nucleoでデジタル信号処理を試してみた(1)

 素人である私がSTM32 Nucleoボードをベースにデジタル信号処理を行ってみる過程をご紹介します。 単に「こう設定したら動いた」という内容で、圧倒的に知識が不足していますが、なにかしらのご参考になれば幸いです。
今回はシンプルに、アナログ信号を入力しADC-DACを経てそのまま出力するところまで目指します。

開発環境

以下のソフトウェアをインストールします
   ・STM32CubeIDE
   ・STM32CubeProgrammer

ソースコードの設定・編集

(1)STM32CubeIDEを起動し、新規プロジェクトを作成
(2)クロックの設定(System Core --> RCC)
   ・Mode --> HSE --> BYPASS Clock Source に設定
   ・Clock Configuretionタブを選択し、クロック周波数を設定
        今回は写真のように最高周波数に設定しておきました
circ_1
(3)ADCの設定(Analog --> ADC1)
   ・Mode --> IN1にチェックを入れる(PA1ピンを入力に使用)
   ・Configurationはデフォルト
(4)DACの設定(Analog --> ADC2)
   ・Mode --> OUT1 Configurationにチェックを入れる(PA4ピンを入力に使用)
   ・Configurationはデフォルト
circ_1

以上で設定は終了、保存(Ctrl+s)するとソースコードが生成され、main.cのタブが開きます

(5)ソースコードの編集
main関数内のユーザーコード記入箇所に以下のコードを追加します。
(5-1) 変数の定義
   /* USER CODE BEGIN 1 */
   int val;//入力値を格納
   int val_out;//出力値を格納
   /* USER CODE END 1 */
(5-2) DACのスタート
   /* USER CODE BEGIN 2 */
   HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
   /* USER CODE END 2 */
(5-3) while(1)ループ内を追加
   /* USER CODE BEGIN 3 */
   HAL_ADC_Start(&hadc1);//ADCスタート
   HAL_ADC_PollForConversion(&hadc1, 0);//変換終了まで待つ
   val = HAL_ADC_GetValue(&hadc1);//変換値を格納
   val_out = val;//入力値をそのまま出力に渡す
   HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, val_out);//出力値をDACに設定
   /* USER CODE END 3 */

以上のコードをコンパイルし、エラーなく終了することを確認します。

(6)書き込み
   ・STM32 NucleoボードをUSB経由で接続し、STM32CubeProgrammerを起動
   ・Connect --> Download(パスを指定) --> Start Programm.. --> Disconnect
以上でプログラム完了です。


動作確認

実際にPA1にアナログ信号を入力し、PA4から出力される信号を観察してみます。信号はアンプで適切な大きさ(0~3.3Vの範囲)に増幅した後に入力しています。 入力信号は1kHzの正弦波で、黄色が入力、赤色が出力です。入力信号と同じ信号が出力されていることがわかります。
circ_1
次回はDSPライブラリを用いたFIRフィルタの設定まで行います。

©JR2BMU All rights reserved.

inserted by FC2 system