基本設計
企画時に決めた要求仕様は、おおむね以下のようなものです。
- 小型オーディオアンプ
- スピーカー出力はステレオ1.5W+1.5W(4~8Ω)
- アナログ入力×2+Bluetooth×1
- 入力にミキシング機能を有する、音質にこだわりなし
- 省電力
内部構成の検討
Bluetoothを使いたいのですが、デジタル信号(PCM)を、どこでアナログに変換するかのが良いのか決める必要があります。
①は以前の回路構成で、アナログ回路中心の場合です。オーディオ機能付きのBluetoothモジュールは、ほとんどがアナログ出力を備えているので、通常はDACは不要です。よって、回路的には単なるミキシングアンプです。大変シンプルで、コスト面で最良と思われます。これで十分でしょう。ただし、これに対応するBluetoothモジュールは入手が面倒なのが、マイナス点となります。また、省電力化には追加の機能が必要です。
②はデジタル部分を拡大し、ミキシングをデジタル信号演算処理にするものです。専用ICもしくはマクロコントローラが必要になって来ます。図に書いてみると、一旦デジタルにして、またアナログに戻すという無駄な事をしているように見えます。デジタルでしかできない信号処理や、コスト的に優位となるような条件でもなければ意味は少ないと思われます。中途半端な構成と言えるかもしれません。
③はアンプの部分さえもデジタル化する構成です。D級アンプのように、PWM変調でスピーカを駆動しますので、アナログ的な部品が不要となります。構造的にノイズの入り込む部分は、ADC部とスピーカドライバ部に限られてきますので、音質劣化が少なくなる事が期待できます。フルデジタルアンプと呼んでよいかも。この要件を実現している部品は、見つけられないので、マイクロコントローラに頼る必要があります。ほとんどの製品にはADCもPWMも装備しているので実現可能です。
選択:「③デジタル化構成B」にしたいと思います。
選択理由は、私的な興味です。音声信号を一度数値列にして、本当に元通りの音がでるのか?という技術を体感してみたかったのです。
Bluetooth入力部分の検討
Bluetoothからの音声信号を受けるための方法・製品を調査・検討します。Bluetooth上で音声データを扱うプロファイルは幾つかありますが、オーディオ品質に対応するのはA2DPです。また、音源となる方を”Source”、受ける方を”Sink”と呼んでいます。今回は、スピーカですので音声データを受ける”Sink”に対応する部品を探す必要があります。普通に流通していて、入手容易なBluetooth機能/部品などを探し出します。もちろん音声信号をデジタル出力できるものでなければ意味がありません。
・Bluetoothモジュール Microchip RN52
2980円/マルツ
音声データ出力は、I2SもしくはS/PDIF
音声デコードは、SBC, AAC, aptXをサポート
マイク入力、アンプ付き(「アナログベースの構成」に対応可能だった?かなり高機能)
・USB-Bluetoothアダプタ
PC用に1000円程度で入手容易(メーカを問わずV2.1でも可能)
音声データ出力はメモリバッファ渡しPCM符号付き16bit(*1)
音声デコードはSBC(*1)
USB接続なので、USBホスト機能が必要
高パフォーマンスのCPUが必要
*1) 正確な条件はBluetoothスタック次第
・Bluetooth機能を内蔵したマイクロコントローラ
品種が増えつつあるが、まだ入手性はよくない
ESP-WROOM-32:いけそう、安い、詳細は要調査
Raspberry Pi Zero W:検討当時無かった
選択:USB-Bluetoothアダプタにします。
入手しやすさ、低コストと、CPUは別件で高性能の物が必要だったので、この選択としました。
ライン入力部分の検討
オーディオ機器間は、ラインレベルで接続する事が一般的です。具体的な仕様を知らなかったので、調べました。
どうやら規格仕様としてはあるものの、実態としては合っていない機器もあるようです。しかしながら、これぐらいの信号レベルがあるのなら、ADCで受けるのは、難しくないと思われます。ADCでキャプチャするには
- マイクロコントローラのADC直受けするにはAVdd=3.3V以下、理想的な入力条件にするには、約4倍ゲインのプリアンプが必要
- 最大レベルを無視しないのであれば、アッテネータ的なものが必要
- ADC分解能が良ければ、ソフトウェアで増幅する事も可能(ノイズ的には不利)
- 直受けでは、ADCの電気的な保護が必要
マイクロコントローラで直受けできれば部品数を減らせます。しかし、実際のオーディオ機器は様々な信号レベルがあり、それを調整(増幅/減衰)する仕組み<プリアンプ>が、やはり必要なようです。
ヘッドフォン出力のような、小信号の音源では、ADCのサンプリング解像度にたよる解決法も考えられます。十分に高い解像度があれば計算で増幅(乗算)すれば良いだけです。今回は12bitの精度ですが、実際耳が我慢できるレベルなのか自信がありませんでしたので、実際回路を組んで確認しました。結果、まるでダメな訳ではありませんでしたが、ホワイトノイズが浮き出て来て長期的に使っていると気になって来る感じでした。
もう少し音質が上がれば言う事はありません。ソフトウエアで音質改善(デジタルフィルタ)できる可能性はありますが、苦労した末にダメと分るかもしれません。プリアンプをつければ、この不安を払拭できます。オペアンプ汎用品種を使えますので、コスト的にも問題は出ないでしょう。
選択:〜4倍程度のプリアンプを付ける
スピーカ出力部分の検討
スピーカのPWM駆動回路
PWM信号でスピーカをドライブする回路は、一般的に以下の様になる様です。
①ハーフブリッジ駆動
基本これだけでもデジタルーアナログ変換となります。スピーカを巻き込んだLCフィルタ回路です。難点は無音時では50%PWMとなりますので、音としては感じられませんがエネルギー消費があります。コイル、コンデンサ、スイッチング素子で熱に変わるだけです。
②フルブリッジ駆動 その1
同じ電源電圧でも、ハーフブリッジに比べ、倍の電圧で駆動されます。バッテリーを使わなければならないなど、電源事情が厳しい場合には有効だと思われます。スイッチング素子が倍増しますが、Cが省略できます。
③フルブリッジ駆動 その2(3値制御)
アイドルにはほとんどエネルギーを消費しない所が最大の優位点です。ただ、面倒くさいゲート信号を生成しなければならないので、悩ましいところです。マイクロコントローラでは柔軟な信号生成も可能だと思われますが、実現性の検証を行いました。結果は多くのマイクロコントローラでは「実現可能」です。
選択:③フルブリッジその2(3値制御)
やはり、アイドル時の電力消費の問題を軽視できないと考えました。
後で判明した事ですが①の回路は決して悪いものではなく、かなり魅力的です。
・アイドル時の電力消費の問題は解決法がある(アイドルを検出したらPWM信号を停止させれば良い)
・小信号での音質の劣化がない(③はざらつき音が気になる)
・部品数が少ない
最終選択:③フルブリッジその1(2値制御)
しばらく実用してみたところ、低音量時のざらつき感と、ボリュームの非直線性に我慢できなくなり、設計変更する事にしました。ハード変更が不要と言う事で、この選択となっていますが、ゼロ設計では①の選択もありです。
音量調整方法
アナログアンプでの、最終的なスピーカの音量調整は概ね以下のようになっている事が多いようです。
・アンプ自体の増幅率は最大(固定ゲイン)
・入力に可変抵抗器を付けて信号を絞り込む
大出力アンプが、ボリューム位置に関わらずアイドル時のホワイトノイズが大きいのはその為です。
アンプが常に最大で動いているのは、いかにもエネルギー効率が悪そうに思えます。今回の様な、PWM駆動の場合、どのように音量調整したら良いでしょうか。
①PWMのDuty値を絞り込む(ボリューム率を掛ける)
②駆動素子に与える電圧を制限する
どちらもエネルギー効率的には変わらないと思われます。①の場合、小音量になるにつれて解像度が下がって行きますので、音質的には不利だと思われます。②は可変電源装置という追加コストが必要となります。
方針的には、より単純な①にしたいと思いましたが、どの程度の音質への影響がでるのか、皆目予測できなかったので、その判断ができるよう②の回路を入れ込んでおく物としました。
可変電源部として0〜4V1A(V=√(PxR)=√(1.5Wx8Ω)=3.46V、I=V/R=4V/4Ω=1A、最悪値)を探すと
・シリーズレギュレータ 100円以下もしくは0円
・DC-DCコンバータ muRata OKL-T/3-W12N 450円
電力効率を気にしていますので、当然DC-DCコンバータの選択となります。
操作パネル
必要なものを整理して、具体的なものに固めていきます。
項目 | 要件 |
---|---|
電源 | 常時電源オン的な使い方を想定しているので、電源スイッチはなくとも良い。優先度低。 表示としてはLED1灯など、電源が入っている事を確認できれば良いので、いくらも代替方法はある。 |
出力 | 出力ボリューム:優先度大。使う頻度は高いので、操作しやすい物。スライド式のアンプを使っていた時期があったが、回転式の方が断然使い良い。 出力ON/OFF:特に必要性は考えられない。 出力レベルメータ:優先度低。ボリュームつまみの位置で大体分かるので、あれば良いかなという程度。 |
入力×3 | 入力ボリューム:優先度中。調整時にのみ使う。ミキサーのイメージがあるので、スライド式を思い浮かべてしまう。 入力バランス:優先度低。調整時にのみ使う。バランスがズレているオーディオ機器は、最近では見かけないので、なくしても良いかもしれない 出力ON/OFF:優先度低。入力ボリュームがあれば不要だと思われるが、あれば便利かもしれない。 出入力レベルメータ:優先度中。調整時にのみ使う。自分の耳に自信がないので、あった方が調整が楽。 |
一番面倒なのは、レベルメータなので、先にこちらを決めます。レベルメータとして使えそうなのが以下のもの。(L+R、1組の場合)
部品 | 説明 | コスト |
---|---|---|
アナログVUメータ | 針がゆれる例のやつです。好ましいと思われる方も多いでしょう。場所を食うので複数並べるのは、この小物では難しい。切り替え式にするしかない。 | 450円×2=900円 |
LEDアレイ | バーグラフ形式。10ポイント3色。ダイナミック表示させるために、別に駆動回路が必要。 | 120円×2×4組=960円 |
キャラクタLCD | バーグラフ表示が可能なので、メータ表示としては十分使える。16桁×2行を1つ切り替え式にするか、小型のものを複数つける。 | 500円×4組= 2000円 |
グラフィックLCD | 自由なレイアウトで表示できる。タッチパネル付きのものなら、スイッチ類を省略できる。 | 3000円ぐらい |
コスト的には「LEDアレイ」がよさそうです。ただ、配線が超面倒なので気が重いです。
操作スイッチ類。
フル装備の場合、
- 出力ボリューム
- 入力1ボリューム
- 入力1バランス
- 入力2ボリューム
- 入力2バランス
- Bluetoothボリューム
- Bluetoothバランス
が必要となります。実体としては全て可変抵抗器もしくはロータリーエンコーダです。コストを試算してみます。
- ボリューム:可変抵抗40円×7+小型つまみ20円×6+メタルつまみ880円)=1280円、7アナログポートが必要。スライド式にした場合+300円。
- ロータリーエンコーダ:ノンクリックタイプ90円×7+小型つまみ20円×6+メタルつまみ880円=1630円、14デジタルポートが必要。
切り替え式にしたら、スイッチ×数個+ボリューム/ロータリーエンコーダ×1まで削減可能。プラケットLED80円×7+押しボタンスイッチ120円+ ロータリーエンコーダ90円+メタルつまみ880円=1650円、デジタル10ポートが必要。色々な組み合わせにしても、おおむね2000円ぐらいのコストです。値段を調べて気付いたのですが、パネル部品は高いです。見栄え良いツマミは1000円を越える。コスパ何て考える世界ではない。
表示で1000円+操作スイッチ類に2000円かかるのであれば、タッチ付きグラフィックディスプレイのコストと同じになっています。ケースの穴開け加工などの手間も減り、良い事づくしです。標準的な部品がないので入手には苦労しますが、昔のスマートフォンに使われていた品種が多少流通しているようです。3インチ級のLCDモジュールでも2−3000円位で入手可能。
なお、外部の機器(デバイス)を利用する手もあります。PCとかスマートフォンの活用可能です。しかしながら、この小物の前提条件としてPC/スマートフォンが必須になるいうのには納得出来ません。
選択:タッチ付きグラフィックディスプレイを使う。3000円位のコストだが、他の手段でも同じ位かかる。最近は、ケース加工の手間が重荷に感じられて来たので、ソフトウエア開発だけで済むのであればOK。出力ボリュームだけは、回転式つまみとする。最重要事項なので仕方なし。
電源部
必要な電力量によって、用意しなければならない電源規模が決まります。
・スピーカ (1.5W+1.5W)×効率0.8 = 3.8W
・コントローラ 5V×100mA = 0.5W
・LCDモジュール 5V×(LED5×20mA+基本10mA) = 0.55W
合計 4.9W
この程度であれば、5V-1AぐらいのAC-DCアダプタで済むレベルです。(5V1A480円、5V2A600円/秋月)特に、難しく考える事もないでしょう。
マイクロコントローラの選定
オーディオ信号を処理する専用チップは、入手性・コストの点から選択しにくいのが現状です。そうなると、高機能なマイクロコントローラで、比較的低コストで実現できるデバイスを探さなければなりません。要件をまとめると
- アナログポートは5(信号入力用)+2(タッチパネル用)=7
- デジタルポートは20(LCD用)+2(タッチパネル用)+2(ロータリーエンコーダ用)=24
- PWMポートは4(スピーカ駆動用、ポート間の同期機能が必要)
- USBホスト機能(Bluetooth用)
- 内蔵FLUSHは128kB以上
- CPUは100-200MHzクラス
Bluetoothでのオーディオエンコード処理を行うので、相応のCPUパワーが必要です。Bluetoothスタックのサポート状況により、下記の物に限定されます。「STM32F4-シリーズで200DMIPS以上の性能」工作がしやすい開発ボードの利用が現実的なので、入手可能な物を探してみました。
- STM32F469/479 STM32F469I-Discovery(4インチLCD付き、7500円/DigiKey)
- STM32F429/439 STM32F429I-Discovery(2.4インチLCD付き、3600円/DigiKey)
- STM32 NUCLEO-F429ZI(3000円/DigiKey)
- STM32F427/437 MikroElektronika MIKROE-1793(6000円/DigiKey)
- STM32F446 STM32 NUCLEO-F446RE(1900円/秋月)
- STM32 NUCLEO-F446ZE(2500円/DigiKey)
- STM32F407/417 STM32F4-Discovery(2800円/秋月)
- STM32F405/415 Olimex STM32-H405(2300円/DigiKey)
- STM32F746 STM32F746G-Discovery(4インチLCD付き、7500円/秋月)
STM32F469I-Discovery、F746G-Discoveryは高価ですがタッチ付きLCDモジュールがついているので、たいへん心引かれます。特に、F7Discoveryボードはオーディオ入力/スピーカ出力機能を装備しており、ほぼハードウエアの工作が必要なくなります。
選択:STM32 NUCLEO-F446REを利用、今回は、手持ち部品のLCDモジュールを消費したかったので、ディスプレイ装備の開発ボードを除外し、一番安い物の選択となりました。
基本構成図
以上、考えた結果をポンチ絵にまとめます。この構成で、実体化したいと思います。
- マイクロコントローラはSTM32 NUCLEO-F446REを使用、デジタル信号処理(A/D変換、ミキシング、PWM駆動)、USB/Bluetooth制御、グラフィック表示、操作入力など全ての処理を行う
- USB-Bluetoothアダプタを使用
- アナログ入力には〜4倍ゲインのプリアンプを付加
- スピーカ駆動はPWMでフルブリッジ構成、DC-DCコンバータによる可変電圧でメイン出力ボリュームとする
- 表示はグラフィックLCDモジュール、操作入力はタッチパネル
- 電源はAC-DCアダプタを使用
詳細設計
入力や出力、信号処理の方法等の方針を決めましたので、具体的に作製出来る所まで設計を進め、実際に動作を確認して行きます。
入力部
Bluetooth受信
USB接続
USB-Bluetoothアダプタを利用ためには、USBホスト機能が必要です。STM32F4に内蔵しており、外付け部品なしに接続する事ができます。USB-BluetoothアダプタのUSB端子に半田付けしても良いのです。今回は、一応コネクタ経由としておきます。
ソフトウェア処理
USBスタックライブラリとBluetoothスタックライブラリに全てお任せになります。今回使用するBluetoothスタックライブラリは、以前PIC32,STM32向けに自作していたものをベースに、A2DP/Sinkを機能追加する事で対応します。というか既に対応済みです。よって、インタフェース仕様(API)に従って音声データを受け取るだけで済みます。インタフェース条件は、
- フォーマット:リニアPCM
- サンプリングレート=44.1kHz
- 量子化ビット数=16bit
- 2chステレオ
- データ引渡し方法:メモリバッファ、nフレーム
- サンプル数/1フレーム:1024サンプル
PCやスマートフォンなどのBluetooth機器との接続処理などには、全く関わる必要はありません。音声データが届くと、PCMデータの形式で1フレームのタイミングで続々やってきます。切断されれば、止まるだけです。
アナログ音声入力
A/D変換
STM32F4内蔵のADCモジュールを使っての、アナログからデジタルへの変換です。
電圧レベル変換
このADCは0〜Vdd(電源電圧)までの信号入力となっていますので、音声信号のようなマイナス電圧を含む交流は直接入力出来ません。常套手段は、プラス側にオフセットさせる方法です。絵のように、電源電圧の分圧抵抗で半分にして、そこを基準(AGNDと呼びます)にします。入力にコンデンサを入れDC分をカット、AGNDを中心に振幅されるようにします。
取り込みタイミング
A/D変換速度が5.7μS以下である必要がありますが、STM32のADCでは、全く問題ありません。詳しくは、図を参照してください。
自動変換機能
ステレオ2系統で44.1kHzのサンプリングをするということは、44100*2*2=176,400回/秒、5.7μS毎のA/D変換処理が必要です。プログラムが介入して、データを受け取るのは、かなり高速なCPUが必要です。STM32のADCは、プログラムの介入なしに自動的にキャプチャする機能を持っていますので、アプリの負担をなくせます。具体的には、
- 外部からのトリガがかかったら、予め設定していた複数のアナログポートを順次A/D変換
- 変換結果はDMAで直接メモリに転送
- 外部トリガは、タイマで1/44.1kHz毎に発生するようにしておく
- DMAでの転送サイズが所定サイズの半分/満杯になったら、ソフトウエア割り込みが発生するので、このタイミングでデータ処理すれば良い
設定項目 | 設定値 | 説明/根拠 |
---|---|---|
クロック設定 | 0.6〜36MHz(STM32F446の場合) | ADCCLK=PCLK2(APB2)/プリスケーラ(2,4,6,8)=90MHz/4=22.5MHz (44ns) |
解像度 | 12ビット | 最大 |
スキャンモード | 有効 | 1回のトリガで、自動的に全アナログポートをA/D変換する設定 |
継続モード | 無効 | |
DMA継続 | 有効 | |
サンプリング時間 | 3クロック= 133ns(要調整事項) | 正確に取り込める一番短い時間 |
トリガ | Timer3 | タイマ3にサンプリング周波数の44.1kHz毎にイベントが出るようにします |
ADC取り込み確認
ADC出力結果は以下の通り。ADCから出力されたデータを表計算ソフトに取込みグラフにしたものです。オレンジは左信号、赤は右信号で、青、緑は無接続のポートなので無視して下さい。
- 十分な待ち時間を設定する
- ボルテージフォロア回路などで、信号をアシストする
28クロック待ちでは、波形を見る限り問題ないようなので、タイミング上の問題が無いかを確認してみます。44.1kHz毎の 取込みなので、22.6us以内に全ポート分のAD変換を行う為の、1変換の最大可能待ち時間は
1変換(22.6us/5)-15ADCCLK = 5.65us-15*44ns = 4.98us
結果、約5usに対して1.2usですので、十分追いついています。位相差については、
全ポート変換時間/変換周期=(15ADCLK+28ADCLK)*5port/22.6us
= (15+28)44ns*5/22.6us = 9.5us/22.6us = 42%
42%では、ちょっと大きい感じがします。ただ、ポート/ポート間の位相差は8.4%なので、耳で聴く分には違いが分らない位ではないかとも思えます。とりあえず、このままにしておき後で調整する項目とする事にします。
プリアンプ回路
- ADCの前段となるオーディオ向けのアナログアンプ
- 帯域 20〜20kHz
- 4倍前後のゲイン(半固定式)
- 出力は0〜Vddの単一電源でのスイング
- 出来るだけ低コストで、高音質にはこだわらない
オーディオ帯域を4倍程度(可変)の増幅率で実現するアンプ回路を考えます。帯域は一般常識的に20Hz〜20kHzと設定します。(後に事情により100Hz〜と変更します)
回路方式選択
- トランジスタ単体回路:低コスト、入手性良好 未経験なので設計が未知数の部分を考慮する必要あり
- オペアンプ増幅回路:トランジスタに比べればコスト高だが、汎用品は意外と低コスト、入手性も悪くない。とっつきやすい、設計容易(変更も柔軟)、安定動作、部品数も少ない。
とりあえず、設計が楽なオペアンプを選択、回路例多数あり問題なし。
オペアンプ
ADCへは0〜Vdd(3.3V)の正電圧の形にしてあげなければなりません。入力されるオーディオ信号は交流なので、正負の電圧を、正電圧に変換する必要があります。一般的な手法としては一定量正側にオフセット(シフト、バイアスとも呼ばれる)して、ADCで取り込んだ数値データを逆オフセット(引き算)すれば正負のデータで再現します。今回は、オペアンプの反転増幅回路にバイアス点を与えられる事を利用し、増幅とオフセット加える機能を1つで実現するのが最適解だと考えました。バイアス電圧は固定でVddの中間が良いでしょう。この基準電圧源としては分圧抵抗だと低コストで済みます。汎用オペアンプのデータシートで確認すると、バイアス電流は1μAも使わないようなので分圧抵抗でも問題なさそうです。
品種選定
- 電源は単一3.3V:単電源でも5V以上の場合が多い
- 入力、出力共にフルスイング(レールツーレール):普通は電源ライン近くは処理しきれない。ところが電源ラインぎりぎりまでスイングできる品種もある。
上記条件で、入手しやすく安価なものを探します。(1パッケージ4回路品)
- LMV324 ¥30/10個売り・秋月
- NJU7044 ¥150/秋月
- NJU2734 ¥150/秋月
- AD8506 ¥150×2/高性能・秋月
どれでも、問題はないでしょう。手持ち部品の関係でNJU7044にしときます(仮)
定数値
記号 | 値 | 根拠 |
---|---|---|
R1 | 50kΩ | 入力インピーダンスに関係します。この値にしている機器が多いので、それに習います。 |
R2 | 500kΩ/VR | 最大10倍ゲインGなので、R2=R1×10。 |
R3,R4 | 1kΩ | オペアンプに吸い込まれる電流はnA級とわずかなので、バイアス電圧を安定して供給するにはμA級の電流を流しておけば良いでしょう。とは言え多めの1mA位にしておけば安心です。電源に厳しい制約がある訳ではないので。バイアス電流は I=V/R=3.3/1000=1.6mA |
実際は、手持ち部品に10kΩの半固定抵抗がたくさんあったので、<R2=10kΩ/VR、R1=1kΩ>としました。多分、大丈夫でしょう。
バンドパスフィルター
必要な理由
これは、設計中に考慮できず、実際に使い込んだ後に判明した事に対する対策です。音源(音響機器)によっては、音声帯域外の信号が入ってくる場合があり、色々と不都合な事象が発生します。
・音声帯域下限 = 20Hz
ハムノイズ(AC電源由来のノイズ)が大きく入る音源がある
電源由来なので50/60Hzをカットする。
高音質を狙っていないので、100Hz位以下でカットで良い
・音声帯域上限 = 20kHz
ホワイトノイズという形で、可聴域に出現する場合があるらしい
ホワイトノイズがやたらと大きい音源がある
その音源は他のアンプではノイズが出ないので、自アンプの問題
PCの出力、テレビのヘッドフォン出力で現象が出る
iPhoneなどの携帯機器は問題なし
インピーダンス不整合?
ホワイトノイズの原因とは考えづらい
高調波(音声帯域を超える周波数成分)の影響?
44.1kHzでサンプリングしているので、ハイカットされて影響ない?
切り分け:外付けでローパスフィルタを付けてみたら激減
ローパスフィルタはあった方が良い
結論として、バンドパスフィルタ機能を実装する必要がると思われる。
実装方法
- ハードウェア対応(CRフィルタ):前段もしくは後段に、 CRフィルタ回路を追加、4本のC,Rのコスト増で済む。
- ハードウェア対応(アクティブフィルタ):オペアンプの増幅回路にアドオンで対応可能。たった2本のC,Rのコスト増だけで済む。
- ソフトウェア対応:100Hz以下、20kHzi以上をカットするデジタルフィルター演算処理を追加。CPU負荷が大きい
コスト的にも、対応も容易なアクティブフィルタ化で問題なしと考えました。
アクティブフィルタ
定数の計算方法などは、図を参照してください。
回路シミュレータで検証
LTspiceを使って机上でプリアンプ回路全体の動作確認しておきます。
出力部
スピーカ駆動
PWM信号生成
マイクロコントローラ内蔵のタイマモジュールを使って、3値データをPWM出力する設定を調べます。3値データとは、符号付きの信号データを正負で別々のデューティ値列にしたもので、左正/左負/右正/右負の4つのPWM信号を出力する必要があります。
3値データはソフトウエアで生成します。サンプリング時間間隔で、4つのDutyデータを定期的に送り込む必要があります。1/44.1kHz=約23μSという、とても短い時間でデータを送るので、ソフトウエアが介在するのは非常に苦しい要件です。そこで、DMAモジュールを利用しハードウエアで自動的に転送させる方法を使います。タイミングはタイマモジュールで44.1kHzを出し、それでトリガをかければ良いでしょう。
メモリの走査は、1トリガで4データ、メモリバッファを全てを転送し終えたら、ソフトウエアに割込を発生させて、次のデータを用意します。2面のメモリバッファを設定して、ソフトウエアでデータを入れ替える処理の時間をかせぎます。
高機能タイマモジュール(Advanced-control timers TIM1,TIM8)のPWMモードでは、最大4つのPWM信号を出力する事ができます。PWM周波数は、全て共通となる条件がありますが、今回の用途では全く問題なく、逆に同期された信号で好都合です。
省電力化
最終的には、2値制御する事に設計変更となりましたが、変更はソフトウエアを修正するだけで対応可能です。それよりも、アイドル時の省電力化対策が必要になります。なお、アイドルの判定は、音声信号がある時間無くなった事を検出したらアイドルとし、信号があったら即時復帰です。次の対策を考え、試行してみました。
対策 | 具体内容 | 効果 |
---|---|---|
バックライトオフ | 基本対応 | -0.2W |
スピーカ電源オフ | DC-DCコンバータのON/OFF制御ピンで対応可能 | 未適応 |
PWMオフ | PWM出力を停止しスピーカに電流が流れないようにする | -0.4W(50%出力) |
ペリフェラル停止 | USBは停止できない、ADCを停止するとWakeup用の仕組みが必要になるので難しい | |
CPUスリープ | イベントループ内にSLEEPを組み入れる(割込で復帰)-0.3Wの効果があったが、Bluetooth関係で不具合が出た | 未適応 |
CPUステップダウン | アイドル時にCPUコアを1/8に減速するロジックを組込み | -0.3W |
合計 | -0.9W |
最終的なアイドル時の消費電力は、0.6Wとなりましたので問題無しと考えます。
ボリューム位置 | アクティブ時 | アイドルBLオフ | アイドルMOEオフ | アイドルクロック1/8 |
---|---|---|---|---|
最小 | 1.1W | 0.9W | 0.9W | 0.6W |
中間 | 1.4W | 1.2W | 0.9W | 0.6W |
最大 | 3.0W | 2.5W | 0.9W | 0.6W |
BLオフ:バックライト消灯
MOEオフ:PWMの出力を抑止(__HAL_TIM_MOE_DISABLE)
クロック1/8:AHBプリスケーラを操作(RCC_CFGRレジスタのHPREを変更)
上記の消費電力は6VACアダプタを使用した時に、100Vライン上での電力を計測した値です。
フルブリッジ回路
具体的なHブリッジ回路を組みます。
フルブリッジコントローラ
一番楽な「フルブリッジコントローラ」を、試してみます。こんな事もあろうかと、事前に買い込んでいたROHMのBD6211を使ってみます。ブラシ付きモータ用Hブリッジドライバですが、回路的には使えるはずです。モーターもスピーカもコイルの一種です。
- BD6211F:100円/秋月
- 最大定格7V1A
- 電源=3~5.5V
- Pd=0.7W、Ron=1Ω
- PWM信号入力20k~100kHz
- 保護機能付き(過電流/過電圧/過熱/不足電圧)
外付け部品が不要で、配線数も最少ですが、小さいSOP8パッケージなので、ユニバーサル基板の小片に回路を組んでの確認作業です。
- 2値制御:良好
- 3値制御:小音量時の音質が悪い、我慢できないレベル
本当に音が出ました。用意した音声データの440Hz正弦波が、思っていたより良い音に聞こえ、音量も十分。2値制御は劣っているような思い込みがありましたが、それが打ち消されました。3値制御にこだわりがなければ、これで十分です。
フルゲート駆動
「フルゲート駆動」は、残念ながらSTM32F4では仕様的に実現できません。なぜか、4番目の反転出力機能だけが無い為です。
PNコンビネーション
Hブリッジコントローラで決まりだと思いますが、「PNコンビネーション」も試してみます。
素子の選定ですが、入手しやすそうな部品から幾つか検討しました。要件は、
- マイクロコントローラで直接ゲートドライブ(3.3V10mA)できる(Ids/Vgsが1A/3V、Cissが100pF)
- IDSが1A以上
- 100KHzぐらいのPWM駆動
- RDSは100mΩ以下(大きいと発熱が許容できなくなりますので)
傾向として、IDSが大きい品種はゲート駆動が重い(QgやCissが大きい)ので1A前後のもので探すと条件に合う物が見つかるように思います。 そもそも3.3Vでゲートを開閉でき、かつIDSが1A級の品種は少ないようです。もし、見つからなければ、別途ゲートドライバを用意しなければなりません。設計していた時点では、IRML2402, 2SK1772, FDS4675, 2SJ518, Si6544でした。データシート上不安が残りますが、FDS6612, FDS4559も可能かもしれません。
今回は、手持ち部品の関係で「2SJ518+2SK1772」の組み合わせで確認します。偶然にも、どちらもSOT223パッケーのルネサステクノロジ社製です。データシート上の仕様も似ています。普通はLTspiceで回路シミュレーションして確認をした方が良いのでしょうが、どんな音が出るのか気になってしまいパスしました。テスト用の駆動電源は、最悪ショート状態になるので乾電池2本を電源にしました。
- 2値制御:良好
- 3値制御:ちょっと難あり(小音量時ががさつく、半分以上ボリュームを開けないと音質が気になる、入力レベルを下げれば音質は改善されるが、ホワイトノイズが目立つ)
Hブリッジコントローラと同じような結果になりましたが、3値制御はだいぶ良くなっています。3値制御=電力効率に固執したいので、今回はこちらを選択します。
表示・操作部
タッチ機能付きLCDモジュール
グラフィックLCDモジュール自体は、手持ち部品の関係で既に確定しております。
- SUCCESS ELECTRONIC社 S95160-32
- 3.2ンチ240×320ドットTFT
- タッチパネル付
- 3V単一電源
GUIソフトウェアライブラリ
STM社から無料で使用できるソフトウェアライブラリが提供されています。しかし、今回は自分で作成したソフトウェアライブラリを使うこととします。なぜなら、仕様を読み込むのが面倒なためです。
具体的な画面の表示/入力操作パネルを設計しなければなりません。
画面レイアウト設計
画面切り替え式にすると操作が若干面倒になりますので、1画面に全て収める事に固執します。
調整前の信号 | 入力レベル絶対値を確認(過大過少判定、プリアンプのトリマ調整に使用)ボリュームで正比例するものなので、不要かもしれません |
調整後の信号 | 必須項目、たくさん表示させたいので、棒グラフ表現で問題ないかと |
ピークのレベル | 大音量時に歪んだかどうか判断できる、レベルメータに重畳表示すると見やすい |
平均のレベル | ソースの通しでの音圧レベルが分る |
調整ボリューム | 入力ソース毎に用意、スライドボリュームのようなのが良いかと |
バランス | 入力ソース毎に用意、使用頻度は高くないので何でも良い |
オン/オフ | ボリュームを0まで下げても同じだが、ボリューム操作が面倒なので、あった方が便利 |
最終的に設計した画面レイアウトです。基本のGUI部品だけで実現しています。スライドバー部品を作ってもう少し使いやすくしたい所です。
音量調整
メインボリュームは、通常の可変抵抗器です。一番、操作頻度の高い部分ですので、耐久性があり、ちょっと大きめに、コストもかけても良いと考えます。
電源部
全体
DISCOと書かれている部分は開発ボードで、安定化した5Vもしくは非安定化の7V〜12Vの電源を要します。(STM32 NUCLEO-64は、基板上に電源レギュレータを装備しており、非安定の電源での入力も許容します)。
B部で必要となる電圧、電流は(DCでの簡易的な計算)
V=√(RP)
=√(4Ωx1.5W)=2.45V
=√(8Ωx1.5W)=3.46V
正弦波条件とすれば√2を掛けて最大値を求めると4.9Vが必
I=√(P/R)
=√(1.5W/4Ω)=0.61A
=√(1.5W/8Ω)=0.43A
2つスピーカがあるので、最大1.22A以上必要
電圧としては、余裕を持たせると6V1.3A以上の電源が望ましい所です。A部・B部の兼ね合いで、AC-DCアダプタを決定する事になります。
- 7VのAC-DCアダプタがあれば理想的ですが、一般的には流通していません
- 5V系は流通量も多いので安く入手できる
- 6V系も流通量も多いので安く入手できるが、NUCLEOの仕様では一応不可(レギュレータの仕様を確認すると、TypではOK、Maxでは0.1V不足/100mA消費の場合)
- 9V系も流通量も多いので安く入手できるが、レギュレータの発熱が大きい(やってみたら80℃越えした)
5V電源で実際運用してみたところ、高音量では不十分だと感じられる場面がありました。我慢できるレベルではありましたが、バックライト用の電源の取り方を変更し、6V〜9Vのアダプタを使えるように変更しました。安定化していないアダプタも使えるようになります。
スピーカドライバ用電源
制御部
当初、使い慣れたSTM32F4-Discoveryボードで開発していましたが、基板サイズが大きいし、USBがマイクロBタイプのコネクタなので、Bluetoothアダプタを接続するには変換ケーブルを使う必要が有るため、どうしても外形がデカくなる事が不満でした。
STM32F4のチップパッケージを直接基板マウントする根性もないので、今回は同じ開発ボードでも、基板サイズが小さくて安い、STM32 Nucleo F446REを使用する事にします。これはSTM32F446の64ピンパッケージが乗った物で、プログラマ機能と電源部分など最低限の部品がすでに乗っており、また全てのピンが外部コネクタにも出ているため、こういう時に大変助かるボードです。
ピン割り当て
上半分が、NUCLEOの標準状態で、下半分が今回の割当状況。LCMとはLCDモジュールの事です。パフォーマンスを上げたかったので、PCを全部開放する事にしました。
ボード変更
いくつかのピンは基板上の部品で使われていますが、ハンダブリッジを取り除いたり、盛ったりする事で、回路を変更する事ができるように配慮されています。(詳しくはNUCLEOのユーザマニュアルUM1724の6章を参照)今回の変更点は以下のとおり。
- HSE(ハイスピードオシレータ)に8MHzクリスタルを追加し有効にする。USBホスト機能を使う為に必要 (どうやら内部オシレータでも動くもようだが非推奨)
- LSE(32kオシレータ)を無効にする、C14,15を使いたいから (32kクリスタルが標準で乗っているのが不思議)
- 青プッシュボタンを無効にする:PC13を使いたいから(絶対ボタンを押さないのなら改造しなくても良いが)
- 電源を外部から供給するようにする:プログラム用のUSBから取るのではなく、コネクタピンから与えられるようにする
基板
一品物なのでユニバーサル基板を利用します。表側に、NUCLEOボードを乗せ、裏側にはLCDモジュールを取付け、3階層とする事で、スペース効率を上げます。
外装
結局1DINサイズの横置きで、ディスプレイは上面のスタイルとなりました。いつものように、アクリル板を曲げて現物合わせで作ります。外周だけで強度を出さないといけないので、5mmという厚目の素材を使う事にします。透明の材料しかなかったので、最後に塗装する事になりました。
Copyright©2017 Toyohiko TOGASHI
コメントを残す