Arduino開発プラットフォームは、もともとアートデザインプロジェクト用の使いやすいプログラム可能なデバイスとして2005年に開発されました。その意図は、プログラミングの知識があまりなくても、エンジニア以外の人が基本的な電子機器やマイクロコントローラーを操作できるようにすることでした。しかし、その使いやすさから、すぐに世界中の電子機器の初心者や愛好家に採用され、今日ではプロトタイプ開発やPOC開発にも好まれています。
Arduinoから始めても問題ありませんが、AVR、ARM、PIC、STMなどのコアマイクロコントローラーにゆっくりと移行し、ネイティブアプリケーションを使用してプログラムすることが重要です。これは、Arduinoプログラミング言語が非常に理解しやすいためです。ほとんどの作業はdigitalWrite()、AnalogWrite()、Delay()などのビルド済み関数によって行われ、低レベルの機械語はその背後に隠されています。Arduinoプログラムは、レジスタビットを処理し、プログラムのロジックに基づいてそれらをハイまたはローにする他の組み込みCコーディングとは異なります。
遅延のないArduinoタイマー:
したがって、事前に構築された関数内で何が起こっているのかを理解するには、これらの用語の背後を掘り下げる必要があります。たとえば、delay()関数を使用すると、ATmegaマイクロコントローラーのタイマービットとカウンターレジスタビットが実際に設定されます。
このarduinoタイマーチュートリアルでは、このdelay()関数の使用を避け、代わりに実際にレジスター自体を処理します。良い点は、これに同じArduinoIDEを使用できることです。タイマーレジスタビットを設定し、タイマーオーバーフロー割り込みを使用して、割り込みが発生するたびにLEDを切り替えます。タイマービットのプリローダー値は、プッシュボタンを使用して調整し、割り込みが発生する期間を制御することもできます。
組み込み電子機器のタイマーとは何ですか?
タイマーは一種の割り込みです。これは、イベントの時間間隔を測定できる単純な時計のようなものです。すべてのマイクロコントローラーにはクロック(発振器)があり、ArduinoUnoでは16Mhzです。これは速度に責任があります。クロック周波数が高いほど、処理速度は速くなります。タイマーは、クロック周波数に応じて特定の速度でカウントするカウンターを使用します。Arduino Unoでは、1回のカウントに1/16000000秒または62nano秒かかります。意味Arduinoは、62ナノ秒ごとに1つの命令から別の命令に移動します。
Arduino UNOのタイマー:
Arduino UNOには、さまざまな機能に使用される3つのタイマーがあります。
Timer0:
これは8ビットタイマーであり、delay()、millis()などのタイマー関数で使用されます。
タイマー1:
これは16ビットタイマーであり、サーボライブラリで使用されます。
タイマー2:
これは8ビットタイマーであり、tone()関数で使用されます。
Arduinoタイマーレジスタ
タイマーの構成を変更するには、タイマーレジスタを使用します。
1.タイマ/カウンタ制御レジスタ(TCCRnA / B):
このレジスタは、タイマのメイン制御ビットを保持し、タイマのプリスケーラを制御するために使用されます。また、WGMビットを使用してタイマーのモードを制御することもできます。
フレームフォーマット:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
プリスケーラー:
TCCR1BのCS12、CS11、CS10ビットは、プリスケーラ値を設定します。プリスケーラは、タイマーのクロック速度を設定するために使用されます。Arduino Unoには、1、8、64、256、1024のプリスケーラーがあります。
CS12 | CS11 | CS10 | 使用する |
0 | 0 | 0 | クロックタイマーなしSTOP |
0 | 0 | 1 | CLCK i / o / 1プリスケーリングなし |
0 | 1 | 0 | CLK i / o / 8(プリスケーラーから) |
0 | 1 | 1 | CLK i / o / 64(プリスケーラーから) |
1 | 0 | 0 | CLK i / o / 256(プリスケーラーから) |
1 | 0 | 1 | CLK i / o / 1024(プリスケーラーから) |
1 | 1 | 0 | T1ピンの外部クロックソース。立ち下がりの時計 |
1 | 1 | 1 | T1ピンの外部クロックソース。立ち上がりエッジのクロック。 |
2.タイマ/カウンタレジスタ(TCNTn)
このレジスタは、カウンタ値を制御し、プリローダー値を設定するために使用されます。
秒単位の必要な時間のプリローダー値の式:
TCNTn = 65535 –(16x10 10 xTime in sec /プリスケーラー値)
2秒の時間のtimer1のプリローダー値を計算するには:
TCNT1 = 65535 –(16x10 10 x2 / 1024)= 34285
Arduinoタイマー割り込み
以前にArduino割り込みについて学び、タイマー割り込みは一種のソフトウェア割り込みであることがわかりました。Arduinoにはさまざまなタイマー割り込みがあり、以下で説明します。タイマーオーバーフロー割り込み:
たとえば(16ビット-65535)のように、 タイマーが 最大値に達すると、 タイマーオーバーフロー割り込み が発生します。したがって、ISR割り込みサービスルーチンは、タイマー割り込みマスクレジスタTIMSKxに存在するTOIExでタイマーオーバーフロー割り込みビットが有効になっているときに呼び出されます。
ISRフォーマット:
ISR(TIMERx_OVF_vect) { }
出力比較レジスタ(OCRnA / B):
ここで、出力比較一致割り込みが発生すると、割り込みサービスISR(TIMERx_COMPy_vect)が呼び出され、OCFxyフラグビットもTIFRxレジスタに設定されます。このISRは、TIMSKxレジスタにあるOCIExyのイネーブルビットを設定することで有効になります。ここで、TIMSKxはタイマー割り込みマスクレジスタです。
タイマー入力キャプチャ:
次に、タイマー入力キャプチャ割り込みが発生すると、割り込みサービスISR(TIMERx_CAPT_vect)が呼び出され、ICFxフラグビットがTIFRx(タイマー割り込みフラグレジスタ)に設定されます。このISRは、TIMSKxレジスタにあるICIExのイネーブルビットを設定することで有効になります。
必要なコンポーネント
- Arduino UNO
- 押しボタン(2)
- LED(任意の色)
- 10k抵抗(2)、2.2k(1)
- 16x2LCDディスプレイ
回路図
ArduinoUNOと16x2LCDディスプレイ間の回路接続:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
LCDのコントラスト制御用のポテンショメータセンターピンへ |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
10Kのプルダウン抵抗を備えた2つのプッシュボタンがArduinoのピン2と4に接続され、LEDが2.2Kの抵抗を介してArduinoのピン7に接続されています。
セットアップは下の画像のようになります。
ArduinoUNOタイマーのプログラミング
このチュートリアルでは、TIMER OVERFLOW INTERRUPTを使用し、プッシュボタンを使用してプリローダー値(TCNT1)を調整することにより、LEDを一定時間点滅させます。Arduinoタイマーの完全なコードは最後に記載されています。ここでは、コードを1行ずつ説明しています。
プロジェクトではプリローダー値を表示するために16x2LCDが使用されているため、液晶ライブラリが使用されます。
#include
Arduinoピン7に接続されているLEDアノードピンは ledPin として定義されてい ます 。
#define ledPin 7
次に、液晶クラスにアクセスするためのオブジェクトは、Arduino UNOに接続されているLCDピン(RS、E、D4、D5、D6、D7)で宣言されます。
LiquidCrystal lcd(8,9,10,11,12,13);
次に、プリローダー値3035を4秒間設定します。上記の式を確認して、プリローダーの値を計算してください。
浮動小数点値= 3035;
次にvoidsetup ()で、 最初にLCDを16x2モードに設定し、ウェルカムメッセージを数秒間表示します。
lcd.begin(16,2); lcd.setCursor(0,0); lcd.print( "ARDUINO TIMERS"); delay(2000); lcd.clear();
次に、LEDピンをOUTPUTピンに設定し、プッシュボタンをINPUTピンに設定します。
pinMode(ledPin、OUTPUT); pinMode(2、INPUT); pinMode(4、INPUT);
次に、すべての割り込みを無効にします。
noInterrupts();
次に、Timer1が初期化されます。
TCCR1A = 0; TCCR1B = 0;
プリローダータイマー値が設定されます(最初は3035として)。
TCNT1 =値;
次に、プリスケーラ値1024がTCCR1Bレジスタに設定されます。
TCCR1B-=(1 << CS10)-(1 << CS12);
タイマーオーバーフロー割り込みは、タイマー割り込みマスクレジスタで有効になっているため、ISRを使用できます。
TIMSK1-=(1 << TOIE1);
最後に、すべての割り込みが有効になります。
割り込み();
次に、 digitalWrite を使用してLEDのオンとオフを 切り替える タイマーオーバーフロー割り込みのISRを 記述し ます。タイマーオーバーフロー割り込みが発生するたびに状態が変化します。
ISR(TIMER1_OVF_vect) { TCNT1 =値; digitalWrite(ledPin、digitalRead(ledPin)^ 1); }
ボイドループ() プリローダの値をインクリメントまたはデクリメントプッシュボタン入力を使用して、また値が16×2のLCDに表示されます。
if(digitalRead(2)== HIGH) { 値=値+10; //プリロード値をインクリメント } if(digitalRead(4)== HIGH) { value = value-10; //プリロード値をデクリメントします } lcd.setCursor(0,0); lcd.print(value); }
したがって、これは、タイマーを使用してArduinoプログラムで遅延を生成する方法です。プッシュボタンを使用してプリローダー値を増減することによる遅延の変化を示した以下のビデオを確認してください。