Skip to content

GNSS:1PPS信号

1PPSとは

1PPS(One Pulse Per Second) は、GNSS衛星からの信号を受信したGNSS受信機が出力する毎秒1回のパルス信号です。

このパルスはマイクロ秒(100万分の1秒)単位で正確であり、毎秒正確に1回、きっかり1秒おきに出力されます。 物理的にはデジタル信号で、1本のIO端子がHIGH/LOWを繰り返す形で現れます。 複数の機器間で正確に時刻を同期させるために使われます。


GNSS衛星の時刻について

GNSS衛星は原子時計を搭載し、±100ナノ秒程度の精度で時刻を送信しています。 受信機は複数衛星の信号から電波遅延時間を計算し、これを補正することで地上での正確な時刻を導き出します。 電波は光速で進むため遅延時間は数ミリ秒程度ですが、複数衛星からの信号を同時に受信することでマイクロ秒単位の精度で補正します。


受信時刻のばらつきについて

単一の観測では若干のばらつき(±数マイクロ秒)が発生します。 1PPSパルスは受信機の内部クロックが計算結果と同期したタイミングで出力されるため、複数衛星からの観測値を平均化・補正することでマイクロ秒単位の精度が実現されます。


1PPSパルスの出力

受信機で計算された時刻がちょうど1秒ごろになったタイミングで、GPIO端子からパルスを出力します。

GNSS衛星電波
    ↓
GNSS受信機(計算)
    ↓
1PPS信号(GPIO出力)
    ↓
マイコン(ESP32など)

マイコンでの受け取り

受信機からの1PPSパルスをマイコン側で受け取るためには割り込み(Interrupt)を使います。

// グローバル変数(main.cppの先頭で宣言)
static uint64_t g_pps_time_us = 0;  ///< 1PPSパルス到来時刻(マイクロ秒)

// 割り込みハンドラ(IRAM内で実行される)
void IRAM_ATTR onPPSPulse() {
  g_pps_time_us = micros();  // マイクロ秒で正確に時刻を記録
}

// setup()内で割り込みを登録(GPIO_NUM_4に接続)
void setup(void) {
  const int pps_pin = GPIO_NUM_4;
  attachInterrupt(pps_pin, onPPSPulse, RISING);
  // ...
}

定期的なポーリングでは、1PPSパルスを見落とす可能性があります。 割り込みを設定して、1PPSパルスが来たその瞬間にコードが自動実行されるようにします。


1PPSとNMEAの組み合わせ

GNSSモジュールからシリアル経由(UART)で受信するNMEAは秒単位の精度しかありません。 1PPSパルスがもつマイクロ秒単位の精度と組み合わせて補正することで、精度のよい時刻が得られます。

// グローバル変数(main.cppの先頭で宣言)
static uint64_t g_pps_time_us = 0;  ///< 1PPSパルス到来時刻(マイクロ秒)

// 割り込みハンドラ(1PPS信号のGPIOピンに接続)
void IRAM_ATTR onPPSPulse() {
  g_pps_time_us = micros();  // マイクロ秒で正確に時刻を記録
}

// setup()内で割り込みを登録
void setup(void) {
  attachInterrupt(GPIO_NUM_4, onPPSPulse, RISING);  // GPIO4から1PPSパルスを受け取る
  // ... その他の初期化処理
}

// detection_process()内の使用例
void detection_process(void) {
  cosmic_detection_t detection = cosmic_detector_read();

  if (detection.detected) {
    // 1PPSパルスのタイムスタンプを取得
    uint64_t pps_timestamp = g_pps_time_us;

    // NMEAから秒単位の時刻情報を別途取得
    uint64_t nmea_second = gnss_read().utc_seconds;

    // マイクロ秒精度の時刻にするには:
    // PPS到来時刻 = NMEA秒 × 1,000,000 + (PPS時刻 mod 1,000,000)
    uint64_t precise_time_us = (nmea_second * 1000000) + (pps_timestamp % 1000000);

    // この precise_time_us がマイクロ秒単位で正確な時刻
  }
}

複数台での時刻同期

複数のOSECHI検出器を運用する場合、各装置が同じGNSS衛星から1PPSパルスを受信することで、マイクロ秒単位で時刻を同期できます。 これにより、異なる場所で検出された宇宙線イベントを時系列で正確に関連付けることができます。


まとめ

項目 説明
1PPS GPS衛星の正確な時刻に基づいた毎秒1回のパルス
しくみ GNSS受信機が計算した正確な時刻でパルスを出力
割り込み パルスの来た瞬間をマイクロ秒単位で捕捉するため必須
NMEA 受信機の詳細データ(位置、速度など)をテキストで提供
組み合わせ NMEAから時刻の「秒」を、1PPSからマイクロ秒を取得して結合

参考資料