Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

Arduino NanoでMHzオーダーの方形波を出力する。- Fast PWM (Mode 7) -

Arduio Nano
Arduino IDE 1.8.12

サーボやLED用のPWMの作例が多いので、単純に数MHzの方形波を出すだけとかいうスケッチの例が逆に見当たらない。
PICならすぐに作れるのだが、Arduinoでやるのは難しい。
なぜかと言うと、一方にライブラリという便利なものがあって、だが一歩その範疇を外れるとAVRについて調べ直すという苦行が待っているからだ。
PICで一度通った道だから全く初めてというよりは楽だろうが、その場合、今度は「二度手間感」がまとわりつく。

どうしようかなあと眺めていたら、50kHzの方形波を出すスケッチ例が見つかった。
Timer2を使っているが、当然MsTimer2などのライブラリを使わず、ATmega328Pのレジスタを直接設定している。

早速書き込んで動かすとD3から50kHzの方形波が出た。

ATmega328Pのデータシートを眺めて設定を確認するのだが、とても煩雑なのでスケッチの規定値に沿ってそこだけ見ていく。
TCCR2AのWGM20,WGM21とTCCR2BのWGM22は波形モードを決めていて、ここではFast PWMのモード(Mode 7)になっている。

タイマーを0からカウント・アップして行ってOCRA(OCR2Aのこと?)の値と等しくなったらフラグを立てる、ということのようだ。
その前提でCOM2B1が設定されている場合は下のような動作をするらしい。

つまり、カウンターが一致したらOC2BをLowにする。
COM2B0,COM2B1ともに設定すればHigh,Lowが逆転した波形になる。
ちなみにOC2BというのはD3ピンに割り当てられているので、要はD3ピンに方形波が出力されるということだ。
なので、
const byte LED = 3;
pinMode (LED, OUTPUT);
が書いてあって出力の準備がしてあるわけだ。

続いてタイミングの取り方を見てみる。
Nanoの元のクロックは16MHzなので50kHzにするためには320回数える必要がある。
カウンタが8ビットなのでこれだと多すぎる。
クロックを8分周して数える数が40回で済むようにする。
CS21だけを1にすれば下のように分周比が8に設定できる。

あとは
OCR2A = ((F_CPU/8)/frequency) – 1;
で計算して
16000000 ÷ 8 ÷ 50000 = 40
がOCR2Aに代入される。
const long frequency = 50000L;
の値を大きくしていけば方形波の周期は短くなっていくわけだが、カウントする数である以上計算結果は正の整数でなければいけない。
このままでは2000000を超える値は指定できない。
その場合は、分周せずにクロックを直にカウントすればいいので、CS21のかわりにCS20を1にする。
4MHzの方形波を出力してみた。

ここまでスケッチ中のOCR2Bが一度も出て来てなかった。
Duty比50%だから半分の値でいいのか。

良く分からないままCTCも。
Arduino NanoでMHzオーダーの方形波を出力する。- CTC (Mode 2) –

このエントリーをはてなブックマークに追加

Posted under: Arduino


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.