Arduinoタイマー:プロジェクトでタイミングを調整する

タイマー Arduino UNO

少し前に、 ミリス()関数 de Arduinoの今、私たちはより深く掘り下げます Arduinoタイマー、この機能のこの機能を開始するには、このボードがMCUとの時間を管理する方法、およびmillis()以外の他の関数を理解してください。

Arduinoタイマーとは何ですか?

arduinoタイマー

El Arduinoタイマー、またはタイマーは、ハードウェア(マイクロコントローラー内で、クロックパルスを生成し、外部ハードウェアやIC 555を必要とせずに「リズム」を設定する水晶振動子の助けを借りて)によって実装される機能であり、クロックのおかげで一時的なイベントを制御できます内部。 たとえば、スケッチコードに関係なく、タスクを間隔を置いて実行したり、正確な時間測定を行ったりします。

コモ Arduino UNO 16 Mhzで動作するMCUチップを搭載しており、毎秒16.000.000を実行できます。 命令は実行するのにXサイクルを必要としますが、すべてが同じクロックサイクルで実行されるわけではありません。たとえば、16ビットのものはこのAVRアーキテクチャでより多くのサイクルを必要とします。

あなたが使用することを想像してみてください delay()関数、これにより、指定された時間が経過するまでArduino MCUでの実行がブロックされ、その後プログラムが続行されますが、タイマーはブロックされません。 MCUが他の命令を同時に実行し続けるので、それはタイミングになります。 それが大きなアドバンテージです。

タイマーはに関連しています 中断 Arduinoの、特定のタスクに参加するためにそれらを介して実行されるためです。 つまり、Arduinoタイマーは、特定の時間にトリガーされ、割り込み機能を実行する機能です。 そのため、これらの中断について知ることも重要です。

モード

Arduinoタイマーには 2つの動作モード、次の場所で使用できます:

  • PWM信号:あなたは制御することができます Arduinoピン(〜).
  • CTC(比較マッチでタイマーをクリア):カウンタ内の時間をカウントし、タイマのレジスタで指定された値に達すると、割り込みが実行されます。

タイマーはいくつありますか? タイマーの種類

Arduino UNO ミリ関数

そこに 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の場合などに増加します。 カウンターとプリスケーラーの値が等しくなるまで比較してからアクションを実行するためのタイマーカウンター状態コンパレーターがあることを忘れないでください。 それで、 割り込み周波数 次の式で与えられます。

+1は、カウンタレジスタが0でインデックス付けされているためです。つまり、1でカウントを開始するのではなく、0でカウントを開始します。

割り込み速度(Hz)= Arduino /プリスケーラクロック周波数(コンパレータレジスタ値+ 1)

幸いなことに、私たちはしてはいけません レコードを変更する コードで使用するライブラリによって処理されるため、Arduinoタイマーのただし、使用しない場合は構成する必要があります。

ArduinoIDEの例

Arduino IDE、データ型、プログラミング

これらすべてをもう少しよく理解するために、ここでは、タイマーの使用を体験できる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プログラミングの詳細

プレートを購入する Arduino UNO Rev3

コメントを最初に

コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。