アナログPINへのビット単位の書き込み
私はビット単位のオペランドを学び始めたばかりで、ここに私の質問があります。これをする:
pinMode (13, OUTPUT);
digitalWrite (13, HIGH);
ビット単位で私はこのようにすることができます:
DDRB |= B00100000; //set PIN13 as OUTPUT
PORTB |= B00100000; //set PIN13 HIGH
しかし、私はこれをどのように行うことができますか:
analogWrite(9, 200);
DEC番号をBINに変換する方法を知っていますが、この番号をPWM PINに送信する方法はありますか?ウェブで良い例が見つかりません。ありがとうございます!
回答
使用しているArduinoを指定していないことに注意してください。ここでは、Atmega328pベースのArduino(Uno、Nano、Mini)を想定していますが、この原理は、このハードウェアを備えたすべてのAVRマイクロコントローラーで機能します)。
with analogWrite()
areは、ピンからビット単位でデータを送信していません。特定の周波数と特定のデューティサイクルでそのピンを設定するためのハードウェアタイマーを構成します。そのanalogWrite()
ため、マイクロコントローラー内のまったく異なるハードウェアをアクティブにします。
Arduino関数なしでこれを行うにはanalogWrite()
、最初にどちらの方向に進むかを決定する必要があります。
- ハードウェアタイマーを介して割り込みを生成し、ISR内のソフトウェアで必要なピンを設定できます(これにより、ピンを自由に選択できますが、信号にジッターが発生します)
- または、ハードウェアタイマー自体にピンを切り替えさせることができます。これには、実行するソフトウェアは含まれません(つまり、対応するタイマーに関連付けられている2つのピンのうち1つしか使用できませんが、はるかに安定した信号が得られます。 )
There are lots of tutorials on the web on how to do that. A search for "arduino timer register pwm" gave me some promising results, for example this one, where they explain, how to get PWM with the Timer1 registers and a free to choose frequency. (That is a 3 part series, one part for each Timer. Part 1 for Timer 0 is here, though you might want to keep Timer 0 as it is, so that functions like delay()
and millis()
still work as normal). There are also many such questions on this site, for example this one.
ハードウェア関連のもう1つの非常に重要なソースは、対応するマイクロコントローラーのデータシートです。Atmega328pであるUno、Nano、またはMiniの場合、このデータシートはここのマイクロチップサイトにあります(またはマイクロコントローラー名をグーグルで検索する場合)。