2018年10月6日土曜日

Arduinoを8MHzのオシレーター(発振回路)として動かす方法


背景

Arduinoとは電子工作に利用しやすいように開発環境が整えられている仕組みや開発ボードのことです。
オシレーター(発振回路)とは電源を供給すると周波数を発生する装置のことです。
周波数を発生する装置としては水晶振動子がありますが、これは信号線を2本繋げて使うタイプなので、電源を供給して信号線1本で周波数を送信するオシレーターとは別物です。
(説明が間違っていたら指摘してもらえると嬉しいです。)

マイコンの設定をミスしてオシレーターが必要になったものの、持っていなくて困っていました。
(ミスの内容を具体的に言うと、外部の水晶振動子を利用したかったのに、外部のオシレーターを利用する設定にしてしまい、マイコンが起動しなくなりました。)
調べてみたらArduinoをオシレーターとして動かせるらしく、それを利用することでマイコンを復活させられました。

オシレーターとして動かす方法を知ったStackExchangeのやりとり
Using an Arduino as a crystal oscillator

便利だったので、備忘録として情報を共有します。

使ったもの

Arduino Uno + 信号線(今回はジャンパワイヤ)



atmega328pが載っているNanoでも動くと思います。
出力ピンが変わりますが、Megaでも動かせるようです。

Arduino IDEを使えるPC

Arduino IDEとはArduinoにプログラムを書き込める開発環境です。
下記のURLからファイルをダウンロードしてPCにインストールできます。

Arduino Software

プログラム

下記のプログラムをArduino Unoに書き込みます。
OCRTAの値を1にすると、4MHzのオシレーターとして動作するようです。
#ifdef __AVR_ATmega2560__
const byte CLOCKOUT_PIN = 11;  // Mega 2560
#else
const byte CLOCKOUT_PIN = 9;   // Uno, Duemilanove, etc.
#endif

void setup() {
  // set up timer on CLOCKOUT_PIN (OC1A)
  pinMode (CLOCKOUT_PIN, OUTPUT); 
  // set up Timer 1
  TCCR1A = bit (COM1A0);  // toggle OC1A on Compare Match
  TCCR1B = bit (WGM12) | bit (CS10);   // CTC, no prescaling
  OCR1A =  0; // 0: 8MHz, 1: 4MHz
}

void loop() {
  // whatever 
}

Arduino IDEからUnoに書き込みました。


接続

GNDと信号線(Unoの場合はD9, Megaの場合はD11)を周波数を認識させたい装置に接続します。
USBで電源を供給する場合はこれで動きますが、USB給電無しで動かしたい場合は5VかVinに電源を接続してください。



まとめ

オシロスコープを持っていないので波の形は確認できませんでしたが、外部のオシレーターを必要とする状態のマイコンが動いたので、多分オシレーターとして動かせたと思います。

参考になれば嬉しいです。

0 件のコメント :