2011年5月30日月曜日

【AVR】 DDS Control Part 1

DDS コントロール】予告編
 AVRマイコンの活用を始めたのは2006年の4月ころだったので、もう5年も経過している。 マイコン活用の二大目標は無線機用のデジタル周波数表示とDDS(←リンク)を使ったVFOの開発にあった。

 周波数カウンタの方から始め、簡易なものはかなり早く実現できた。頒布もしたので既にたくさん使ってもらっている。 その後の高機能化も要素実験はだいたい済んでいて、あとは「やる気」の問題と言ったところだ。

 一方、DDS-VFOは「秋月DDS」の制御実験までは早かったのだが・・・その後はずっと停滞してしまった。 部品もだいたい揃えたと言うのにまったく勿体ない。 放っておくと陳腐化しそうなほど時間が経ってしまっていた。 「趣味に納期はナシ」とは言っても、これは反省しなくては。(笑)

 それで、先日からDDS-VFOの仕様を考え始めていた。 当初の目標はミズホのVFO-5とかVFO-7と言ったVFOの同等品だったと思う。 ミズホのVFOは生産終了になったし、自作しようにも良質の部品は入手困難になっているからだ。 しっかりしたバリコン、減速用のギヤ・ダイヤル・メカ、ステアタイトのコイル・ボビンなど、欲しいと思っても入手は運しだいだろう。 そのあたりを今の電子部品(=マイコンとか)で解消するのが目標だった。

 休日を何回かを使って、写真のようなVFOが出来上がりつつある。作ったATmega8基板はこの目的用であった。  概ね良さそうだが、まだ纏まっていないので取りあえず予告編と言うとことで今日は写真のみ。  de JA9TTT/1

つづく)←リンク

2011年5月21日土曜日

【AVR】 ATmega8x Fuse-bit Memo

鬼門のヒューズビット?
 先のBlogではAVRマイコン基板を作成したが、ATmega8を使うのは初めてであった。もちろん、同じ系統のATmega48、168、328なら使ったことはあったのだが、なぜかmega8は初めてである。(少々賞味期限切れの感じだが、いま使わないと機会がなくなりそうで・・)

 この28pin AVRシリーズは類似点も多いので、あらかた同じで動作するのだが初めて使うなら一応データシートを見てからと言うことになる。 BASCOM-AVRは固有のチップへの依存度は低いのだがヒューズビットは個々に見ておこう。以下ヒューズビットの要点と感じたことをメモして行く。

 ヒーズビットの操作そのものは難しくはない。 写真のように今ではGUIプログラムで一発だし、BASCOM-AVRの対応ライタならプログラミング画面からも容易に操作できる。あるいはコマンド・プロンプトから文字列のキーインでやるのも難しいと言うほどではない。要するに、書き換えそのものは難しくないのだ。

 ところが、巷ではAVRマイコンの「ヒューズビット」は鬼門のように言われている。どうやらその理由は2つあるらしい。

1・とっても危険な行為:
 「ヒューズビットを下手にいじるとAVRマイコンがパーになる。怖いな〜!」、「使えなくなると怖いので触らないのが吉。素人はそのまま使うに限る」

2・説明が難解で自信が持てない:
 「ヒューズビットって良くわからん。ワタシがやりたいことに合う設定を誰かおせえて」、「ATMELのデータシートが難解で、結局どうしたら一番良いの!」

 確かに、無闇に操作するとプログラムの書込みができない状態に設定してしまう可能性がある。ISP書込みなら、リセット端子をI/Oポートに設定したらそれまでだ。ISP書込みではリセット端子を操作するのだから、それができぬ設定にしては旨くない。また、ISP書込みにはクロックの供給は必須だ。内部クロックをやめ外付け水晶発振子や外部クロックにするならそれに合わせることだ。クロックがないとAVRマイコンは無反応になってしまう。

 ヒューズビットは沢山あって細かく見るのも大変だ。しかし、よく使うのはヒューズビットLowだろう。実際それだけで困ることはほとんど無い。以下で、ATmaga8をテーマにヒューズビットLowのポイントをメモしておく。

ヒューズLowバイトの機能
 ヒューズビットは1バイト(=8bit)単位で操作する。HighバイトとLowバイトの2バイトがあり、そのうち「下位側」と称する方を良く操作する。 これはAVRマイコンが動作するクロックをLowバイト側で決めているからだ。

 また、AVRが正常に起動(スタートアップ)するまでの待ち時間もここで設定する。

 ほかに、あまり使うことはないのだがATmega8では電源電圧の低下を検出する「Brown out検出」の設定もLowバイトに含まれている。しかし必要が無ければそのままにしておけば良い。

 結局ヒューズLowバイトでは主にクロックの選択とスタートアップに関する部分がポイントだ。

ATmega8のクロック
 ATmega8の動作クロックは様々な方式から選択できる。

1・外付け水晶発振子あるいはセラミック発振子
 所定の端子に水晶発振子(クリスタル)あるいはセラロックのような発振子を接続してクロックを得る方法。一般に数MHzの周波数のものを使う。保証上限周波数はATmega8では16MHzで、最近のチップでは20MHzになっている。発振子の周波数や種類に応じ、ヒューズLowバイトの下位4bitを1111〜1010の種類で設定する。以下で詳しく説明。(クロックの周波数精度と安定性を要するとき使う)

