# マイクロコントローラを用いて位相オフセットを測定する

**URL:** <https://forum.digikey.com/t/topic/23306>\
**Category:** 電子部品ペディア　～基礎、応用、実践～\
**Created:** [June 23, 2022, 1:58pm UTC](https://forum.digikey.com/t/topic/23306 "2022-06-23T13:58:12Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tsuneharu\_Fuji](https://avatars.discourse-cdn.com/v4/letter/t/54ee81/32.png) [@Tsuneharu\_Fuji](https://forum.digikey.com/u/Tsuneharu_Fuji)\
**Post date:** [June 23, 2022, 1:58pm UTC](https://forum.digikey.com/t/topic/23306/1 "2022-06-23T13:58:12Z")

</div>

Matthew Bon著、最終校正：2016年12月19日

# はじめに

2つの信号間の位相オフセット（位相シフトとも呼ばれます）の測定は、力率補正や信号処理などの実用的なアプリケーションでさまざまな用途があります。この記事では、2つの信号間の位相オフセットを低コストで測定する方法を紹介します。

この記事では、TIのTiva Cマイクロコントローラを使って説明しますが、この記事で紹介する方法は、基本的にどのマイクロコントローラでも使うことができます。

# 役に立つリンク

**この記事で使われる部品のデータシート**

LM2903 [LM393-D.PDF](https://forum.digikey.com/uploads/short-url/lORTLnnx4xiU4MhJXsWrdrr8IjQ.PDF) (113.0 KB)

SN74HC86 [sn74hc86.pdf](https://forum.digikey.com/uploads/short-url/m2kIdtyWPRK4EdU3ZKzFcV5nvXu.pdf) (1.1 MB)

SN74HC244 [sn74hc244.pdf](https://forum.digikey.com/uploads/short-url/7d9zN67is8DSU6p2eSWXvfhoDPL.pdf) (1.4 MB)

TIVA-C [tm4c123gh6pm.pdf](https://forum.digikey.com/uploads/short-url/encRvVI7Jimrd5EGS2ryvQ6gfRt.pdf) (8.0 MB)

**読者がTiva Cに精通していない場合、次のリンクが役に立ちます**

[TI Tiva Launchpad Page](https://www.ti.com/tool/ja-jp/EK-TM4C123GXL)

[Getting Started with the TI Tiva TM4C123GXL LaunchPad Evaluation Board](https://forum.digikey.com/t/getting-started-with-the-ti-tiva-tm4c123gxl-launchpad-evaluation-board/13450)

# 位相オフセットの計算

位相オフセットは次の式により計算できます。

![image](https://global.discourse-cdn.com/digikey/original/3X/1/3/135798b065d69021f079392248b7efb6ef0c4467.png)

ここで、t1は最初の波形がゼロクロス点などの特定のポイントを横切る時間、t2 は2番目の波形が同じポイントを横切る時間、Tは波形の周期です。なお、この方法は、2 つの波形が同じ周期の場合のみ有効です。

# 既知の周期で位相オフセットを測定する

[![image](https://global.discourse-cdn.com/digikey/optimized/3X/5/e/5eea0085cb1cbf3433b6db9df7f2ade01e7967de_2_690x468.jpeg)

](https://global.discourse-cdn.com/digikey/original/3X/5/e/5eea0085cb1cbf3433b6db9df7f2ade01e7967de.jpeg "image")

### **動作原理**

上記の回路では、2つの信号がデュアル・コンパレータU1に入力されます。コンパレータは入力信号をパルスに変換し、そのパルス幅は入力信号がコンパレータの非反転入力の電圧レベルを超えた時間に等しくなります。 コンパレータの出力は、次にXOR（エクスクルーシブオア）ゲートに供給されます。XORゲートは、2つの信号の時間差に等しい幅のパルスを出力します（位相オフセット式の（t2-t1）部分）。マイクロコントローラは、パルスの立ち上がりでタイマをスタートさせ、パルスの立ち下がりでタイマの値を取り出すことで、このパルスの幅を測定します。そこから、ファームウェアにハードコードされている既知の固定周期に基づいて、タイマの値を度数に変換するために、いくつかの基本的な計算を実行します。そこから、UARTを介して位相オフセット値を出力します。

![image](https://global.discourse-cdn.com/digikey/original/3X/d/d/dd17983d9e20e3bb9c1ce2f68cd27fa6954ebf65.png)

**位相オフセット：** 上図では、コンパレータの出力は黄色とピンクのトレースで表されています。XORゲートの出力は、青いトレースで表されています。

### **回路ノート、部品表、およびソフトウェア**

回路ノート

- 入力信号がコンパレータのコモンモード電圧範囲を超えないようにすることが非常に重要です。従って、回路を正確に動作させるために、トランスやクリッピングダイオードを用いて入力信号の範囲を前もって調整することが必要になる場合があります。

- 多くの場合、DCブロックコンデンサを使用して入力信号をAC結合するのが良いでしょう。上図の回路で使用する場合、ブロックコンデンサは下図のように接続します。  

- 抵抗値の選定は非常に重要であり、回路の性能に大きな影響を与えます。回路の抵抗の働きは次のとおりです。

**R1、R2、R5、R6：** これらの抵抗はコンパレータのトリップポイントを設定するためのものです。これらの値は入力信号の特性や回路の電源電圧によって変わります。場合によっては、これらの抵抗を完全に除去し、コンパレータの反転入力端子を単にグランドに接続することも可能です。このような場合、この「回路ノート」の2番目の箇条書きにあるように、入力信号をAC結合するのが良いでしょう。これらの抵抗に比較的大きな抵抗値を使用すると、この回路の消費電力が大幅に削減されます。しかし、コンパレータが十分な入力バイアス電流（LM2903では通常20nAほどですが、500nAまで可能）を持つように、抵抗値は十分に小さくする必要があります。

**R3、R4、R7、R8：** これらの抵抗は、コンパレータにヒステリシス特性を持たせるために使用されます。それにより、ノイズ耐性が高まり、ゆっくりと変化する信号を正しくサンプリングすることができます。抵抗値は、必要なヒステリシスの量によって異なります。コンパレータにヒステリシスを追加する詳細については、Analog Devicesの次のアプリケーションノートを参照することをお勧めします。  
[https://www.analog.com/jp/analog-dialogue/articles/curing-comparator-instability-with-hysteresis.html](https://www.analog.com/jp/analog-dialogue/articles/curing-comparator-instability-with-hysteresis.html)  
また、ヒステリシスは入力信号のゼロクロスでコンパレータの出力が正確にトリガされるわけではないため、回路にわずかな誤差が加わることに注意して下さい。

**R9、R10：** これらの抵抗は、コンパレータの出力をマイクロコントローラのI/O電圧に整合させるためのプルアップ抵抗です。上図の回路では、Tiva Cは3.3Vのロジックレベルを使用するため、R9とR10は3.3VのVCCに接続する必要があります。この2つの抵抗の実際の値はさまざまです。コンパレータの出力がローになったときに十分な電圧降下が得られる大きさであるべきですが、コンパレータの出力の遷移時間を大きく劣化させない程度に小さくすることも必要です。R4とR8に選んだ値は、それぞれR9と R10の値にも影響します。

部品表

| 部品 | 説明 | Digi-Key品番 | Digi-Key  
リンク |
| --- | --- | --- | --- |
| U1 | 汎用コンパレータ、8-PDIP | LM2903NGOS-ND | [link](https://www.digikey.jp/ja/products/detail/onsemi/LM2903NG/918484) |
| U2 | XOR（エクスクルーシブオア）IC、4チャンネル、14-PDIP | 296-8375-5-ND | [link](https://www.digikey.jp/ja/products/detail/texas-instruments/SN74HC86N/376842) |
| U3 | TM4C123G LaunchPad™ | 296-35760-ND | [link](https://www.digikey.jp/ja/products/detail/texas-instruments/EK-TM4C123GXL/3996736) |

抵抗値は、測定する信号の種類によって変えることができます。抵抗の選択についての詳細は、上記の回路ノートの項を参照してください。

ソフトウェア  
main.cファイルだけのコピーは、こちらからダウンロードできます。  
Phase\_Offset.c [Phase\_Offset.c](https://forum.digikey.com/uploads/short-url/lrjp7mtCXSdQeuYg2ib9UClecqc.c) (3.9 KB)

上記のmain.cファイルとすべてのドライバを含む完全なCode Composer Studioのワークスペースは、以下からダウンロードすることができます。CCSへのプロジェクトのインポートに関する詳細は、こちらを参照してください。  
[http://processors.wiki.ti.com/index.php/Importing\_Projects\_into\_CCS](http://processors.wiki.ti.com/index.php/Importing_Projects_into_CCS)

[workspace\_Phase\_offset\_v1.zip](https://forum.digikey.com/uploads/short-url/ztzV55E9wCgqwxKXJ9fe207vZr2.zip) (1.4 MB)

❗上記のプログラムでは、すべての周辺機器が3.125MHzに減速されたシステムクロックで実行されています。これは、プログラムを単純化し、分かりやすくするために行われました。しかし、プロセッサ全体をかなり低速で動作させるため、アプリケーションの他の部分の性能を阻害することになり、最適な方法とは言えません。マイクロコントローラによってクロック速度や構成オプションが異なるため、プロセッサとアプリケーションに最適な構成を決定するのはユーザー次第です。

# この方法のデメリット

- 位相オフセットの方向を決定する方法はありません。上図の回路は、180度までの位相オフセットの大きさを示すことができるだけで、波形が進んでいるか遅れているかを判断することはできません。
- この方法はかなり遅いです。コンパレータの応答時間は、コンパレータ入力に十分なオーバードライブ電圧があれば、2MHz弱に達します。しかし、最も一般的な使用例では、入力信号の特性や負荷インピーダンスにより、応答時間が数百KHzに制限されます。さらに、タイマの分解能、システムクロックの速度、コードの効率など、マイクロコントローラに関連するいくつかの要因も、回路の最高速度に制約を課すことがあります。

# 周期が不明な位相オフセットを測定する

[![image](https://global.discourse-cdn.com/digikey/optimized/3X/2/1/21d7440f9fd768ccda01894d0099f79ef9cd7751_2_690x464.jpeg)

](https://global.discourse-cdn.com/digikey/original/3X/2/1/21d7440f9fd768ccda01894d0099f79ef9cd7751.jpeg "image")

### **動作原理**

この回路は、前述の方法の回路とほとんど同じように動作します。しかし、コンパレータの出力の立ち上がりエッジ間の時間を計算することで、基準信号の周期を決定することも可能です。シグナルインテグリティを維持するために、バッファを使用してコンパレータの出力をGPIOピンPD1にインターフェースしています。

この方法は、基準信号の立ち上がりが発生したときのXORの出力を解析することで、被測定信号が基準信号より進んでいるか、遅れているかを判断することができます。基準信号がハイになったときにXORの出力がローになった場合、被測定信号もハイであるため、被測定信号が基準信号より進んでいることを意味します。同様に、基準信号がハイになったときにXORの出力がハイになれば、被測定信号がローになり、従って被測定信号が基準信号より遅れていることを意味します。このプロセスは、以下のオシロスコープの画面に示されています。

![image](https://global.discourse-cdn.com/digikey/original/3X/c/4/c482f4e37baefc27e55728665d8d79cbbccae5f1.png)  
  
**被測定信号が基準信号より進む：** 黄色のトレースはPD1ピンで測定された信号、青色のトレースは  
PC7ピンで測定された信号です。

![image](https://global.discourse-cdn.com/digikey/original/3X/3/8/3822f7327ade2458d9f4f11870045295e4c59e14.png)  
  
**被測定信号が基準信号より遅れる：** 黄色のトレースはPD1ピンで測定された信号、青色のトレースはPC7ピンで測定された信号です。

### **回路ノート、部品表、およびソフトウェア**

回路ノート

- 入力信号がコンパレータのコモンモード電圧範囲を超えないようにすることが非常に重要です。従って、回路を正常に動作させるためには、トランスやクリッピングダイオードを用いて入力信号を調整することが必要になる場合があります。

- 多くの場合、DCブロックコンデンサを使用して入力信号をAC結合するのが良いでしょう。上図の回路で使用する場合、ブロックコンデンサは下図のように接続します。  

- U4は必ずしも全ての場合に必要というわけではありません。しかし、マイクロコントローラのGPIOピンのインピーダンスによって、コンパレータの出力に問題が生じる可能性があることに注意する必要があります。残念ながら、GPIOピンの特性は必ずしも十分にドキュメント化されていないため、これを避けて設計することは困難です。この問題を回避する簡単な方法は、バッファを使用して、コンパレータの出力をGPIOピンに接続することです。

- 抵抗値の選定は非常に重要であり、回路の性能に大きな影響を与えます。回路中の抵抗の働きは次のとおりです。

**R1、R2、R5、R6：** これらの抵抗はコンパレータのトリップポイントを設定するためのものです。これらの値は入力信号の特性や回路の電源電圧によって変わります。場合によっては、これらの抵抗を完全に除去し、コンパレータの反転入力端子を単にグランドに接続することも可能です。このような場合、この「回路ノート」の2番目の箇条書きにあるように、入力信号をACカップリングするのが良いでしょう。これらの抵抗に比較的大きな抵抗値を使用すると、この回路の消費電力が大幅に削減されます。しかし、コンパレータが十分な入力バイアス電流（LM2903では通常20nAほどですが、500nAまで可能）を持つように、抵抗値は十分に小さくする必要があります。

**R3、R4、R7、R8：** これらの抵抗は、コンパレータにヒステリシス特性を持たせるために使用されます。それにより、ノイズ耐性が高まり、ゆっくりと変化する信号を正しくサンプリングすることができます。これらの抵抗値は、必要なヒステリシスの量によって異なります。コンパレータにヒステリシスを追加する詳細については、Analog Devicesの次のアプリケーションノートを参照することをお勧めします。  
[https://www.analog.com/jp/analog-dialogue/articles/curing-comparator-instability-with-hysteresis.html](https://www.analog.com/jp/analog-dialogue/articles/curing-comparator-instability-with-hysteresis.html)  
また、ヒステリシスは入力信号のゼロクロスでコンパレータの出力が正確にトリガされるわけではないため、回路にわずかな誤差が加わることに注意して下さい。

**R9、R10：** これらの抵抗は、コンパレータの出力をマイクロコントローラのI/O電圧に整合させるためのプルアップ抵抗です。上図の回路では、Tiva Cは3.3Vのロジックレベルを使用するため、R9とR10は3.3VのVCCに接続する必要があります。この2つの抵抗の実際の値はさまざまです。コンパレータの出力がローになったときに十分な電圧降下が得られる大きさであるべきですが、コンパレータの出力の遷移時間を大きく劣化させない程度に小さくすることも必要です。R4とR8に選んだ値は、それぞれR9とR10の値にも影響します。

部品表

| 部品 | 説明 | Digi-Key品番 | Digi-Key  
リンク |
| --- | --- | --- | --- |
| U1 | 汎用コンパレータ、8-PDIP | LM2903NGOS-ND | [link](https://www.digikey.jp/ja/products/detail/onsemi/LM2903NG/918484) |
| U2 | XOR（エクスクルーシブオア）IC、4チャンネル、14-PDIP | 296-8375-5-ND | [link](https://www.digikey.jp/ja/products/detail/texas-instruments/SN74HC86N/376842) |
| U3 | TM4C123G LaunchPad™ | 296-35760-ND | [link](https://www.digikey.jp/ja/products/detail/texas-instruments/EK-TM4C123GXL/3996736) |
| U4 | バッファ、非反転プッシュプル出力、20-PDIP | 296-1582-5-ND | [link](https://www.digikey.jp/ja/products/detail/texas-instruments/SN74HC244N/277228) |

抵抗値は、測定する信号の種類によって変えることができます。抵抗の選択についての詳細は、上記の回路ノートの項を参照してください。

ソフトウェア  
main.cファイルだけのコピーは、こちらからダウンロードできます。  
Phase\_Offset\_Period.c [Phase\_Offset\_Period.c](https://forum.digikey.com/uploads/short-url/dwlfW8eYpgQIinZoS8rzua484b6.c) (5.5 KB)

上記のmain.cファイルとすべてのドライバを含む完全なCode Composer Studioのワークスペースは、以下からダウンロードすることができます。CCSへのプロジェクトのインポートに関する詳細は、こちらを参照してください。[http://processors.wiki.ti.com/index.php/Importing\_Projects\_into\_CCS](http://processors.wiki.ti.com/index.php/Importing_Projects_into_CCS)

[workspace\_Phase\_offset\_v2.zip](https://forum.digikey.com/uploads/short-url/pNkHLUGpS1TfCCSuvKEqgk7A2dG.zip) (1.4 MB)

❗上記のプログラムでは、すべての周辺機器が3.125MHzに減速されたシステムクロックで実行されています。これは、プログラムを単純化し、分かりやすくするために行われました。しかし、プロセッサ全体をかなり低速で動作させるため、アプリケーションの他の部分の性能を阻害することになり、最適な方法とは言えません。マイクロコントローラによってクロック速度や構成オプションが異なるため、プロセッサとアプリケーションに最適な構成を決定するのはユーザー次第です。

# この方法のデメリット

- 上記の方法と同様に、この方式もかなり遅いです。コンパレータの応答時間は、コンパレータ入力に十分なオーバードライブ電圧があれば、2MHz弱に達します。しかし、一般的な使用例では、入力信号の特性や負荷インピーダンスにより、応答時間が数百KHzに制限されます。さらに、タイマの分解能、システムクロックの速度、コードの効率など、マイクロコントローラに関連するいくつかの要因も、回路の最高速度に制約を課すことがあります。
- ノイズはこの方式に大きな影響を与える可能性があります。ノイズによってマイコンがエッジの遷移を見逃したり、誤った遷移を検出したりすると、周期と位相オフセットの両方の計算に影響を与え、回路全体として誤った結果を出すことになります。この方法を用いる場合、設計者はコンパレータやXORゲート出力のノイズを減らすか、ソフトウェアで何らかのエラー訂正の方法を実装する必要があります。

## 質問/コメント

ご質問やコメントがあれば、Digi-Keyの[TechForum](https://forum.digikey.com/)をご利用下さい。

 
  
  
  

[オリジナル・ソース（English）](https://forum.digikey.com/t/measuring-phase-offset-using-a-microcontroller/13458)
