回答:
PWM信号は、AVRチップ上のタイマーによって生成されます。各タイマーは、2つまたは3つの異なるピンでPWM信号を生成できます。各ピンは独自のデューティサイクルを持つことができますが、PWM周波数を共有します。タイマーのクロックソースを変更することにより、PWMの周波数を変更できます。デフォルトでは、CPUクロックを64で割った値を使用します。Arduinoの初期化コードによってプリスケーラーが64に設定されています。さらに混乱させるために、2つの異なるPWMモードがあります。高速PWMと位相補正PWMです。高速PWMでは、タイマーは255までカウントし、オーバーフローして0(256の異なる状態)からやり直します。位相補正PWMでは、タイマーは255にカウントし、次に方向を変更してゼロにカウントダウンし、方向を変更します(510の異なる状態)。
Arduino Megaには5つのタイマー、timer0-timer4があります。timer0はミリとマイクロの機能にも使用されるため、高速PWMを使用しますが、他のタイマーは位相が正しいPWM用に構成されています。これにより、異なるピンで異なる周波数が発生します。
timer0で制御されるピン4および13:16
Mhz / 64/256 = 976.56 Hz
timer1-4によって制御される他のPWMピン:
16 Mhz / 64/510 = 490.20 Hz
計算は次のとおりです。クロック/プリスケーラ/ PWMモードの状態数
状況は、私が知っている他のすべてのArduinoボードでも同じですが、異なるピンに接続するタイマーが少ないことを除きます。
タイマープリスケーラを変更することにより、PWM周波数を変更できます。このページをご覧ください:http : //playground.arduino.cc/Main/TimerPWMCheatsheet
タイマーを255以外の値にカウントすることもできます。8ビットタイマーでは出力ピンを失いますが、16ビットタイマーでは、入力キャプチャレジスタを使用してTOP値を定義できます。入力キャプチャ機能は、Arduinoコミュニティではめったに使用されない機能なので、見逃さないでしょう。
Arduinoライブラリでは、16ビットタイマーでも、8ビットの解像度しか使用できません。より高い解像度が必要な場合は、独自のanalogWriteを作成するか、目的のために作成されたライブラリを使用する必要があります。Arduino Megaでは、timer0とtimer2は8ビットで、残りは16ビットです。
プリスケーラとTOP値の変更と組み合わせて、16ビットタイマーのモードを変更してフル解像度を使用することにより、非常に広範囲のPWM周波数を実現できます。
達成できる最大周波数は、高速PWMモードでプリスケーラーを1に、TOPを3に設定することにより、クロック/ 4です。これより低い値は許可されません。これにより、2ビット分解能の4 MHz PWMが得られます。時間の0%、25%、50%、または75%になります。TOP値が高いほど、低い周波数で高い解像度が得られます。
より長い説明については、この記事を読むか、データシートを参照してください。
timer0のプリスケーラー、PWMモード、またはTOP値を変更するとmillis()
、とが混乱しmicros()
ます。