2・特に低い周波数の水晶発振子
 同じ水晶発振子でも、特に低い周波数の発振子を外付けする方法。これは、時計用の32kHzのような周波数を言う。こうした低周波水晶発振子は数MHz〜の水晶と同条件では旨く発振できない。従って特別な設定が設けられている。ヒューズLowバイトの下位4bitを1001に設定する。(この設定はあまり使われないようだ)

3・外付けRCによる発振
 非常にラフな用途の場合、抵抗器RとコンデンサCの時定数でクロックを作ることができる。このあと説明する内蔵RC発振器では得られないクロック周波数にしたい時に使う。外付け水晶発振子やセラミック発振子より安価だが不安定だから周波数変動しても良いラフな用途に限る。ヒューズLowバイトの下位4bitを1000〜0101の種類で設定する。(一般にあまり使わない)

4・校正済み内部RC発振
 内蔵された抵抗器RとコンデンサCの時定数で発振させクロックを得る方法。外付け部品不要なので便利である。厳密な周波数精度を要しない用途に適する。発振周波数はチップ個々に補正されているので、RC発振器としては比較的正確である。ヒューズLowバイトの下位4bitを0100〜0001の種類で設定する。(外付け部品がいらないので最もよく使われる)

5・外部クロック
 AVR内蔵の発振回路では水晶発振とは言っても精度や安定度に限界がある。おおよそ±10〜50ppmの変動は見込むべきだ。安定なクロック周波数が必要なら、温度補償型水晶発振器(TCXO)などを外付けして供給すると良い。 あるいは動作に適した既存のクロックがあれば、それを供給することもできる。複数のマイコンの同期を取り易いと言うメリットもある。ヒューズLowバイトの下位4bitを0000に設定する。(周波数カウンタや高精度な時計などで使われる)

 この項目で注目すべきは、下の方の赤の下線部分だ。ATmega8は出荷時にヒューズLowバイトの下位4bitが0001に設定されており、スタートアップSUT(後述)は電源の立ち上がりがゆっくりであると言う設定になっている。(どう使ってもいちばん無難と思われる設定になっている訳だ)

校正済み内蔵RC発振
 いちばんよく使われるのは校正済み内部RC発振だ。外付け部品不要で、I/Oポートも2つ増やせるメリットがある。 ATmega8の内部RC発振器は8MHzで発振している。 周囲温度が25℃で電源電圧が5Vのとき±3%以内の周波数精度となっている。クロックの周波数精度・安定度が程々でよい用途には最適だ。

 内部RC発振器で得られるクロック周波数は1,2,4,8MHzの4種類だ。8MHzを源に整数分周して低い周波数を得ている。分周せずに8MHz、1/2分周で4MHz、1/4で2MHz、1/8で1MHzである。この分周数をヒューズビットで設定している。

この8MHzは周波数の「校正値」が「校正バイト」と言う場所に書き込まれている。工場出荷時に規定の精度範囲になる最適値が書き込まれる。 校正バイトの書き換えは可能だ。5V以外の電源電圧で使用する場合など、実条件で校正すれば周波数精度を上げることができる。しかし周囲温度の変化でも周波数変動はあるから、周波数精度・安定度を要するならセラミック発振子や水晶発振子を使うべきだ。

# 設定だが、ヒューズLowバイトの下位4bitを:
0001で1MHz(←これが出荷時設定)
0010で2MHz
0011で4MHz
0100で8MHz
・・・・の設定でクロック周波数が選べる。

ほか、スタートアップ・タイムをきめる2ビット:SUTは、もっとも安全な「10」が初期設定されている。特に必要性がなければ書き換える必要は無いと思う。

外付けRCによる発振
 図の様に外付けの抵抗器RとコンデンサCの時定数でクロック発振させる。クロック・タイミング(周波数)がデリケートに影響しない用途向けだ。

 クロック周波数fは、おおよそf=1/(3RC)で計算できる。 なお、Cの値は少なくとも22pFにすべきで、CKOPTと言うヒューズ・ビットの設定でAVR内蔵の36pFを使うこともできる。(注:CKOPTはヒューズHighバイトにあり)もちろん、この36pFにも誤差があるし、配線によるストレー容量もあるから、計算式通りにはならない。 また温度係数も補償されないからクロック周波数がアバウトで良い用途に限定される。使用例は見ないが、特別低いクロック周波数をRC発振で得たい場合にでも使うのだろうか?

 スタートアップタイムに関しては、上記の「校正済み内蔵RC発振」と同じである。

