ArduinoのPWM出力の周波数は何ですか


22

analogWrite()を使用する場合、Arduinosは通常のPWMにどの周波数を使用しますか?

そして、それは異なるArduinoモデルで異なりますか?Mega 2560に特に興味がありますが、モデル間で一貫性があるかどうかも知りたいです。

500 Hzを使用したArduinoへの参照のパスを確認しましたが、これは本当に遅いようです。


それは使用しているピンにも依存します。
ゲルベン14

回答:


31

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()ます。


1
それから、PWMで得られる最速の周波数は16Mhz / 256(プリスケーラー= 1)、または62.5Khzですか?
ダンカンC

さらに、PWM周波数は62.5KHzの偶数倍でなければなりませんか?別のスレッドの誰かが4ピンPCファンのファン速度を制御したいと考えていました。どうやら25KHzのPWM制御信号が必要なようです。62.5 / 25は2.5であり、整数値ではありません。
ダンカンC

特定の周波数を達成する可能性についてさらに詳しく説明するために回答を更新しました。
user297314

低周波数側では、1024プリスケーラーによって位相補正モードで16ビットタイマーをプリスケールして、16e6 / 1024/2 ^ 16/2 = 0.119Hz、つまり7.1サイクル/分を取得できます。それより低い場合は、millis()のようなものに基づいてビットを切り替える必要があります。または、外部入力ピンT?でカウンターをトリガーすることもできます。
デイブX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.