手習ひデジタル信号処理(1) ADからDA、ポーリング方式をなぞってみる

Joseph Halfmoon

デジタル信号処理を学び直すべし、ということで三上直樹先生著のご本を購入部品も購入し回路を作成、そして関連の雑誌記事発見、と準備に3回もかけてしまいました。いよいよネタバレにならない程度に本文を学んでいきたいと思います。まずはプログラムがビルドできるところからかな。インポートできるみたいだし、何もすることがない?

※「手習ひデジタル信号処理」投稿順 Indexはこちら

ソースコードその他付録記事など、工学社様のサイトからダウンロード(要ご本記載のパスワード)してはあるのです。しかし、ちょっと気になっていたのが謎の『呂』です。Armのオンライン開発環境で『呂』で検索すれば著者三上先生様のプログラムやライブラリが見つかり、インポートできるのだ、と。

初回実習は、ADコンバータから読み取った値をDAコンバータへ垂れ流し、それもポーリング方式です。メインプログラムみたらゴッツイ簡単ですが、ちゃんとAD読み取りとDA書き込みのクラスをご用意していただいているお陰です。どちらかというとその辺を勉強せねばとも思うのですが、まずは「コンパイル」ができて、実機でご本の通りに動作する、ということを確認すべし、と。

早速、気になっていた『呂』で検索をかけてみることにいたしました。オンラインのArm Mbedにログイン(無料です。)空のプロジェクトでインポートをかけてみます。インポートは以下のボタンから。

Importさて、『呂』で検索させていただくと、以下のように大量のプログラムがヒットしてまいります。三上先生凄い。しかし、『呂』とは

呂不韋

だったのね。なにか「深い闇」が横たわっている感じがします。踏み込みますまい。

Import000しかし、大量にありすぎる上、ご本のプログラムとピタリと一致しそうなものがどれだかわかりません。いちばんそれらしそうな以下のタイトルのプログラムをインポートすることにいたしました。

Demo_DSP_ADDA

内部を拝見すると、ADから入力してDAに出力ではあるのですが、ご本の本文記載のコードと少しことなり、ポーリング方式と割り込み方式が一つのファイルに なっており、#if文で切り替える形でした。ご本ではまずポーリングをやり、次に割り込みと2段ステップです。今回は忠実にご本の通りにという方針で、勝手編集してご本のとおり?のポーリング方式のみのソースとさせていただきました。さてコンパイル(Mbed環境では、なぜかビルドではなく、「コンパイル」ボタンです。実際にはライブラリファイルとリンクもしている筈)すると以下のエラーが出ました。「まずは自分を疑え、基本のキから」

Error000まあね、プロジェクト・インポートしたら何も設定しなくても出来るっしょ、と思ったのが間違いでした。以下を御覧じろ。

BadBoard

ターゲットボードが、以前に使った時のままになっていました。同じNUCLEOでもF072RBです。今回ターゲットはF446REなので、こいつに変更しておかないと動きませぬ。F446REへの変更ボタン(Mbed環境に設定する)とF446REボードの諸元は以下のページに掲載されています。

NUCLEO-F446RE | Mbed

なお、一度ターゲットボードを設定しておけば、Mbed環境の右肩のターゲットボードのところをクリックすることで以下のようなウインドウが開いてボードを選択することができます。ボードを選択して右肩のSelectボタンをクリック。

SelectBoard上みると3枚目のNUCLEOだ、ということも分かります。さて、ターゲット・ボードを正しく設定すれば、ちゃんとビルドは通ります。こんな感じ。でもPollingの綴りを間違えてました。しまりません。

Success000生成したオブジェクトをNUCLEO-F446REへ書き込みます。ご本では、信号源となるパターンジェネレータや、出力観察のためのオシロもNUCLEO-F446REで実行しています。実際、付録ファイルのプログラムを使ってオシロとして動作することを確かめました。しかし、それをするには、NUCLEO-F446RE3台体制が必要です。3台は無いので、いつものように Digilent Analog Discovery 2 に、信号源とオシロをやってもらいます。1kHz、振幅1Vの制限波を入力するとこんな感じ。黄色が入力波形、青色が出力波形です。

Wave000入力は0V中心に振れていますが、外付け回路のおかげでAD入力では約1.6V付近中心となっているようです。上の画面ではCH2のY軸が見えてないですが、「そのままスルー」でDA出力では約1.6V付近にいました。タイミングを観察すると、ADを読んで、DAに書き込むという作業にかかる時間分、わずかに青が遅れているように見えます。この辺は予定通りであるな。

しかし、波形キレイすぎるのでないかい。ご本の本文第1ステップでは出力ガタガタな波形がでてくるはずなのだけれど。念のため入力信号を正弦波から3角波に替えてみます。やはりキレイ。

Wave001思うに、何か設定を「先走って」いるようですな。インポートしたプログラム、本文の後の方にでてくる「完成形」に近いライブラリを使っているんでないだろうか。どうも、ご本で説明されている「途上」の「変な波形」の版ではないのだな、きっと。

ダウンロードしたファイル内には、各ステップ毎のバイナリファイルも含まれていたので、そちらをボードに書き込んで、正弦波を食わせてみました。こんな感じ。ガタガタになった。よかった。ガタガタになって喜ぶのも妙ですが。

Wave002これだね、発展途上の設定では、こうでないとなりませぬ。

折角、Mbed環境から「完成形」のプログラムをインポートしたのですが、別途プロジェクトを作りなおし、ダウンロードしたファイルから「発展途上」のプログラムをアップロードして、ビルドツリーを作り直しました。

でも、そのままでは今走っているバイナリと差が無くて芸が無さすぎるので、つまりませぬ。そこで以下1行のみ勝手に改変させていただきました。出力波形の振幅が半分になるように。これで波形を「見れば分かる」状態になったはず。

myDac.Write(xn/2);            // 出力

書き込んで動かしてみたところが以下に、ガタガタで振幅半分。いいね(何が?)

Wave003ま、ビルドは出来ました。AD、DAを使うためのライブラリもMbed環境でセットアップ済と。先は長いケド。

デバイスビジネス開拓団トップへ

手習ひデジタル信号処理(2) ADからDA、割り込み方式、STM32のハードの裏とり? へ進む