外付け水晶発振子による発振
 水晶発振子を使うと周波数(周期)精度が良く安定したクロックを得ることができる。 マイコンの動作クロックをもとに時計やタイマーのような、時間精度を要する用途には最適だ。
 また、外部信号の周期や周波数を計測するアプリケーションにも安定したクロックが必要になる。 なお、セラミック発振子も使えるが周波数安定度は水晶発振子より100倍くらい悪いので用途目的次第である。

 AVRマイコンのXTAL端子は、図の様にインバータを使った発振回路になっている。XTL1がインバータの入口側、XTL2が出口側である。XTL1とXTL2とGND間に接続するコンデンサ、C1とC2は水晶発振子あるいはセラミック発振子の周波数により異なる。 具体的には次項の表にあるが、数〜16MHzの一般的なケースではいずれも15pFか22pFを使えば良い。 なお、セラッミック発振子ではC1とC2をメーカー指定の値にすべきだ。

 内蔵水晶発振器には2つのモードがある。発振振幅を抑えたモードと、発振振幅が電源電圧いっぱいに振れる「Full rail-to-rail swing」がある。 不要輻射を抑えるには前者が、ノイズが多い環境で使うには後者が向いている。いずれにするかは、ヒューズHighバイトにある「CKOPT」の設定で変更できる。私は(デフォルトの)発振振幅を抑えたモードで使うことが多い。


水晶発振のヒューズビット設定
 使用する水晶発振子の周波数帯によって3種類の設定がある。 さらに、発振振幅の選定があるので全部で6種類の設定があることになる。

 多くの場合、数〜16MHzの水晶発振子を使うだろう。発振振幅を抑えたモード(=初期設定)で発振させるなら、CKOPT=1、CKSEL3..1=111で良い。 殆どの場合、これで良い筈だ。 なお、CKSEL0も1で使うケースが殆どのはずで、結局CKSEL3..0=1111と言うことになる。(次項を参照)

 別のAVRマイコンにクロックを供給する場合はCTOPT=0として、フルスイング発振させた方が安心だ。出力はXTL2端子側から取り出す。(注:ヒューズ・ビット:CKOPTはヒューズHighバイトにあり)

 C1とC2であるが、上項のように多くの場合15pFか22pFを付けておけば良いようだ。 セラミック発振子の場合、3端子型ならC1とC2は発振子に内蔵されているから外付け不要である。

 幾つか調べてみたが、2端子型のセラミック発振子も数MHzなら水晶発振子と同じ15pFか22pFで良いようだ。 但し1MHz以下ではもっと大きな容量が必要で、村田製作所のセラロック(R)では100pFが指定値である。たとえば455kHzのセラロックを使う場合などだ。

 アマチュアの用途なら「発振すればOK」であるが、製品に使うには電源電圧、周囲温度の変化のほか、マイコンのロットによるバラツキも検討しておかないと安心できない。

スタートアップ・タイム
 電源を加えてからクロックが安定し、内部が初期状態にリセットされ、初めてマイコンは正常に動作する。 従って、電源電圧が加えられ一定時間経過してからプログラムはスタートする。

 同様に、スリープやパワーダウンの状態から復帰する場合も暫くの待ち時間が必要だ。 どの程度の時間で起動するかはヒューズビットのスタートアップ・タイム・ビットで決定する。

 特別に短い起動を必要としなければ、十分な起動時間を取って、ゆっくりした起動の方が確実であろう。 また、マイコンに加わる電源電圧の起動特性も関係する。 一般の安定化電源では設定電圧に安定するまでに、数10〜数100mSの時間が必要だからSlowly rising powerを選択するべきだ。

 起動時間がクリチカルではない用途なら、セラミック発振子の場合で:CKSEL0=1、SUT1..0=00にする。水晶発振子の場合で:CKSEL0=1、SUT1..0=11でも良いと思う。

 注釈が付いているが、パワーダウンあるいはパワーセーブ状態からの復帰で安定まで待つ(必要のある)クロック数は:セラミック振動子で258クロック、水晶発振で1,000クロックでも良い。但し、いずれも精度を要しない場合に限る。また上限に近いクロック周波数では推奨されないとある。 普通はもっと待つ方が良いのである。

 参考:セラミック発振子の待ちクロック数が少ないのは発振に要する起動時間が短いからだ。 Qが極めて高い水晶発振子は発振振幅が安定するまでに時間を要する。従ってやや長く待つ必要がある。

外部クロックの与え方
 外部からクロックを与える場合は、ヒューズビット:CKSEL3..0=0000とする。 また、信号はXTAL1端子に加えること。 与える信号の振幅は、ゼロから電源電圧までフルスイングする矩形波信号が良い筈で、Duty=50%に近いものが好ましい。

 負荷としては重くないので普通のC-MOSやPull-up抵抗付きのLS-TTLでドライブできる。 なお、TCXOほか、缶入り水晶発振器の出力は、C結合になっていることがある。 その場合は電源電圧の半分に相当するバイアス電圧を掛けた方が良い。 特に発振振幅が不足気味のオシレータではバイアスを掛けないと動作が不安定になることがある。 ドライブするオシレータ側の事情によるが、10kΩ〜47kΩ程度の抵抗器を2本用意し、1本目:電源→XTAL1端子、2本目:XTAL1端子→GNDに接続してバイアスを掛ける。

 スタートアップ・タイムは、上記と同様に特別な事情が無ければ十分な時間待つ方が望ましく:SUT1..0=10の設定が望ましいと思う。 なお、SUT1..0=11は「将来用の予約」なので設定してはいけない。

