1.概要
AVRマイコンは、内部RC発振回路をもっているため、発振回路や発振子などを外付けしなくてもマイコンとして動作させることができます。
しかし、RC発振回路自体はバラツキが大きいため、工場出荷時デバイス毎に与えられた校正値をOSCCALレジスタに書き込んで発振精度を確保しています。
(OSCCALレジスタへの書き込みは、リセット時、自動的に行われるものが多い)
このような仕組みのおかげで、そこそこの発振周波数精度が得られますが、自分で調整すれば、工場出荷時のデータよりもさらなる精度を期待できます。
また、標準の内部RC発振周波数と異なる周波数に合わせたい場合もあります。(例えば、マイコンの標準内部RC発振周波数は8MHzであるが、これを7.5MHzにしたいなど)
このような用途のために、AVRマイコンの内部RC発振器の周波数を正確に合わせるための回路を制作してみました。
動作原理について説明します。
主マイコンは、周波数を合わせ込みたいマイコン(被測定マイコン)にSPIシリアルインターフェースで、OSCCALデータを送ります。
データを受け取った被測定マイコンは、受け取ったOSCCALデータをOSCCALレジスタに書き込みます。その後、ソフトウェアタイマによって作り出したパルスを出力します。
この被測定マイコンが作り出したパルス幅は、マイコンクロック周波数に依存するため、主マイコンが、そのパルス幅を測定することで、被測定マイコンの内部RC発振周波数を推測できることになります。
OSCCALデータは、0x00、0x01、0x02と1づつ増やして送られます。そして、設計通りのパルス幅以下になったところで、OSCCALの値をLCDに表示し、停止します。
測定原理上、被測定マイコンにも測定のためにプログラムを書き込む必要があり、主マイコンのデータ通信には、SPI通信(送信のみ)を使いましたが、被測定マイコン側SPI周辺回路が無いものもあるため、SPI受信部は、あえてソフトウェアで実現しています。
代表的なマイコンについて、ソースリストも載せましたので、他のマイコンについてもソースを参考に作れるかと思います。
内部RC発振の周波数は、電源電圧によっても多少変化しますので、できるだけ正確な周波数に合わせたいのなら電源電圧も実使用に合わせた方がいいです。そのため、被測定マイコンの電圧は、5Vと3.3Vを切り替えられるようにしました。5V専用でしたら、回路図上のIC2、IC3、IC4、ジャンパーは不要です。
被測定マイコンとの接続は、電源2本とPB0、PB1、PB2の計5本の電線で接続します。被測定マイコンの電源の近くに、必ず0.1uF程度のコンデンサを付けてください。
2.機能
●AVRマイコンの内部RC発振器の周波数調整
3.仕様
●電源電圧 7 〜12V
●基板外形 160*115
4.回路図
5.部品表
番号 |
部品名 |
品番(仕様) |
メーカー |
備考 |
IC1 |
三端子レギュレータ |
uPC78N05 |
NEC |
|
IC2 |
三端子レギュレータ |
LP2950ACZ-3.3 |
National Semiconductor |
|
IC3 |
信号レベル変換IC |
74LVC2T45 |
TI |
|
IC4 |
信号レベル変換IC |
74LVC1T45 |
TI |
|
IC5 |
マイコン |
ATmega88V-10PU |
MIcroChip Technology |
28pin DIP |
LCD1 |
LCDキャラクタディスプレイ |
SC1602BS*B-SO-GB-K |
SunlikeDisplayTech Corp. |
16文字*2行 |
C1〜C4 |
アルミ電解コンデンサ |
100uF/16V |
|
|
C5〜C10 |
セラミック・コンデンサ |
0.1uF/50V |
|
|
C11〜C10 |
セラミック・コンデンサ |
15pF |
|
|
C11 |
アルミ電解コンデンサ |
10uF/16V |
|
|
R1〜R3 |
チップ抵抗 |
100Ω |
|
|
VR1 |
半固定抵抗 |
10kΩ |
|
|
XT1 |
水晶振動子 |
HUSG-4.000-20 |
Mercry Electronic Industrial Co.Ltd |
4MHz |
6.1 主マイコンプログラム
自作する場合は、マイコンにプログラムを書き込む必要があります。
下記ファイルをダウンロードしてマイコンへの書き込みを行って下さい。
(右クリックで ”対象をファイルに保存” を選択)
ca100.hex
プログラム書き込み時の設定
・FUSE 0xF9 0xDE 0x77
・LOCK 0xFF
6.2 被測定マイコンのプログラム例
注意点
・マイコンによって、OSCCALレジスタにデータを書く部分に、STS命令とOUT命令があります。
・書き込みの際のFUSE設定で動作クロックを1/8にすること。
---------------------------------------------------
ATtiny13A
ソース・ファイル
ca100_ATtiny13A.asm
HEXファイル
ca100_ATtiny13A.hex
・FUSE 0xFD 0x6A(9.6MHz時)/ 0xFD 0x69(4.8MHz時)
・LOCK 0xFF
----------------------------------------------------
ATtiny2313A
ソース・ファイル
ca100_ATtiny2313A.asm
HEXファイル
ca100_ATtiny2313A.hex
・FUSE 0xFF 0x5D 0x62
・LOCK 0xFF
---------------------------------------------------
ATmega88
ソース・ファイル
ca100_ATmega88.asm
HEXファイル
ca100_ATmega88.hex
・FUSE 0xF9 0xDE 0x72
・LOCK 0xFF
7.使い方、調整
@ 電源投入後、キャラクタLCDに表示される文字が見やすくなるようにVR1を調整します。
A 被測マイコンの電源電圧5Vの場合は、ジャンパーを1と2に接続、 被測マイコンの電源電圧が3.3Vの場合は、ジャンパーを2と3に接続します。
被測マイコンを接続してから電源を投入する方が安全です。
BSW1,SW2、SW3、SW4を操作して、合せたい周波数に設定します。必要に応じてOSCCAL開始値、終了値も設定します。
C最後にRUN SWを押すとOSCCAL開始値から計測を開始し、目標とする周波数に達したと判断したところで、結果をLCDディスプレイに表示して停止します。
OSCCALデータを被測定マイコンに送り、パルス幅を確認という動作を繰り返しながら、計測していくので、結果がでるまで数秒かかります。
8.注意
・周波数の設定は1MHz〜20MHzまでです。この範囲を越えた設定もできてしまいますが、動作保証外になります。
・ATmega88などは、OSCCALに書き込む値が、0〜127までと128〜255までに別れています。例えば、下図において、7.5MHzに合わせる場合、OSCCALの値は112付近と144付近に2つの解があることになります。
どちらに設定しても大差はないと思いますが、グラフの傾きから考えて、128より上の値の方が分解能が高くなりますので、少しでも周波数精度を上げたい場合は、OSCCAL開始値を128〜255に設定する方が良いかと思います。
・標準の内部RC発振周波数に対して、大きく異る周波数に設定することが推奨されない場合もありますのでご注意ください。
9.動画
https://youtu.be/MCH2_ClJnhE