発熱体のPWMコントローラーとしてArduinoNanoを使用しています。
現在
を使用しています。 div id = “8ff0faa4af”>
D11 (PB3)。 PWMを備えたすべてのピンが使用されており、再書き込みと再配線が必要ですが、変更できます。
これにより、約490Hzの信号が生成されますが、これを次のように変更して実験したいと思います。より高い周波数。
除数をデフォルトの64から変更することで、周波数を変更できる可能性があります。
スケッチではUses http://playground.arduino.cc/Main/SevenSegmentLibrary そしてmillis()を呼び出します-PWM除数の変更はこれらのいずれかに影響しますか?
注setPwmFrequency
のドキュメントを読みましたが、「通常の操作を中断する」ことが役に立たないことがわかりました。実際には、具体的な効果について説明した後です。 millis()
を使用して、ボタンを押してLEDを点滅させるだけですが、これはタイムクリティカルではありません
PWM周波数を変更するとAtmegaのタイマーは、時間に依存する多くの関数(delay()、millis()、Servoライブラリ)の通常の動作を中断させます。
私はさらに調査を行っています。 http://playground.arduino.cc/Code/PwmFrequency の状態ピン3、5、6、または11を変更すると、delay()およびmillis( )動作を停止する関数。
他の参照では、3、11はtimer 2
を使用するため、他の参照ではtimer 0
がこれらに使用されていると主張しているため、millis()
に影響するかどうかに影響します。
コメント
- 使用するpwmタイマーに応じて、はい、いいえ。
回答
この誤った情報がどこから来ているのかわかりません…答えは no 、タイマー2を再構成してもは millis()
にもdelay()
にも影響します。これらの関数は、タイマー0に依存しているためです。Arduinoコアはタイマー2をまったく使用していません。ただし、タイマー2に依存する他のArduinoまたはサードパーティのライブラリが存在する可能性があることに注意してください。
MITU RAJが回答で正しく述べているように、ピン11のPWM信号はタイマー2なので、安全に使用できます。
コメント
- 誤った情報はプレイグラウンドからのものです.arduino.cc / Code / PwmFrequency 。誤解を招いたのは私だけではないと確信しています。もう1つの回答は、誤解を招くドキュメントの抜粋を公開したばかりです。
回答
回答は NO 、ピン11のPWM分周器を変更しても、millis()
機能には影響しません(delay()
)。
説明:
Arduino Nano は、 Arduino Uno と同じATMega328Pマイクロコントローラーを使用します。
ピン11のPWMはタイマー2によって制御されます。デフォルトでは、タイマー2のプリスケールは64です(つまり、0x04を設定します)。タイマー2の基本周波数は31372.55 Hzで、結果として490.2 Hzになります(つまり、 31372.55 / 64 = 490.1961)。
一方、マイクロ秒タイマー(つまり、millis()
、micros()
、delay()
およびdelayMicroseconds()
)はタイマー0によって制御されます。
つまり、タイマー2のプリスケーラーを変更しても、millis()
には影響しません。
ただし、ピン3のPWM周波数は変更されます。
質問に戻る:
ピン11(488 Hzより高い)の可能なPWM周波数は次のとおりです。
31373/32 = 980.4 Hz
31373/8 = 3921.6 Hz
31373/1 = 31373 Hz
32、8、1はプリスケーラーです。
これはそれぞれ0x03、0x02 & 0x01の設定値に設定します。
次のコード行を追加します:
TCCR2B = TCCR2B & 0b11111000 | setting;
ここで、setting
はそれぞれのプリスケーラーの設定値です。
============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================
ソースコード: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
コメント
- ちょっとしたことですが…位相正しいPWMモードでのタイマー'の基本周波数はF_CPU / 512ではなくF_CPU / 510(31373 Hz)です。カウントには255サイクルかかりますf rom 0から255、さらに255を追加してゼロにカウントバックします。 C.f.データシートのPWM周波数の式。
- @EdgarBonet良い点。答えが修正されました。
- 15.31HZまでゆっくりと下げることは可能でしょうか。
回答
PWMに使用したピンによって異なります。
Arduino UNO / NANOの仕様では、次のように述べられています。
ピン3、9、10、および11の基本周波数は31250Hzです。
ピン5および6の基本周波数は62500Hzです。
利用可能な除数ピン5、6、9、および10の除数は1、8、64、256、および1024です。
ピン3および11で使用できる除数は、1、8、32、64、128、256です。 、および1024。
PWM周波数はピンのペアで相互に接続されています。ペアの一方が変更されると、もう一方も一致するように変更されます。
ピン5と6はtimer0でペアになります。
ピン9と10はtimer1でペアになります。
ピン3と11はtimer2でペアになっています。
ピン3、5、6、または11を変更すると、delay()が発生する場合があります。およびmillis()関数は動作を停止します。他のタイミング関連機能も影響を受ける可能性があります。
コメント
- あなたから'仕様を引用しますが、'それらにリンクできればいいですか? 🙂