ArmマイコンにTRY5 ADをTIMトリガーで使ってみる。


写真はNECLEO STM32F446RE評価ボードで、プログラム作成にTRYの様子。

2023.12.19

はじめに
 「ARMマイコンにTRY5」では、ADにTRYです。
 SDRトランシーバーでは、入力信号のAD処理性能でほぼSDR性能が決定する、重要な構成要素です。
 今回は、入力信号を1Msps(1usサンプリング)で、DMA転送でメモリーに入れるまでのソフトにTRYです。

STM32F4のAD
 STM32F446は、ADが3CH搭載されており、データシートでは、タイマートリガーモードで1.7Msps(ADクロック30MHz時)なので、IF信号455kHzのサンプリングに関しては、 やや実力不足ぎみですが、実際に評価していきます。
 データシートでは他に2Mspsのデータも記載がありますが、トリガーモード条件ではなさそうなので、今回はトリガーモード使用でのADの実力評価もしてみたいと思います。
 ADにトリガーをかけるタイマーはTIM1〜TIM5、TIM8が使用できるので、今回はTIM3を使ってみます。

プロジェクトの作成、コード生成
-1.「Lチカ」でのプロジェクト作成手順に同じですが、プロジェクト名は適当に「renshyuAD」とします。
-2.続いて、ピン配置の設定。PA0をADC1入力、PA5をGPIOoutputに設定、デフォルト状態では、それ以外のピンも設定されていますが、reset_stateにします。
-3.続いて、1us毎のトリガ作成する為のTIM設定、Categories欄をクリックTimer >TIM3をクリックでMode欄のClock SourceをInternal Clockを選択、それ以外はデフォルトのDisable
パラメーター設定として
Prescaler 6-1. Counter mode UP. Counter periode 14-1. Internal Clockdiv NoDivision. auto-reload Enable Tttiger Output> Master/Slave〜をDisable Trriger EventをUpDate Eventに設定
-4.次にADの設定、Categories欄をクリックAnalog > Mode CH0設定、Configurationの設定 Mode independent mode. PCLK divided by 4. Resolution 12bit Data aligment Right. TrigをTIM3 Trig outに設定、他はデフォルト。
-5.次にDMA設定、addをクリックしADC1を追加します。
-6.クロック設定として、TIM3へのクロックを84MHzにします。TIM3の設定でPrescaleを6-1、Preodeを14-1にしたので1us毎にADをトリガ―することになります。 当初、Prescaleを84-1、Preode 0として設定したらAD値がエラーとなり、原因が判るまで時間がかかりました。
-6.次にメニュー欄のコード生成ボタン(歯車マーク)をクリックで、ひな型コードが表示されます。

  ソースコードの記述

 /* User code Begin0 */ 〜 /* User code End0 */ の間に、AD値を保存用Buff uint16_t adbuf[16]; と記述。/* User code Begin2 */ 〜 /* User code End2 */ と/* User code Begin3 */ 〜 /* User code End3 */の間に左図ひな型ソース(クリックで拡大)を記述します。
98行目、117行目のGPIO SET,RESETはデバック動作確認用です。
 次に、ビルド(トンカチマークアイコン)をクリックしてエラーがなければ、PCとボードをUSB接続してRunをクリックすればプログラムが書き込まれる。
 

 

テスト回路

 AD入力に左図外付け回路を追加しボード上コネクタCN8 A0にAF信号を入力し、AD結果を確認します。
 AD端子のプルアップ抵抗は低インピーダンスでドライブする都合100Ωと、比較的低抵抗を使用します。 AF信号として、100kHzのSin波を供給してAD結果をExcelでグラフ化してみます。

 

AD結果を見てみる

   AD結果は、adbuf[0]〜adbuf[15]の値をデバックモードで走らせて確認出来ます。デバックモードで走らせると、変数確認などの画面が出るので expressionをクリックして確認したい変数値をaddすれば、結果が表示されます。
 左図は、得られたadbuf値をexcelに入力し、グラフ化した図です。縦軸にadbuf値、横軸にadbuf数、入力信号100kHzの1サイクル区間に10ヶの サンプリングデーターが得られているので1us毎にトリガーがかかってADしていることが読み取れます。
 入力信号を455kHzにすると、excelの散布図グラフではきれいなsin波にならないので、確認は100kHzとしました。

今後の進め方
 AD処理まで、ほとんどコードを書かずHAL関数のみできました。SDRとしてまとめるには、基本的な処理の他にも、SDR機能のソースもひつようです。
次回はI2C制御にTRYしてみます。

TIMに戻る
I2Cを使ってみるへ
   Top Menu