今回からいよいよ Arduino Nano の PWM 機能を詳しく見たいと思います。Arduino の PWM 機能については下記サイトが参考になりました。非常に分かりやすく助かりました。
Secrets of Arduino PWM
http://www.righto.com/2009/07/secrets-of-arduino-pwm.html
さて、Arduino の PWM 機能は次の4種類あります。
(1) Fast PWM (TOP:0xFF)
(2) Fast PWM (TOP:OCRnA)
(3) Phase Correct PWM (TOP:0xFF)
(4) Phase Correct PWM (TOP:0CRnA)
今回は(1) Fast PWM (TOP:0xFF) を TIMER2 を使って試してみました。
TIMER2 の PWM 出力は D11(OC2A)、D3(OC2B) になります。それぞれの出力を COM2A / COM2B ビットで設定できます。
D11(OC2A) は通常出力に設定してみました。
D3(OC2B) を反転出力に設定してみます。
次に FastPWM を WGM ビットで設定します。
CS ビットで分周率を設定します。今回は1/64 に設定してみました。
このモードでの出力周波数は下記の数式で算出できます。
出力周波数 = システムクロック / (分周率 * 256) = 16MHz / (64 * 256) ≒ 976Hz
これらの設定ビットを TCCR2A、TCCR2B のレジスタに設定します。
OC2A、OC2B それぞれにしきい値を設定することで、デューティ比を設定できます。このモードで出力される波形のしくみを示します。分かってみれば簡単ですね。
スケッチは OC2A = 180、OC2B = 75 で設定してみました。
期待したとおりの出力となりました!周波数も973~977Hzでジッタはあるものの狙い通りです。次は Fast PWM (TOP:OCRnA) について見てみたいと思います!
(^_^)/~







#include <avr/io.h> void setup() { pinMode(11, OUTPUT); // OC2A pinMode( 3, OUTPUT); // OC2B TCCR2A = bit(COM2A1); // OC2A None-inverted Mode TCCR2A |= bit(COM2B1) | bit(COM2B0); // OC2B Inverted Mode TCCR2A |= bit(WGM21) | bit(WGM20); // Fast PWM (0xFF) TCCR2B = bit(CS22); // clock/64 OCR2A = 180; OCR2B = 75; } void loop() { // put your main code here, to run repeatedly: }さて、実際の出力波形を見てみましょう!


サインスマート(SainSmart) Nano 3.0 互換ボード for Arduino
- 出版社/メーカー: サインスマート(SainSmart)
- メディア: Personal Computers
![[GPG] PCA9685 16Channel 12bit PWM サーボドライバー Arduino等の電子工作用 [GPG] PCA9685 16Channel 12bit PWM サーボドライバー Arduino等の電子工作用](http://ecx.images-amazon.com/images/I/51BrGW%2B3D1L._SL160_.jpg)
[GPG] PCA9685 16Channel 12bit PWM サーボドライバー Arduino等の電子工作用
- 出版社/メーカー:
- メディア:

Adafruit I2C接続16チャンネル12ビットPWM/サーボ シールド
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス