Arduino UNOのPWM周波数を変更してみました。デフォルトでは約490Hz程度の周波数ですがレジスタを直接操作することで周波数を変更できるようです。
PWM周波数を制御しているTimerはTIMER0/1/2と3個準備されていて、今回はそのうちの1個、TIMER1を変更してPWM周波数を変えてみたいと思います。
TIMER0は5、6番ピン、TIMER1は9、10番ピン、TIMER2は3、11番ピンにそれぞれカウントが割り当てされているのですが、TIMER0は時間関数系(delayとか)に使用されているようで変えてしまうといろいろ狂ってしまいます。ですので今回はTIMER1(9、10番ピン)で試してみたいと思います。
直接レジスタ値を書き変えてプリスケーラの分周比を変更することで、PWM周波数を調整します。変更するレジスタはTCCR1Bの下位3ビット(CS12/11/10)で、分周比の設定ができます。
それぞれ分周比の設定はこちらになります▼
PWM周波数は『 f = クロック周波数 / (分周比 x TOP x 2) 』で計算されます。TOPは8bitの場合は255、クロック周波数は16MHz、分周比64(デフォルト)の場合、
f=16MHz / (64 x 255 x 2)≒ 490.2Hzになります。
すべての分周比の理論値と実測値を計測してみました。計測にはPICKit3のロジックアナライザー機能を使って測定してます。
測定に使用したソースはこちら▼
void setup() { pinMode(9, OUTPUT); Serial.begin(9600); Serial.print("defult:"); Serial.println(TCCR1B, BIN); TCCR1B &= B11111000; TCCR1B |= B00000101; Serial.print("After:"); Serial.println(TCCR1B, BIN); } void loop() { analogWrite(9, 128); }
「Serial.print」でデフォルトと変更後の分周比を念のためデバックしてます。
分周比は
TCCR1B &= B11111000; TCCR1B |= B00000101;
で下位3bitを操作。
9番ピンから出力されたPWMをロジアナで測定したもの▼
▲これは分周比を「8」に変更し、測定したものです。PWM周波数は実測3921.6Hzです。
それぞれ分周比ごとの理論値x計測値です▼
当たり前ですが、ほぼ理論値通りの計測値となりました。
コメント