ArduinoのPWM出力の周波数はいくつですか

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

そしてArduinoモデルごとに違いますか?私は特にMega2560に興味がありますが、モデル間で一貫しているかどうかも知りたいです。

500Hzを使用したArduinoへの参照が渡されるのを見ました。これは本当に遅いようです。

コメント

  • これは使用しているピンによっても異なります。

回答

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用に構成されています。これにより、異なるピンで異なる周波数が発生します。

  • タイマー0によって制御されるピン4および13:
    16 Mhz / 64/256 = 976.56 Hz

  • タイマー1〜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を作成するか、その目的のために作成されたライブラリを使用する必要があります。ArduinoMegaではtimer0とtimer2は8ビットで、残りは16ビットです。

変更するフル解像度を利用する16ビットタイマーのモードと、プリスケーラーおよびTOP値の変更を組み合わせることで、非常に広い範囲のPWM周波数を実現できます。

実現可能な最大周波数高速PWMモードでプリスケーラを1に設定し、TOPを3に設定することにより、はクロック/ 4です。これより低い値は許可されません。これにより、2ビットの分解能で4 MHzPWMが得られます。 0%、25%、50%、または75%の時間である可能性があります。 TOP値が高いほど、低い周波数で高い解像度が得られます。

詳細な説明については、この記事を読むか、データシート

timer0のプリスケーラー、PWMモード、またはTOP値を変更すると、millis()およびmicros()

コメント

  • 次に、取得できる最速の頻度を収集します。 PWMの場合は16Mhz / 256(プリスケーラー= 1)、または62.5Khzですか?
  • さらに、PWM周波数は62.5KHzの偶数倍でなければなりませんか?別のスレッドの誰かが、4ピンPCファンのファン速度を制御したいと考えていました。どうやらそれは25KHzのPWM制御信号を望んでいます。 62.5 / 25は2.5であり、整数値ではありません。
  • 特定の周波数を達成する可能性について詳しく説明するために回答を更新しました。
  • 低周波数側では、次のことができます。位相補正モードの16ビットタイマーを1024プリスケーラーでプリスケールして、16e6 / 1024/2 ^ 16/2 = 0.119Hz、つまり7.1サイクル/分を取得します。それより低い場合は、millis()のようなものに基づいてビットを切り替える必要があります。または、外部入力ピンTのカウンタをトリガーしますか?。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です