Brown-out Detection
 停電と言うのはBlack-outであるが、Brown-outと言うのは電圧低下状態のことだ。 たとえば電池が減ってきて規定の電源電圧を下回ったら、通常の処理をやめて待機準備に入る必要があるかもしれない。

 Brown-out Detectionと言うのは、そうした電源電圧の低下を察知する機能のことだ。その機能をON/OFFすることができる。 通常はデフォルトのOFFのままで良いだろう。

 たまたまATmega8ではヒューズLowバイトに含まれているのでここで説明している。 おなじ28pin AVRでも、ATmega48〜ATmega328ではヒューズHighバイトに含まれている。 但し、機能は概ね同じなので、電圧低下処理が必要な機器なら詳細を読んで機能させる。 


ヒューズバイトの書き換え
 意味がわかれば恐れることもない。 意味もわからず無闇に書き換えようとするから、復帰不能な状態に設定してしまうのだ。

 外付け水晶発振子や外部クロックの状態に設定しただけなら、所定のクロックを与えれば大丈夫。 再びチップが応答するようになって再度書き換えできるようになる。 従って過度に怖がらなくても良い。

 もちろん、水晶発振子なりオシレータが手元に無いと困ってしまう。数MHzの良質な水晶発振子や出力波形確認済みのオシレータ・モジュールを用意しておくとかなり安心できる。

 図はhidspx-GUIの画面だ。今の場合Clock周波数を内蔵8MHzに変えたいだけだった。ヒューズLowバイトの下位4ビットを、「0100」にすれば良い。16進で言えば「4」にする。上位4ビットは無変更なので「1110」即ち「E」である。結局、初期値が「E1」だったものを「E4」にすれば良いのだ。

 もうわかったから上の方にある、ヒューズビットの窓に所定の設定をインプットし「Write」ボタンを押せば書き換え完了だ。 けして難しいものではない(だろうと思う)。

参考)ATmega48PA、ATmega88PA、ATmega168PA、ATmaga328PではヒューズLowバイトの初期値は「62」になっている。内部RC発振器の1MHzで動作しており、上記と同様8MHzのクロックにするには「E2」に書き換える。「E4ではない」ので注意を! 詳細はATmega48/88/168/328のマニュアルを参照。

                    −・・・−

後記
AVRマイコンの様々な機能のうち、内部の回路的な部分はユーザープログラムからでは操作できない。 (内部にある)スイッチに相当するものがヒューズビットだ。 その「スイッチ」で内蔵回路の接続を切り替える。 例えば内部のRC発振器を停止しクロック入力を足ピンに切り替えてやれば外部クロックで動作できる。 おおよそそうした切換えを行なうのがヒーズビット(ヒューズバイト)の役割だ。

 在庫品の活用が目的だったのだが、このBlogを書き始めて暫くしてATmega8はもう既に過去のデバイスであることに気付いた。 現行主流のATmega48〜328とはヒューズバイトのアサインが随分違うのだ。 新チップに対応すれば良かったのだが、もう大半書き終えていたのでそのまま行くことにした。 もしATmega48、88、168、328を使うなら、ここに書いたATmega8とは違うので注意を。クロックなど考え方は同じなので所定のビットを同様に設定してやれば大丈夫。

 ヒューズビット(バイト)は回路屋には理解し易いが、ソフト専門の人には難解かもしれない。 しかし恐れる必要はない。 機能は各チップで概ね同じだから少しマニュアルに目を通せば心配いらない。 それにヒューズとは言っても一回切ってしまったら修復(再接続)できない訳ではなく、(限度はあるが)普通の意味では何回でも書き替え自在だ。

以上、例によって自身の備忘用Blogなのであるが、こうやって書いてみると、やっぱりヒューズビットは面倒だなあ。(笑) de JA9TTT/1

(おわり)

2011年5月14日土曜日

【部品】Programmable X-tal OSC

プログラマブル水晶発振器
 何でもそうだが、電子部品も「適材適所」である。本来の目的に従い、適切に使えば素晴らしい性能を発揮してくれる。 しかし、適用を誤れば問題の種にもなりえるものだ。

 以下の話しは、特定のメーカーやその製品の優劣を言うのが目的ではない。用途に対する適否の判断が目的だ。これは予め強調しておきたい。一面から見た欠点で、その全てを否定するのは間違いだ。むしろ用途に対する適否の判断こそ重要で慎重に行なうべきだ。

 写真は、EPSON TOYOCOM社のSG-8002シリーズ水晶発振器である。この水晶発振器の特徴は何と言ってもプログラマブルということにある。製造後に広範囲の発振周波数に変更しうるのだ。 従来の水晶発振器は周波数ごとに水晶発振子を製作して作る必要があった。当然、周波数の数だけ製品の種類ができてしまう。 しかしこの発振器は一種類を元に多様な周波数の発振器に「変身」できる。 その「変身」には専用プログラミング・ツールが必要だが、製造メーカーにとってはまるで夢のようだし、納期が短いならユーザーにも大きなメリットがある。少量多品種を実現するにはたいへん魅力的だ。

