Monthly FB NEWS 月刊FBニュース 月刊FBニュースはアマチュア無線の電子WEBマガジン。ベテランから入門まで、楽しく役立つ情報が満載です。

ものづくりやろう!

第十五回 オーディオフィルタ・アゲイン

JH3RGD 葭谷安正

1. はじめに

先月号ではトランシーバキットubitx用のシャーシ作成を紹介しました。このシャーシにubitxを入れて受信機として使用しているのですが、気になることがあります。このシャーシに入れるときにスピーカなども入れ替えたのでこれらも影響しているのかもしれませんが、以前より高音がよく響くなという感じがします。根本的な対応策ではないかもしれませんが、もっと高音が少ない音にすれば柔らかで聞きやすい音になるのではないかと思い、オーディオフィルタ(ローパスフィルタ)を装着して様子を見ることにしました。

第四回(2021年9月号)でGNURadioを使用したフィルタを紹介しましたが、GNURadioはPC上のソフトですので大物になります。シャーシに入る大きさで作りたいのでマイコンレベルで作ることにしました。使えそうな部品がないかと私の部品箱を探したところ、5年ほど前に購入して置いてあったPSoCキット「CY8CKIT-059 PSoC 5LP Prototyping Kit」を見つけました。


図1 CY8CKIT-059 PSoC 5LP Prototyping Kit

PSoCは、旧サイプレス・セミコンダクター社(現:インフィニオン・テクノロジーズ)が開発したマイコンの製品群です。ICパッケージの中に、アナログ回路やデジタル回路、はたまたマイコンがすべて入ったようなチップというべきでしょうか。面白いというか不思議なチップですね。このチップを搭載したプロトコル開発キットの一つが図1の「CY8CKIT-059 PSoC 5LP Prototyping Kit」です。

2. 製作

製作するものはPSoCを使ったオーディオフィルタです。オーディオフィルタと他の機器との接続状態は図2のようになります。

無線機のAudio端子からオーディオケーブルを使ってPSoC評価キットで作ったオーディオフィルタに信号を送り、PSoCでフィルタ処理を実施し、アナログ信号処理結果をPSoCでフィルタ処理された信号をスピーカに出力します。PSoCとスピーカもオーディオケーブルで接続します。


図2 オーディオフィルタと他の機器との接続

3. PSoC内の処理ブロック構成

PSoCの内部処理は次の順序に従って行われます。
(1) アナログ信号入力(無線機からのオーディオ信号を入力します。)
(2) AD変換(入力信号をアナログ信号からデジタル信号に変換します。)
(3) DMA転送(デジタル信号変換した8ビットの信号をDMAを通じてローパスフィルタに送ります。)
(4) ローパスフィルタ(信号中から指定の低周波の成分をとりだします。)
(5) DMA転送(フィルタ処理された信号をDMAを通じてD/A変換器に送ります。)
(6) アナログ信号出力(D/A変換器で処理された信号をピンに出力します。)

4. PSoCのプログラミング

PSoCのプログラミング処理は「PSoC Creator」という開発ツールを使って、ブロック配置とパラメータ設定を行うことで所定の機能を持つICを作成することができます。PSoC周辺に接続する部品は、信号カップリング用のコンデンサ2個と抵抗が1本です。この3つの部品については「PSoC Creator」でプログラミングを行うときに作成する図面上に記載します。

いきなりではありますが、PSoC開発ツールの一つPSoC Creatorを使って機能ブロックを作成していきます。PSoC Creatorの解説はインターネット上に沢山掲載されています。また、これを使用したシステム開発例やチュートリアルは「YouTube」上にもたくさんありますので、ここでは簡単に説明しておきます。

(1) PSoC Creator起動
ソフトのインストールなどは省略します。

・PSoC Creatorを起動します(図3)。

・アカウント登録についての画面が立ち上がりますが、「Register Later」を押して先に進みます。


図3 PSoC Creator起動画面

・「File」-「New」-「Project」でターゲットデバイスを選択し(図4)、テンプレートを選択しました。


図4 ターゲットデバイスを選択

・テンプレートはコード例があるときは「Code example」を選択すればよいです。今回使用したCY8C5888LTI-LP097はサンプル例が3つほどしかありませんので「Empty schematic」を選択しました。

・その後は、ワークスペースの名前や場所、プロジェクトの名前をデフォルト値から修正して、「Finish」を押します。ディレクトリー名に日本語を使用した場合はエラーが発生しますのでご注意を。

・「TopDesign」画面がたちあがります(図5)。このTopDesign画面に部品を配置していきます。


図5 TopDesign画面

(2) 部品配置
右画面の部品表から部品を画面にもってきました。

例えばAD変換器を配置するとき、部品がどこに分類されているのかわからないときは、「Search for」に部品名「ADC」などのキーワードを入力すると候補がでてきますので、その中から例えば{ADC‗DelSig}を選択して画面上にドラッグ&ドロップします(図6、図7)。


図6 部品検索


図7 部品配置

この要領で必要部品をすべて配置しました(図8)。結線もおこなってあります。


図8 部品配置・結線完了

PSoCチップの外に結線する部品を記載したい場合は、右の「Off-Chip」タブを選択した部品を選択し、部品と同様に配置していきます。例えば入力に抵抗とコンデンサ、出力端子にコンデンサを接続した場合、次のようになります(図9)。


図9 Off-Chip部品配置

