アナログPINへのビット単位の書き込み

Dec 02 2020

私はビット単位のオペランドを学び始めたばかりで、ここに私の質問があります。これをする:

pinMode (13, OUTPUT);    
digitalWrite (13, HIGH);

ビット単位で私はこのようにすることができます:

DDRB |= B00100000;   //set PIN13 as OUTPUT
PORTB |= B00100000;  //set PIN13 HIGH

しかし、私はこれをどのように行うことができますか:

analogWrite(9, 200);

DEC番号をBINに変換する方法を知っていますが、この番号をPWM PINに送信する方法はありますか?ウェブで良い例が見つかりません。ありがとうございます!

回答

3 chrisl Dec 02 2020 at 15:05

使用している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の場合、このデータシートはここのマイクロチップサイトにあります(またはマイクロコントローラー名をグーグルで検索する場合)。