秋月DDSキットがリニューアル
 まだ話題になっていないようだが、秋月電子通商のロングセラーが最近リニューアルしている。 秋月のDDSキットは幅広い周波数の信号が得られるので、アマチュア無線だけではなくオーディオや測定の分野まで長く使われてきた。

 いまでこそ、性能に優れるアナログデバイセス社のDDSが幅を利かせているが、かつては安価なDDSと言えばこれしかなかった。実際、手軽な信号源として何度も購入している。

 流石に、旧式のDDSなので無線の用途にはあまり使わなくなった。新型DDSに比べ上限周波数が低く出力に現れるスプリアスも多いからだ。 出力信号直接の使用はスプリアスの問題があるので、できればPLLのループに入れ「クリーニング」して使う方が良い。 そのあたりが、昨今の新型DDSに比べて少々面倒な所だ。

 ところで、このDDSキットに使われている水晶発振器を購入しようと思い、お店のホームページを覗いてビックリした。 DDSキットに付属する67.10886MHzの水晶発振器が変わったのである。この発振器は単独でも購入できた。それが従来の金属ケース入りから新型に変わっていた。 しばらく品切れで、次の入荷をまっていたのだが同じ物は仕入れできなかったようだ。

# それでこの新Kitだが、用途・目的次第と思うが少なくとも前より性能が良くなったとは思えない。オシマイまで読んでもらえばわかるだろう。

プログラマブル水晶発振器の規格
 左は、これから評価するプログラマブル水晶発振器のデータシートである。 たまたま持っていたのが表面実装型だったので、秋月で売っているものと外形や型番は違う。 しかしそれ以外、中身は同じだから参考になると思う。

 左表のPTシリーズがそれで、電源電圧は5Vが標準だ。 発振(設定可能な)周波数は1〜125MHzと広範囲だ。 説明によれば内部の水晶発振子を基準にPLLで各種周波数を発生しているそうだ。 内部構造の詳細は明らかでないが、フラクショナルN(=Fractional N:分数N)形式のデジタルPLLになっているのではないだろうか。

 そのプログラマブル・デバイダの分周数Nを外部の専用ツールで書き換えることで、ある程度任意の周波数が作り出せるのだろう。 水晶発振器として非常に旨い方法だ。 もしAVRマイコンのように簡単なライタでユーザーが設定可能なら、もっと素晴らしいのだが・・・。

欠点もある
 世の中、すべてが良いことは稀である。才色兼備など滅多にあるものではなく、この水晶発振器も欠点があるようなのだ。

 さりげなく書いてあるが、要するにこのオシレータを基準にPLL回路なりを作ると、得られる信号のスペクトルは汚いですよと言うのだ。

 これから評価するPTシリーズの規格では、出力に150〜250pSのジッタはあると言う。発振周期ごとの周期の揺らぎ(=サイクリック・ジッタ)が200pS、周期の揺らぎのピーク・トゥ・ピークは最大で250pSあると言う。これは大きいのか小さいのかと言うことになるだろう。(pS:ピコ秒)

 タイミング関係で考える場合は、揺らぎ(ジッタ)を「時間・周期」で判断する方が好都合だ。しかし、無線家としては、時間・周期ではなくその裏返しである周波数の揺らぎとして捉えてみたい。 また、その実力がどの程度であって、世の中の発振器と比べてどの程度のものか是非とも知りたいものだ。

実物でテスト
 写真は、テストの様子である。 プリント基板に裏返して組立てた。 銅泊はアースなので、確実なGndがとれている。 誘導など受けない、真の特性が取れるだろう。

 電源:Vcc=5Vで、実験用の可変型シリーズ電源を使った。もちろん十分奇麗なDC電源であり、3端子レギュレータよりもずっと奇麗で、重畳する(ホワイト)ノイズは小さい。 このあたり、電源が奇麗でないと影響を受けて正しい性能が評価できないことがある。要注意だ。 オシレータ・ノイズの判定に3端子レギュレータを使うのは旨くない。特に高感度なVCOなど自励発振器では電源ノイズの影響は顕著なので注意したい。

まずは1MHz幅で観測
 評価したオシレータは、公称周波数が26.2144MHzと言うものである。(注:商社から購入したもの。秋月ではこの周波数は売っていない) そこから上下500kHzのスペクトルを観測している。 縦軸の1目盛りは10dBである。 横軸の1目盛りは100kHzだ。

 水晶発振器のスペクトルを見慣れたお方なら、一目でこのオシレータのノイズ(揺らぎ)は際立って大きいことがおわかりだろう。(これはフェーズ・ノイズと言うもの)

 一見すると揺るぎのないキャリヤ(搬送波)をノイズで振幅変調したAM波のようにも見える。しかし、実体は異なったものだ。キャリヤそのものがある確率で中心周波数から揺らいでいるのである。スペアナで観測する性質上このように表示される。オシロスコープで振幅も観測すればわかるだろう。 従って、AM波ではないのだから急峻なフィルタを通して、ノイズサイドバンドをバッサリ・・・と言う考えは効果的でない。フィルタで良くなりはしない。下手にフィルタを通せば振幅性ノイズを持ち込むことにさえなる。このあたり、勘違いの無いように。

 周期的なノイズも存在するようだが、ランダムなノイズもたいへん大きい。 これを見ただけで、RF回路に使う気は一気に失せてしまった。(笑)