(3) 部品パラメータの設定
部品のパラメータ設定は、その部品をダブルクリックすることで設定画面を開くことができます。例えば、フィルタブロックをダブルクリックすると次のように設定画面が開きますので、サンプルレートや、フィルタの種類他各種パラメータを設定していきます(図10)。私の場合、わからない項目についてはインターネットなどを参考に設定しました。


図10 フィルタのパラメータ設定画面

(4) DMAのパラメータ設定
図9を見るとDMA_1とFilter_1が結線されていません。同様に、DMA_2とVDAC8_1も結線されていません。では一体どのように信号のやり取り設定をするのでしょうか。これはDMA Wizardというツールを使って設定します。

プルダウンメニューから「Tools」-「DMA Wizard」を起動します。今回のようにDMAを複数個数使用している場合、下記画面のDMA欄に複数DMAが表示されますので、すべてを順番に設定します(図11)。

「DMA_1」を選び、「Next」を押すと、次の画面に移動します。「Source」と「Destination」を図9の結線に一致するように選択します。また、連続して動作させる場合は「Loop」をチェックし「Next」で次に進みます(図12)。


図11 DMA設定1


図12 DMA設定2

「Length」に「1」を入力し、「Next」選定します(図13)。


図13 DMA 設定3

すると図14のようにコードが出力されます。このコードはmain.cの中の該当部分にコピーする必要がありますので、メモ帳などにコピーしておきます。


図14 DMA用コードが出力されます。

DMAが複数個使用している場合は上記操作を同様に繰り返し、最後に出力されるコード(図14)をコピーしておきます。

(5) DMA用コードのmain.cへのコピー
図14のようにDMA用コードが自動作成されますが、これらのコードをmain.cにコピーします。どこに配置するのかわからないかもしれませんが、おおよそ、「#define」は#includeの次あたり「uinit8 DMA_1_Chan」、他の変数は「main(){」、下の変数定義部「DMA_1_TD[0] = CyDmaTdAllocate();」などは、変数定義欄の次に記載します。

(6) main.cへのブロックのStartコマンドの記載
使用するブロックのスタート命令をmain.cに記載する必要があります。今回作成したフィルタ回路を構成するブロックのスタート命令を記載します。記載する場所は「main(){」の中の繰り返し命令「for( ; ; )」の前部あたりです。

 ADC_DelSig_1_Start();
 VDAC8_1_Start();
 Filter_1_Start();
 Opamp_1_Start();
 for( ; ; ){ }

これらのコマンドを記載しないと動いてくれません。

(7) ProjectのBuild
Compile & Linkを行います。簡単には「Build」タグをクリックし、最上段の「Build」を選択します。この段階でエラーがあれば修正します。

エラーがなければ、ボードに書き込みます。ボードをPCに接続し、画面左上にある「Program」マーク(図15黄色部分)をクリックするとHEXファイルが書き込まれます。無事書き込みが終了するとプログラムに従って動きます。


図15 ボードへの書き込み

5. 動作状況

回路の不具合、または設定の不具合があるためか、雑音がひどい状況です。しかし、信号が入るとローパスフィルタとして働いています。ローパスフィルタやAD変換器のサンプリング数を変化させているが、最良点をまだ見つけ切っていない状況です。より良い性能を発揮するようパラメータを最適化していきたいとおもいます。

6. フィルタの測定結果

製作したローパスフィルタに周波数が異なり、出力レベルが同一の信号を入力し、フィルタ出力信号をオシロスコープ上で観測しました。結果は図16のようにローパスフィルタの特性を表していました。

しかし、オシロスコープで見る前にすでに耳でも明らかにわかる波形の歪やノイズが非常に多いと感じました。PSoCを使用したローパスフィルタの情報がネット上に沢山見受けられるのですが、どれもきれいな正弦波形です。まだどこかにエラーがあるのかもしれません。


(a)200Hz


(b)500Hz



(c)700Hz


(d)1000Hz

図16 ローパスフィルタの周波数応答(オシロスコープ画面の波形)

7. おわりに

開発環境に不慣れなため、ローパスフィルタボードが動くまでに1週間以上の日を要しましたが何とか動いてくれました。また、今回使用したボードのサンプルプログラムは数件しか見当たらず、完成するまでに悩むことの多い作業でした。

当初の目標はバンドパスフィルタも動くようにしたいと考えていましたが、バンドパスフィルタのパラメータを様々に変化させてみてもノイズのみしか出てくれず、そのためローパスフィルタだけになってしまいました(ひょっとしてボードが部分的に壊れているのか)。

また、AD変換器もデルタシグマAD変換器ではなく、ADC逐次比較型の設定を試みたのですが、だめでした。フィルタを入れずに、アナログ信号⇒AD変換⇒DMA⇒DA変換⇒アナログ信号は可能でしたが、あいだにフィルタを入れると(LPF、BPFいずれも)効果が見られませんでした。本来の目的であるubitxのケース内への組み込みはもう少し性能を改善してからにしたいと思います。

久しぶりに2週間にわたって「うーん、なんでだろう」と悩みながらトライアンドエラーをくりかえしましたが、

「悩むのもボケ防止にきっと役立つ」

と前向きに考えることにしました。

ものづくりやろう! バックナンバー

2022年8月号トップへ戻る

次号は 12月 1日(木) に公開予定

サイトのご利用について

©2024 月刊FBニュース編集部 All Rights Reserved.