ArduinoのPWM周波数を変える MEGA編

Arduino MEGAのPWM周波数を変える話

Wed, 29 Mar 2017

一年越しのMEGA編となりました.

1年前には無かった気がするんですが,公式でPWM周波数を変える方法が公開されているのでこちらを参考にしながら紹介しようと思います.

http://playground.arduino.cc/Main/TimerPWMCheatsheet

 

まず,ArduinoMEGAにはタイマが5つあって,それぞれのタイマに対応しているピンがあります.

タイマ : PWMピン

timer 0 : 13, 4
timer 1 : 12, 11
timer 2 : 10, 9
timer 3 : 5, 3, 2
timer 4 : 8, 7, 6

 

たとえば,timer0だけ周波数を変えたら13,4ピンから出るPWM周波数のみが変わります.

先に重要なことを言っておくと,timer0はシステムに使われているので変更するのはおすすめしません.Delayとかの時間関数がずれます.

周波数の設定ですが,Dueのように任意の周波数にすることができません.

数段階の周波数の中から選べるって感じです.

timer0 (13, 4ピンのみ)

①62.5 [kHz]

②7.8125 [kHz]

③976.5625 [Hz]

④244.140625 [Hz]

⑤61.03515625 [Hz]

 

timer1 (12, 11ピンのみ)

①31.37255 [kHz]

②3.92116 [kHz]

③490.20 [Hz]

④122.55 [Hz]

⑤30.64 [Hz]

 

timer2 (10, 9ピンのみ)

①31.37255 [kHz]

②3.92116 [kHz]

③980.39 [Hz]

④490.20 [Hz]

⑤245.10 [Hz]

⑥122.55 [Hz]

⑦30.64 [Hz]

 

timer3 (5, 3, 2ピンのみ)

①31.37255 [kHz]

②3.92116 [kHz]

③490.20 [Hz]

④122.55 [Hz]

⑤30.64 [Hz]

 

timer4 (8, 7, 6ピンのみ)

①31.37255 [kHz]

②3.92116 [kHz]

③490.20 [Hz]

④122.55 [Hz]

⑤30.64 [Hz]

 

概念がわかったところで,void setup内で以下のように宣言すればPWM周波数を変えることができます.

TCCRnB = (TCCRnB & 0b11111000) | 0x0m;

n:タイマ番号 (0~4)

m:設定したい周波数の番号 (1~7)

 

コピペ用

//Timer0
TCCR0B = (TCCR0B & 0b11111000) | 0x01; //62.5 [kHz]
TCCR0B = (TCCR0B & 0b11111000) | 0x02; //7.8125 [kHz]
TCCR0B = (TCCR0B & 0b11111000) | 0x03; //976.5625 [Hz]
TCCR0B = (TCCR0B & 0b11111000) | 0x04; //244.140625 [Hz]
TCCR0B = (TCCR0B & 0b11111000) | 0x05; //61.03515625 [Hz]

//Timer1
TCCR1B = (TCCR1B & 0b11111000) | 0x01; //31.37255 [kHz]
TCCR1B = (TCCR1B & 0b11111000) | 0x02; //3.92116 [kHz]
TCCR1B = (TCCR1B & 0b11111000) | 0x03; //490.20 [Hz]
TCCR1B = (TCCR1B & 0b11111000) | 0x04; //122.55 [Hz]
TCCR1B = (TCCR1B & 0b11111000) | 0x05; //30.64 [Hz]

//Timer2
TCCR2B = (TCCR2B & 0b11111000) | 0x01; //31.37255 [kHz]
TCCR2B = (TCCR2B & 0b11111000) | 0x02; //3.92116 [kHz]
TCCR2B = (TCCR2B & 0b11111000) | 0x03; //980.39 [Hz]
TCCR2B = (TCCR2B & 0b11111000) | 0x04; //490.20 [Hz]
TCCR2B = (TCCR2B & 0b11111000) | 0x05; //245.10 [Hz]
TCCR2B = (TCCR2B & 0b11111000) | 0x06; //122.55 [Hz]
TCCR2B = (TCCR2B & 0b11111000) | 0x07; //30.64 [Hz]

//Timer3
TCCR3B = (TCCR3B & 0b11111000) | 0x01; //31.37255 [kHz]
TCCR3B = (TCCR3B & 0b11111000) | 0x02; //3.92116 [kHz]
TCCR3B = (TCCR3B & 0b11111000) | 0x03; //490.20 [Hz]
TCCR3B = (TCCR3B & 0b11111000) | 0x04; //122.55 [Hz]
TCCR3B = (TCCR3B & 0b11111000) | 0x05; //30.64 [Hz]

//Timer4
TCCR4B = (TCCR4B & 0b11111000) | 0x01; //31.37255 [kHz]
TCCR4B = (TCCR4B & 0b11111000) | 0x02; //3.92116 [kHz]
TCCR4B = (TCCR4B & 0b11111000) | 0x03; //490.20 [Hz]
TCCR4B = (TCCR4B & 0b11111000) | 0x04; //122.55 [Hz]
TCCR4B = (TCCR4B & 0b11111000) | 0x05; //30.64 [Hz]

 

© anbalab 2019