100kHz幅に拡大して詳しく観測
 さらに、中心周波数の付近を100kHzの幅に拡大して観測してみた。 周期的な揺らぎがさらに揺らいでいるというような特性もみられる。 ともかく、これは酷い特性だと言える。

 もしも、こんな発振器を使って周波数変換やSSB発生を行なうと、得られた信号の近傍はこうしたノイズでひどく汚染された状態になってしまう。

 PLLの基準に使う場合を考えてみよう。このオシレータの周波数から見て、遥かに低い周波数の発生なら周波数比だけフェーズ・ノイズ(ジッタ)は軽減される(注1)。案外使い物になる可能性もあるだろう。 しかし、逆に高い周波数を得るPLLでは周波数比だけ悪化が考えられる。 もはや使いものにはなるまい。

注1:例えば、10MHzを基準に、1kHzを得るなら周波数比は1万倍である。旨くすれば40dBくらい改善されるから使える可能性も十分ある。用途により一概に使えない訳ではない)

数値評価@10kHz:-71dBc/Hz
 のちのち比較可能なように、数値的に捉えておこう。 一般に行なわれるように、キャリヤ周波数から10kHzはなれたところのノイズを数値として測ってみた。

 揺らぐので測定値は安定しないが、概ね-71dBc/Hzであった。 この値がどの程度のものなのかは、次の写真と比べてもらえばはっきりするだろう。

しかし、この際はっきり言ってしまおう。 水晶発振器としては、ものすごく悪い数字だ。

 これを通信関係や映像関係の用途に使ってはダメである。 もちろんオーディオにも・・・と言えるが、ジッタがたっぷりあると瑞々しいなどと言うお方があるので困ってしまう。工学的な見地では割り切れない分野だから仕方がないのかなあ・・・。(笑)

 ともかく無線に使うのはやめたい。オーディオなら自家だけの問題だから個人の自由だが、無線は近傍周波数でオンエアする他局の迷惑になる。 当然、あなたの品位も疑われるにちがいない。

せめてこのくらいは
 これは普段実験につかっている手近にある周波数シンセサイザのスペクトルだ。 手軽に作っても普通の水晶発振器なら、この写真よりもさらに良いと思う。

 市販の周波数シンセサイザは高機能なので、その分回路構成は複雑だ。 そのおかげで出力に含まれる付随ノイズはやや大きめになってしまう。しかしそれでもこの程度は行くのだ。 上記の発振器と比べて30dB以上もきれいだ。(ノイズパワーで言えば1,000倍もきれい)

 例えば2SK241で水晶発振させバッファアンプを付けた程度のシンプルなものでも、件のオシレータよりも40dB以上きれいなものだ。 さらに入念に回路設計し部品も吟味すれば20dB以上の改善ができる。 今どきのきれいな発振器とはそのくらいまで行っている。

 比べてわかるように信号の奇麗さという観点で言うとすれば、箸にも棒にも掛からない性能だ。 他の用途なら別かもしれないが、少なくとも無線関係の用途では(けして)使いたいと思わない。

こまった。殆どがコレに・・
 こうした水晶発振器をアマチュア無線家が自作に使うことは稀かもしれない。 影響は少ないかと思うが、秋月のページを見ると既に大半のオシレータがこの「問題アリ」の部品になっている。

 ニーズの多い周波数からこの発振器に置き換えているのだろう。 おそらく、マイコン系のクロックに使う程度ならあまり気にならないのだ。 ノイズで揺らいでいても平均周波数は正確で累積的な誤差が少なければ時計やタイマーのような用途には差し支えないだろう。 だから一概にダメな部品だとは言い切れない。 

 しかし、 PLLとかDDSシンセサイザのようなAF やRF信号発生あるいは信号処理のクロックに使うとアウトプットの付随ノイズに悩むことになるかもしれない。そのあたりを十分吟味してから使いたいものだ。

                  −・・・−

後記
便利なものにはウラがある・・・を地でいったようなオシレータであった。 実は業務で開発した機器にこのオシレータを使ったところ、予想外の不要スペクトルが現れてトラブルになったことがある。 担当者は悩んだようだが、私は仕様書をみてすぐに気付いた。 クロック発振に使ったオシレータのスペクトルが汚いのが原因の全てであった。

 この水晶発振器はPLLを使っている。しかしPLLが本質的に悪いのではなく、この発振器に使っているPLLがPoorなのだ。 メーカーもスペクトルが美しくないのは百も承知だろう。しかし、きれいなものをこのサイズに作るのは無理があるのだ。より一段の技術開発を待ちたいと思う。

 最近になって、アナデバ社のチップを使ったDDSシンセサイザを検討している。DDSのクロックとして、秋月の67.10886MHzオシレータは重宝であった。 何個か追加購入しようと思い時々サイトを覗いていたがずっと品切れが続いていた。 最近になってDDSキットがリニューアルされ、同時にそれに使っている新しいクロック発振器も販売されるようになった。 さっそく購入しようと思ったら、それは使えるようなものではなかったのだ。

