少し前に、 ミリス()関数 de Arduinoの今、私たちはより深く掘り下げます Arduinoタイマー、この機能のこの機能を開始するには、このボードがMCUとの時間を管理する方法、およびmillis()以外の他の関数を理解してください。
Arduinoタイマーとは何ですか?
El Arduinoタイマー、またはタイマーは、ハードウェア(マイクロコントローラー内で、クロックパルスを生成し、外部ハードウェアやIC 555を必要とせずに「リズム」を設定する水晶振動子の助けを借りて)によって実装される機能であり、クロックのおかげで一時的なイベントを制御できます内部。 たとえば、スケッチコードに関係なく、タスクを間隔を置いて実行したり、正確な時間測定を行ったりします。
あなたが使用することを想像してみてください delay()関数、これにより、指定された時間が経過するまでArduino MCUでの実行がブロックされ、その後プログラムが続行されますが、タイマーはブロックされません。 MCUが他の命令を同時に実行し続けるので、それはタイミングになります。 それが大きなアドバンテージです。
タイマーはに関連しています 中断 Arduinoの、特定のタスクに参加するためにそれらを介して実行されるためです。 つまり、Arduinoタイマーは、特定の時間にトリガーされ、割り込み機能を実行する機能です。 そのため、これらの中断について知ることも重要です。
モード
Arduinoタイマーには 2つの動作モード、次の場所で使用できます:
- PWM信号:あなたは制御することができます Arduinoピン(〜).
- CTC(比較マッチでタイマーをクリア):カウンタ内の時間をカウントし、タイマのレジスタで指定された値に達すると、割り込みが実行されます。
タイマーはいくつありますか? タイマーの種類
そこに 3タイマー プレート上 Arduino UNO、他のトッププレートにはもっとあるかもしれませんが:
- タイマー0:8ビット、0〜255(256の可能な値)までカウントできます。 delay()、millis()、micros()などの関数で使用されます。 プログラムを変更しないように変更することはお勧めしません。
- タイマー1:タイマー0に等しい。UNOのサーボライブラリによって使用されます(MEGAの場合はタイマー5)。
- タイマー2:16ビットで、0〜65.525(65.536の可能な値)の範囲で指定できます。 tone()関数に使用されます。使用されない場合は、アプリケーションで自由に使用できます。
- タイマー3、4、5(Arduino MEGAのみ):すべて16ビット。
Arduinoタイマーはどのように機能しますか?
へ Arduinoタイマーを使用する、この開発ボードのMCUでこれらすべてが電子的にどのように機能するかを知ることが重要です。
- クロック周波数:は、開発可能な16秒あたりのサイクル数です。Arduinoの場合は16.000.000 Mhzです。同じように、クロック信号はXNUMX秒間にXNUMX回振動します(サイクル)。
- 期間:はTで表され、秒単位で測定され、サイクルの逆数です。 たとえば、T = 1 / Cの場合、1/16000000 = 0.0000000625になり、各サイクルが完了するまでにかかる時間になります。 また、周波数は周期の逆数であるため、f = 1/Tです。
- サイクル:は、単位時間あたりに発生する信号の繰り返しのそれぞれです。 Arduinoでは16秒で16Mになります。 または、同じことですが、この場合、625万サイクルが経過すると、XNUMX秒が経過します。 したがって、XNUMXサイクルはXNUMXnsかかると言えます。
- 信号のエッジ:クロック信号は正方形であり、エッジは上昇または下降する可能性があります。 エッジは、信号が次の場所から変化したときの信号の直線です。
- 0(低)から1(高):立ち上がりエッジ。
- 1(高)から0(低):立ち下がりエッジ。
Arduinoタイマーは信号エッジからのサイクルを測定するため、エッジは重要です。 A)はい エルコンタドール サイクルごとにインクリメントし、レジスタ値に達すると割り込みが実行されます。
したがって、これを知ったら、 ArduinoMCUで16Mhz、8ビットタイマーを使用すると、16μs(256/16000000)または4ビット(16/65536)では16000000msごとに割り込みが発生すると言えます。 したがって、16ビットカウンタレジスタを最大値65535に設定すると、4ミリ秒で割り込みが発生し、タスクが実行されます。
カウンターが可能な最大値に達すると、 再び0に戻ります。 つまり、オーバーフローが発生し、最初からカウントバックします。
タイマーの増加率を制御するには、次を使用することもできます プリスケーラ、値1、8、64、256、1024を取り、次のようにタイミングを変更します。
タイマー速度(Hz)=Arduino/プリスケーラーのクロック周波数
1の場合、プリスケーラは16 Mhzに増加し、8〜2 Mhzの場合、64〜250kHzの場合などに増加します。 カウンターとプリスケーラーの値が等しくなるまで比較してからアクションを実行するためのタイマーカウンター状態コンパレーターがあることを忘れないでください。 それで、 割り込み周波数 次の式で与えられます。
割り込み速度(Hz)= Arduino /プリスケーラクロック周波数(コンパレータレジスタ値+ 1)
幸いなことに、私たちはしてはいけません レコードを変更する コードで使用するライブラリによって処理されるため、Arduinoタイマーのただし、使用しない場合は構成する必要があります。
ArduinoIDEの例
これらすべてをもう少しよく理解するために、ここでは、タイマーの使用を体験できるArduinoIDEの8つのスケッチコードを示します。 XNUMXつ目は、ArduinoピンXNUMXに接続されたLEDを毎秒点滅させるコードです。
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configurar Timer1 TCCR1A = 0; //Registro control A a 0, pines OC1A y OC1B deshabilitados TCCR1B = 0; //Limpia el registrador TCCR1B |= (1<<CS10)|(1 << CS12); //Configura prescaler a 1024: CS12 = 1 y CS10 = 1 TCNT1 = 0xC2F8; //Iniciar timer para desbordamiento a 1 segundo //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal TIMSK1 |= (1 << TOIE1); //Habilitar interrupción para Timer1 } void loop() { } ISR(TIMER1_OVF_vect) //Interrupción del TIMER1 { TCNT1 = 0xC2F7; // Reniciar Timer1 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
前の場合と同様に、LEDの点滅または点滅を毎秒プログラムしますが、今回は CTC、つまり比較:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configuración Timer1 TCCR1A = 0; //Registro de control A a 0 TCCR1B = 0; //Limpiar registro TCNT1 = 0; //Inicializar el temporizador OCR1A = 0x3D08; //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08 TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12); //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1 TIMSK1 |= (1 << OCIE1A); //Habilita interrupción por igualdad de comparación } void loop() { } ISR(TIMER1_COMPA_vect) //Interrupción por igualdad de comparación en TIMER1 { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }プレートを購入する Arduino UNO Rev3