作成日時:2016年07月07日 19時35分30秒
更新日時:2020年11月28日 16時59分21秒
この記事は8年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。
今回はBTL構成で8Ω19V時1chあたり20Wの出力が得られるデジタルアンプを作ってみたいと思います。小さめのアンプで、予算としては外装パーツを工夫して予算1万円としたいと思います。
ICはTPA3122D2Nを使います。
制御方法の検討
前回同じICを使ったアンプを作った時はロータリーエンコーダや液晶を組み込んだわりと本格的なものを作ったのですが。何か設定をしたりレベルメーターを付けるわけでもない単純に音量と入力切替をを表示しているだけという単純なものだったため。液晶まで必要ではなかったです。
しかし、ロータリーエンコーダを使用している関係上音量をどこかに表示しないといけないため、液晶は切り離せませんでした。
そこで趣向を変え、今回は音量の決定を可変抵抗器を使用して行うことにします。
ただし、配線によるロスの問題や、ギャングエラーなどを考慮して電子ボリュームでの音量制御は残しておきたいため。今回はボリュームで電圧を変化させ、その電圧をAVRマイコンのADCで読み取るという方法を行いたいと思います。これならボリュームの構造による視覚的な音量表示もでき、なおかつギャングエラーも起きないという利点があります。多分。
マイコンの選定
今回はADCとSPIの出力があればよかったため、当初ATTiny85を候補に開発していましたが、
どうもうまくいかないのと、ポップノイズ対策が必要になった際の拡張性や、回転方向を決定するためのIOも必要になったため、手持ちのATmega328Pを使うことにしました。
正直ほとんど余るのでもう少し小型のAVRマイコンでもいいと思いますし、ATTinyでも出来るはずなのですが今回どうやってもうまく行かなかったため動作実績のある328Pを使うことにしました。
ポップノイズに関して
基本的にBTL構成のアンプはポップノイズへの配慮は不要とされていますので考慮の必要はないでしょう。ただし、一部電源OFF時のポップノイズが発生すると発言されている方が居ましたので気になる場合や実際に発生する場合、リレー音がある方が高級っぽくていいという人はポップノイズ対策回路を入れてください。その場合はプログラム変更若しくは回路変更で対応する必要があると思います。
回路設計
今回アンプ部分はアンプICのデータシートと電子ボリュームICのデータシート丸写しです。
カップリングコンデンサについてはアンプ・電子VRどちらにも記載がありますが。同じ容量を2つ直列にする必要もないので、アンプICの回路図を参考に+と-極に直列に挿入します。
シャットダウン・ミュート機能
今回はシャットダウン機能もミュート機能も使わないので双方とも抵抗を介してVCC・GNDに接続します。
この抵抗は10kΩ程度が理想のようですが。今回は出力段に4.7kΩを使う以外に指定された容量の抵抗が無いためここの抵抗を含め抵抗器は全て4.7kΩの金属皮膜抵抗で統一しました。(秋月で100本300円だし。)
1/4W品で十分かと思われますが、心配なら出力段用は大きめのW数の抵抗にしてください。
ほかはもっと小さな抵抗器でも十分でしょう。
コンデンサ類
カップリングコンデンサは一般的にフィルムコンデンサやタンタルコンデンサが好まれますが。
今回は入手できなかったのと、コストを考えて無極性電解コンデンサを使用しました。緑のやつです。
このアンプICは基本的にセラミックコンデンサの利用を推奨していますのでそれに従い、音質に関わりそうな出力側の0.68μFのコンデンサのみフィルムコンデンサを採用しました。
電解コンデンサの指定がある部分はオーディオ用電解コンデンサを(見た目重視で)採用しました。
制御部・電子VRの電源部
電源部はいつもの7805と今回はマイナス電源の生成にマイクロチップ社のDC-DCコンバータICを使いました。前回は配線が簡単そうだったので絶縁型DC-DCコンバータユニットを使いましたが値段が少し高いことと、こいつが意外と電気を食うようですので電源構成を変更しました。
今回電源回路周りはマルツのNJW1159Dの使用レポートを参考に作り上げました。
こちらの記事には詳しいこのICの使い方も書いてあるので一読されることをおすすめします。
なおこの記事では入力と出力に抵抗が入っていますが。データシートで入っていないので今回はつけませんでした。この抵抗に関してはマルツの記事に言及されているので必要と思ったのでしたら入れてください。100kの抵抗ならどこの家庭にもあると思いますので。
VCC(大元の電源)とGNDについて
GNDやVCCの配線ですが、GNDループだけ気をつけていれば実用レベルで不都合があるようなノイズが乗ることはないようです。基本的には470μFの電解コンデンサとそれに隣接する0.1μFの電解コンデンサがアンプ側ノイズフィルタ(パスコン)になるし、ロジック部の電源をアンプより後に取るようにすれば問題ないはず。(根拠はない。
消費電力に関して
今回は最大負荷時で1000mAあるかどうかの消費電力ですのでレギュレーターICに余裕があり。基本的にヒートシンクは不要かと思われます。心配ならつけてください。
配線に関して
なるべくジャンパの少ないよう、なるべく信号と電源が平行に隣接しないように配線してください。
特に気をつけるべきは電子ボリューム側の配線です。前述したマルツの記事にも、データシートにも記載がありますがSPIの信号線と音声信号の入力・出力ラインに注意して配線してください。
CLOCK, DATA, LATCH の信号ラインは、アナログ回路と干渉し、クロストーク特性に影響する恐れがあります。基板パターンレイアウトは、CLOCK, DATA, LATCH の信号ラインを他の端子(特にインピーダンスの高い 1pin, 5pin, 9pin, 10pin)から離して配線願います。また CLOCK, DATA, LATCH の信号配線間をガードリングすることを推奨します。 (NJW1159Dデータシートより)
今回基板レイアウトの関係上、制御信号と電子ボリューム→アンプ間はリード線で配線しています。
基板を2枚にしたり、もう少し考えて配置すればこの辺の空中配線はしなくて良くなると思われますがあまり影響はないでしょう。
ただし、できればこの辺りはシールド線を使うべきでしょうね。
以上。回路設計としてはこんな感じになりました。
以下部品リストを載せておきます。
部品リスト
合計 | 4724 |
|||||
部品 | 型番 | 購入店 | 単価 | 個数 | 税 | 計 |
電解コンデンサー100μF25V85℃(ルビコンPK) | 25PK100MEFC5X11 | 秋月電子 | 10 | 4 | 込 | 40 |
AVRマイコン | ATmega328PU | 秋月電子 | 250 | 1 | 抜 | 270 |
インダクタ(470μH 0.9A) | LHL13NB471K | 秋月電子 | 60 | 1 | 込 | 60 |
金属皮膜抵抗 1/4W4.7kΩ | MF1/4CC4701F | 秋月電子 | 3 | 9 | 込 | 27 |
積層セラミックコンデンサ 1μF50V5mm | RDER71H105K2K1H03B | 秋月電子 | 20 | 4 | 込 | 80 |
積層セラミックコンデンサ 0.22μF50V5mm | RDER71H224K1K1H03B | 秋月電子 | 20 | 4 | 込 | 80 |
積層セラミックコンデンサー0.1μF50V2.54mm(10個入) | RPEF11H104Z2P1A01B | 秋月電子 | 100 | 1 | 込 | 100 |
オーディオ用無極性電解コンデンサー1μF50V85℃ | UES1H010MDM | 秋月電子 | 15 | 6 | 込 | 90 |
オーディオ用電解コンデンサ 25V 470μF | UFG1E471MHM | 秋月電子 | 60 | 4 | 込 | 240 |
オーディオ用電解コンデンサー10μF35V85℃ | UMW1V100MDD | 秋月電子 | 10 | 6 | 込 | 60 |
整流用ダイオード | 1N4001 | マルツ | 5 | 1 | 抜 | 5 |
丸ピンICソケット 28ピン | 212128NE | マルツ | 90 | 1 | 抜 | 97 |
メタライズドポリエステルフィルムコンデンサ 250V 0.68μF | MMH250K684 | マルツ | 240 | 4 | 抜 | 1037 |
3端子レギュレータ +5V 1.5A | NJM7805A | マルツ | 50 | 1 | 抜 | 54 |
オーディオアッテネータ | NJW1159D | マルツ | 210 | 1 | 抜 | 227 |
デジタルアンプ用インダクタ(リード型) 22μH | RTP8010-220M-R | マルツ | 150 | 4 | 抜 | 648 |
DC-DCコンバータ | TC7660HCPA | マルツ | 150 | 1 | 抜 | 162 |
15WステレオClass-D オーディオパワーアンプ | TPA3122D2N | マルツ | 470 | 2 | 抜 | 1015 |
片面紙フェノール プリント基板 | ICB-505 | マルツ | 400 | 1 | 抜 | 432 |
とりあえず目についたものの中からコストに見合うものを選択したのと、通販メインで収集したので若干割高になっていると思いますが。部品のグレードを落としたり安い店を見つける、ジャンクから拾ってくるなどすればもう少し安く抑えられると思います。
ただし、アンプICが低ESR品を要求しているのでそれだけは遵守してください。
ちなみにこのリストにある金属皮膜抵抗と整流用ダイオードは100本入りと25本入りを購入してそれぞれ個数で割って1本あたりの値段を書いていますので、バラで買うともうちょっと高いと思われます。
回路図
ほぼ推奨回路の丸写しですが。一部見やすいように、実装に近いかたちに改変しております。
この回路図通りの配線で基本的には問題ないと思いますが「音質的にこうしたほうが…。」というところはいい感じに配線を変更してください。
部品一覧
使用するディスクリートパーツはこんな感じ。
ちょっと撮り忘れて変更が入っていますが気にしないでください。
IC部品。
手前右側のAVRマイコンは当初使用しようとしていたATTiny85です。
マイコンは実際にはこちらのATmega328Pを使いました。
部品詳細
アンプ部
アンプだけなら使用する部品はこんな感じ。
出力段のフィルムコンデンサと電源のコンデンサが少し大きいので取り回しに苦労すると思いますが。ほかはそんなに変わらないと思います。
アンプICです。
D級アンプのICはSOPやBGAといった小型品が多い中、このICは20ピンDIPという電子工作で扱いやすいパッケージです。
部品点数も少なく、安く音質もわりとよいので重宝します。
これで満足できないならTripathのアンプをなんとか入手する形になると思います。
電源部
レギュレーターICは前回の回路を踏襲しましたが、ダイオードだけ大きめのものを採用しました。
今回は負電源生成に専用のチャージポンプICを利用することにしました。
チャージポンプというのは。電源電圧で充電したコンデンサの接続を機械的・電子的に切り替え入力電圧より高い電圧を得たり、逆の極性の電源を得たりできる回路のことです。前回のDC-DCコンバーターは内部インバーターで交流を作ってそれをトランスで変圧するという方式をとっていたようですね。
チャージポンプICの上にでっかい黒い物体がありますが。これは470μHのインダクタです。
通常は不要なようですが。今回参考にしたマルツの回路ではノイズフィルタとして利用するようになっていたので参考にしました。
ちなみにこいつは太陽誘電製です。太陽誘電といえばCD-Rで有名な企業ですが本業はこっちです。
電源部の動作テストの様子。
マイコン部
今回は8MHz駆動で使いますので基本的にマイコン部に必要な部品はありません。
ノイズフィルタ用の0.1μFのコンデンサとデジタルIOに使う抵抗くらいしか無いです。
マイコンというのはよくノイズ源になるのでなるべくアナログ回路や電源から離してください。
製作
今回は家に余っていたICB-505を使用しました。
ガラスコンポジットの基板を使うならICB-97あたりかそれ以上のサイズの基板になると思います。
部品位置決めの様子
前回の失敗を反省し、今回はヒートシンクを先に取り付けました。
このヒートシンクは前回作ったアンプから流用しました。ただし、今回そこまで熱を持たなかったの基本的に必要ないと思われます。なので部品リストには入っていません。
部品の位置が決まりましたので写真を取りバラした後低い部品から取り付けました。
こんな感じでハンダ付けをする。
完成基板の動作確認中。
完成した基板。よく見るとフィルムコンデンサの位置が穴1つずれてますね…。
真ん中に見える青い線と奥のコンデンサ間にある緑色の線はアンプ用+電源の配線です。青線は別に一本でいいのですが見た目的に左右対称にしたかったので。
無指向性部品の向きは揃える必要はないと思いますが、揃えたほうが見た目がいいですね。
裏面。よく見たら電子ボリュームのコンデンサに配線がされていないのでこの後修正しています。
AtmelとMicrochipの夢の共演。
制御部はこんな感じ。画像右下の部分に電源線を付ける予定です。
電子ボリューム部。SPIの制御ラインと音声出力はリード線を使用しています。
今回は問題なかったですができればシールド線を使用したいところです。
アンプ部。基本的には前回と同じですが。今回はミュート・シャットダウン回路を最初から使用しない設定だったのでこうしました。
というわけで基板が完成しました。
次は組み込み…と言いたいところですが2000円で買って使っていたドリルがいよいよ壊れたので買ってからにします。
7月中には完成させる予定ですが。
ソースコード
電子ボリューム操作部のソースコードを載せておきます。
特に大したことはしていませんが。
/*
* sakura87_amp2.c
*
* Created: 2016/06/22 10:38:37
* Author : Sakura87
*/
#include <avr/io.h>
#include <util/delay.h>
#define _BV(bit) (1 << (bit))
#include <inttypes.h>
#include <avr/interrupt.h>
#define MISO 4 // Fix
#define MOSI 5 // Fix
#define SCLK 3 // Fix
#define LACH 2 // Var **LAtCH
/*
PB PORT I/O List
PB0 No Function
PB1 CW/CCW Setting H=CCW L=CW
PB2 VR_SPI Latch
PB3 VR_SPI SCK
PB4 VR_SPI MISO (NC)
PB5 VR_SPI MOSI
PB6 / PB7 NC
PC PORT I/O List
PC0 VRINPUT
PC1 - PC5 :NC
PC6 RESET(VCC Fixed)
PD PORT : ALL NO USE
*/
int spi_tr( unsigned int data){
PBWrite(LACH,0);
SPDR = data>>8;
while(!(SPSR&(1 << SPIF)));
SPDR = data&0x00ff;
while(!(SPSR&(1 << SPIF)));
PBWrite(LACH,1);
_delay_us(100);
}
// SPI初期化関数
// 設定ビットの役割は関数内のコメントを参照。
void spi_init(void){
// MSCL Mosi miSo Clock sLave_select
//PB 76543210 SPI以外のIOもココで設定する。
DDRB =0b00101101;
PBWrite(LACH,1);
// SPI Init
// http://garretlab.web.fc2.com/arduino/inside/libraries/SPI/registers.html
//////// SPCR Setting Param.
// [ 7][ 6][ 5][ 4][ 3][ 2][ 1][ 0]
// [SPIE][ SPE][DORD][MSTR][CPOL][CPHA][SPR1][SPR2]
// DORD: 0 MSB First(7 -> 0) MSTR: 0 Slave Mode(AVR <- SPIdevice)
// 1 LSB First(0 -> 7) 1 Master Mode(AVR -> SPIdevice)
// CPOL: 0 SCLK Normal Low CPHA: 0 : クロック立ち上がりで読み込み
// 1 SCLK Normal HIGH 1 : クロック立ち下がりで読み込み
//// SPR1/2 ///// Clock speed //// SPI Mode //////
//[bit] [rate ][ @8MHz][ @16MHz] [CPOL][CPHA][Mode]
// 0 0 : 1/4 2.0MHz 4.0MHz 0 0 0
// 0 1 : 1/16 500.0kHz 1.0MHz 0 1 1
// 1 0 : 1/64 125.0kHz 250.0kHz 1 0 2
// 1 1 : 1/128 62.5kHz 125.0kHz 1 1 3
//////// SPSR Setting Param.
// [ 7][ 6][ 5][ 4][ 3][ 2][ 1][ 0]
// [SPIF][WCOL][ -- ][ -- ][ -- ][ -- ][ -- ][SPI2x]
//
// SPIF : データ転送完了フラグ(読み取り専用)
// WCOL : 転送中に書き込みが行われると1になる(読み取り専用)
// SPI2X: SPI Speed 2x
// SPI2X = 1 Clock Speed
//[SPRx] [rate ][ @8MHz][ @16MHz]
//[1 2 ] [ ][ ][ ]
// 0 0 : 1/2 4.0MHz 8.0MHz
// 0 1 : 1/8 1.0MHz 2.0MHz
// 1 0 : 1/32 250.0kHz 500.0kHz
// 1 1 : 1/64 125.0kHz 250.0kHz
// 76543210
SPCR = 0b01011010;
// 76543210
SPSR = 0b00000010;
}
void PBWrite(char p,unsigned char d){PORTB = (d<<p)&(1<<p) ? PORTB | (1<<p) : PORTB & ~(1<<p);}
int ARead(unsigned char pin){
ADCSRA=0x80; // ADC Init
static int h,l;
ADMUX=0x40|(pin&0x0f); // 電源電圧基準
ADCSRA|=0x40;// AD変換開始
while(ADCSRA&0x40); //終わるまで待つ
l=ADCL;
h=ADCH;
return (h<<8)|l;
}
int main(void)
{
unsigned int VolVal;
unsigned int x;
spi_init();
spi_tr(0xff00);
spi_tr(0xff10);
_delay_ms(1000);
/* Replace with your application code */
while (1)
{
VolVal=ARead(0);
x=((double)VolVal*0.0929);
if (~(PINB>>PB1)&1) x=95-x;
spi_tr((x<<9)|0x00);
spi_tr((x<<9)|0x10);
_delay_ms(50);
}
}
[…] BTL接続の20W級デジタルアンプを作る(TPA3122D2N使用) 前編 AVRでの製作記事ですが、使っているICが同じなのでほとんどそのまま移植できると思います。 […]