このオシレータ、フラクショナルNなPLLなんか使ってるから、揺らぎがフラクタルでカオスの混沌に迷い込むのだ・・なんて? まさかねえ・・。 仕方がないからクロック発振回路も自作で行くか別のオシレータを使うことにしよう。(笑) de JA9TTT/1

(おわり)

2011年5月5日木曜日

【AVR】BASCOM-AVR Initial setting

BASCOM-AVRの初期設定
 しばらく前のBlogでは40pin28pinのAVRマイコンを扱っている。それぞれAVRマイコンの機能概要を紹介し、テスト用基板の例を載せておいた。 こうしたテスト基板はニーズがあるらしく検索経由etc.でそこそこのアクセスを頂いている。

 もちろん例示したような回路でなくもっと簡単に始めることもできる。しかしFullに機能が載った回路を標準にしておくと有利だ。不要な部分を省けば根幹部分の共通化が図られている。そうすればプログムを書く時にも便利になる。

 BASCOM-AVRの初期設定も使用するポートが決まっていればデフォルト設定で行ける。 写真は少々旧式化してきたATmega8だが、前のBlogの例に従い28pin AVR用テスト回路に準拠して作ることにした。今度の製作で必要な機能はごく少ないので小さな基板に載せている。 28pinのATmega8シリーズならどのチップにでも載せ換え可能だ。

 なるべく共通化しておきたいのは、ISP/SPIのポート割り付け、LCDモジュールの接続ピン、RS-232Cの接続ピン、スイッチやロータリエンコーダの接続ピン、I2Cの接続ピンなどである。 これらをできるだけ共通化しておけば、初期設定が容易なだけでなく、誤りが防止できプログラムの載せかえも容易になる。

# 以下はBlogで紹介済みの28pin AVRマイコン用テスト基板のBASCOM-AVRに対する初期設定の様子である。回路図だけではなく、その設定手順も書いておかねば片手落ちだ。

Chipを選択・1
 BASCOM-AVRを立ち上げたら、まずはOptionメニューからChipの選択を行なう。 図の様に、Oprion→Compiler→Chipと進み次の画面へと進むことから始める。

 注)BASCOM-AVRコンパイラへの直接指示コマンドである:
$regfile=mega8def.dat
$crystal=8000000
・・・と言うコマンドをプログラム先頭に記述し、以下と同じ内容のセッティングを行なう方法もある。その方がプログラムだけを見た時には明示的でわかり易いかも知れない。但し、以下の方法でも支障は感じないので画面から初期設定する方法で行くことにする。

Chipの選択・2
 チップ定義ファイルを選択する画面が現れる。 図の窓から、これから使用するチップの定義ファイルを選択する。

 図はATmega168の例である。 ここではATmega8を使うので、「mega8def.dat」と言う定義ファイルを選択する。 もちろん、定義ファイルを変更すれば、この画面の各窓に表示されるFlashメモリの容量などは異なる。 この画面においてはチップの定義ファイルを選択するだけで、他の部分(窓)をさわる必要はない。




MPUクロックとシリアル・ボーレートの設定
 続けて、赤で囲ったCommunicationタブをクリックするとこの画面が現れる。ここでは、実際にMPUが動作するクロックの周波数を設定する。

 BASCOM-AVRは設定したMPUクロック周波数に基づいて、シリアル・コミュニケーション(RS-232C)のボーレートを計算・設定する。ここにクロック周波数のインプットがあるのはそうした意味からだ。

 3段目の窓に「Error」(エラー)とあるが、これは入力したクロック周波数で最適化した際に発生するボーレートエラーである。 一般に〜2%程度なら問題ない筈だが、そもそもシリアル通信しないのなら誤差が幾らであっても気にしない。

 また、プログラム中で頻繁に使う「wait/waitms/waitus」の各コマンドもクロック周波数の影響を受ける。ここに入力された周波数に基づいて時間計算され実行されるからだ。 従ってクロック周波数はわかる範囲で正確な数字を入れておく方が良い。(内部クロックはそれほど安定ではないのでせいぜい2〜3桁分の有効数字を入れれば十分だと思う)

 クロックはHz単位で入れる決まりなので、例えば8MHzなら「8000000」即ち8の後にゼロを6個入れる。図の例では27MHzなので、27の後ろにゼロが6個である。

 言うまでもないだろうが、ここでインプットした周波数でMPUが動作するのではない。それは逆で、MPUが動いている周波数をBASCOM-AVRに教えるのが目的だ。 実際のクロック周波数はヒューズ・ビットの設定と外部に接続した水晶振動子の周波数などで決定される。ここでは実際にMPUが動作している周波数をインプットする。

 いま製作した基板では内部クロック発振を使い、ヒューズ・ビットを書き換えクロック分周器はOFFして使うから8MHzで動作することになる。従って、「8000000」とインプットしておいた。なお、ヒューズ・ビットについては別のBlog(←リンク)で扱っている。

(参考:メーカー保証外だが、20MHz品のAVRマイコンは30MHzくらいまで平気で動作するようだ。少々旧型で16MHzが仕様のATmega8はせいぜい20MHzくらいが良い所だろう)

