delayMicroseconds() の解説と実装リファレンス
【概要】
delayMicroseconds() は、Arduino環境においてプログラムの実行を特定のマイクロ秒($\mu s$)間、一時停止させるための関数です。この関数は、指定された時間が経過するまで現在の処理をブロックし、CPUを待機状態(正確には空ループやタイマー監視による待機)に置くことで、微細なタイミング制御を実現します。
【仕様】
| 項目 | 内容 |
| 引数 | unsigned int us : 待機するマイクロ秒数 |
| 戻り値 | void |
| データ型 | unsigned int (プラットフォームにより異なる場合がある) |
| 動作原理 | 指定されたマイクロ秒数分、CPUをループ処理等で拘束する |
【技術的特徴】
1. ブロッキング動作
delayMicroseconds() はブロッキング関数です。この関数が実行されている間、メインループ内の他の処理は一切実行されません。これは delay() 関数と同様の特性ですが、時間単位がより微細($10^{-6}$秒単位)である点が異なります。
2. 他の関数との比較
| 関数 | 単位 | 用途 | 特徴 |
| delay() | ミリ秒 (ms) | 数ミリ秒以上の待機 | 一般的なインターバル制御 |
| delayMicroseconds() | マイクロ秒 ($\mu s$) | 数マイクロ秒の待機 | 高速な信号生成、通信プロトコル |
| micros() | マイクロ秒 ($\mu s$) | 時間の計測 | 非ブロッキングでの時間管理 |
3. ハードウェアレベルの挙動
多くのArduinoボード(AVRマイコン等)では、この関数は内部的に現在のシステムクロックを基準としたカウントダウンまたはタイマーレジスタの監視によって実装されています。しかし、コンパイラの最適化やループのオーバーヘッドにより、数マイクロ秒単位ではわずかな誤差(ジッタ)が生じる可能性があります。
【注意点】
- 割り込み(Interrupts)の影響:
delayMicroseconds()は実行中の処理を停止させますが、ハードウェア割り込みは依然として発生します。割り込みハンドラ(ISR)内での実行は推奨されませんが、呼び出した場合はISRの処理時間が待機時間に影響を与える可能性があります。 - 精度の限界: 極めて高い精度(例:100ns単位の制御)が必要な場合、この関数では不十分な場合があります。その場合は、ハードウェアタイマーの比較一致割り込みや、PWMユニットの利用を検討する必要があります。
- リソースの占有: ブロッキング動作であるため、複数のタスクを並行して処理する必要がある複雑なシステムでは、
millis()やmicros()を用いた非ブロッキング(State Machine)の実装が推奨されます。 - 最大値の制限: 引数として渡せる最大値は、プラットフォームの
unsigned intの最大値に依存します。
【サンプルコード】
以下のコードは、特定のピンを100マイクロ秒間だけHIGHにし、その後LOWにするパルス信号を生成する例です。
const int pulsePin = 9;
void setup() {
pinMode(pulsePin, OUTPUT);
}
void loop() {
// 100マイクロ秒のパルスを生成
digitalWrite(pulsePin, HIGH);
delayMicroseconds(100);
digitalWrite(pulsePin, LOW);
// 次のパルスまで1秒待機
delay(1000);
}
【活用例】
- ビットバンギングによるプロトコル実装:
ハードウェアシリアルポートを使用できない場合、I2CやSPIの通信タイミングをdelayMicroseconds()を用いて手動で制御する。 - 高精度センサーのトリガー:
超音波センサーや一部のレーザー距離計など、特定のマイクロ秒間隔でトリガー信号を送る必要があるデバイスの制御。 - モータードライバーの信号生成:
特定の駆動方式において、極めて短いパルス幅でステップや方向を制御する場合。


コメント