I2C、1-Wire、SPI/ISPのポート設定
 次にI2Cインターフェース、1-Wire通信、及びSPI/ISP通信に使うポートを設定する。赤で囲ったタブをクリックする。 このうち特に重要なのはSPI/ISPの設定だ。 もちろん、プログラム中でI2Cや1-Wireを使うならこれらの設定も必須になる。


 なお、SPI/ISPに使うピンはAVRマイコンの品種により決まっている。 ATmega8のほか、28pinのmega8シリーズであるATmega48、ATmega88、ATmega168、あるいはATmega328なら、図の設定がデフォルトになる。なお、この中でSSピンは特に設定不要なようだが、一応図のようにしておけば良いようだ。

 注:I2Cや1-Wireはマイコン相互や周辺用ICとデータ通信するための規格で、簡単に説明するのは困難なのでWikipediaやBASCOM-AVRのマニュアルなどを参照。 28pin AVRマイコン用テスト基板の設計に合わせるなら、I2CのSCLport=PORTC.5、SDAport=PORTC.4にセットする。もちろん、これらを使うつもりが無ければ設定は何でも良いだろう。

LCDモジュールの設定
 もっとも簡単で手軽に文字や数字情報を表示できるのが、標準タイプのLCDモジュールである。 図の赤く囲ったタブをクリックする。 キャラクタ・タイプのLCDモジュールの配線接続をここで設定する。

 左上の窓で、使用するモジュールのタイプを設定する。ここでは16文字2行のタイプを使っているので、「16*2」を選ぶ。 またBUS modeは4ビット、Data modeはpinがデフォルトの筈だ。 同様にLCD-AddressとRS-Addressの部分も変更せずそのままで良い。

 右側の窓で、LCDモジュールの各端子をマイコンのどのポートに接続するのかを設定する。製作した基板は前のBlogにある28pinAVRマイコン用テスト基板と同じ配線になっている。 そのままの配線を踏襲したので図と同じに設定すれば良いわけだ。 LCDと各ポートの設定にはかなり自由度があるので製作物の都合で変更しても良い。 LCDモジュールへのデータの流れが他の接続物と干渉しないよう旨く設計すればポートの共用も可能だ。上手に工夫して少ないポートをなるべく効率的に使いたいものだ。

以上、全ての設定が済んだら画面下の「OK」と言うボタンを押して終了する。 あらためて確認したいなら、もう一度Option→Compilerのメニューから始める。

参考:LCDモジュールの設定は上記のほかにプログラム中に記述する方法でも可能だ。
Config Lcd文などを使う。
例えば:
Config Lcdbus =4
Config Lcd= 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.0 , Db7 = Portb.1 , E = Portb.3 , Rs = Portb.2
・・・と言うように記述する。詳細はBASCOMマニュアルのConfig LCDなどの説明を参照。

テストプログラム
 定番の「LEDチカチカ」と「LCD表示」の簡単プログラムだ。 まずは、これがうまく行けば配線に問題が無く上記の設定にも間違いはないと言う最低限の確認ができる。

 「LEDチカチカ」など今さら馬鹿らしいかもしれないが、基板を製作したらまずは最低限の動作確認をしておくべきなので少なくとも1回は実施している。 丁度テスターで各部の導通テストやB+がアースにショートしていないか確認するようなものだ。 基本的なことが確かでなければ、以後のプログラムはけしてマトモには動かないだろう。

参考:図はATmega168用なので、チップに合わせて適宜変えれば良いが確認するだけの目的なら同じでも何ら支障はない。

動作成功
 上記の設定を行ない、さっそくチップにプログラムを書込んでみた。

 このようにLCDに表示が出てポートに接続したLEDもチカチカを始めた。 これで配線に誤りは無く設定も問題なくできたことが確かめられた。たぶん、この先無用な心配をせずに進めることができるだろう。


                 −・・・−

後記
 かなり暫くぶりにAVRマイコン回路を作成した。回路は定番を踏襲するので、以前のBlogを参照しながら問題もなく進められる。今回は必要な機能に絞って小型基板に載せた。 さて、一旦配線も完了しプログラムを始める前の段になって少々手間取った。BASCOM-AVRの設定とか初期に必要な作業をだいぶ忘れてしまっていたのだった。

 あいにく、件のBlogにはハードウエアやチップのことは書いてあってもボード製作後の初期設定に関しては全くなかったのだ。 むかしのweb記事にはその辺りも書いてあったのを思い出しつつ何とか作業を進めることができた。 結局、マイコン製作は配線図だけでは足りないのだ。 最低限、想定したコンパイラなりツールに合わせた初期設定の部分まで書いておくべきなのであった。このあたりは少々反省点。

 さっそく、振り返って辿った手順を記述しておくことにした。 もちろん、これは何時ものように自家用の備忘録である。 そう言えば、ヒューズ・ビットも書き換えたので設定方法を書いておくべきだった。それはまた改めてにしよう。(笑)  de JA9TTT/1

参考)AVRマイコン活用に必須な「ヒューズ・ビット」については:→こちら(←リンク)のBlogで。

(おわり)