離れた場所の〇〇が測りたい その1 V-Fコンバータ
(※)2018/09/01 タイトルを「離れた場所の電圧が測りたい」から「離れた場所の〇〇が測りたい」に変更しました。
ArduinoにはA-Dコンバータが内蔵されているので、Arduinoの近くであれば、簡単に電圧が測定できます。測定点と距離が離れると、導線の抵抗やノイズの影響で誤差が増えます。外付けのA-Dコンバータを使っても、ディジタル・インターフェースがI2CやSPIでは距離を取れません。調歩同期式シリアルのUARTインターフェースならTTLレベルでも数mの距離を延ばせるかもしれません。
工業計器では、測定点からノイズにも強く長距離伝送ができる「4~20mA電流ループ」が使われます。このインターフェース自体が高価なので、電子工作で使われているのはほとんど見ません。もう一つ、V-Fコンバータの利用が便利です。電圧-周波数変換器で、変換後の信号は3.3Vや5Vのロジック・レベルで低速なので、長距離の伝送で信号の劣化はわずかです。ここでは、マイクロチップ TC9400を搭載したMikroElektronikaのV to Hz click(MIKROE-2889)ボードを利用します。
●V to Hz clickボードのおもなスペック
入力電圧0~5Vを0~10kHzに変換します。TC9400は12Vで動作するので、5->12V昇圧デバイスMIC2605をボード上に搭載していて、EN端子を3.3Vにすると有効になります。ボードの電源電圧は5Vで出力信号のレベルは3.3Vです。
●接続
●スケッチ
周波数を測定する専用のライブラリがあります。Arduino UNOのマイコンのタイマを直接利用したカウンタです。ライブラリFreqCounter_1_12.zipをダウンロードし、ライブラリに組み込みます。入力は5番ピンです。
サンプルのスケッチです。
#include <FreqCounter.h>
void setup() {
Serial.begin(9600); // connect to the serial port
Serial.println("Frequency Counter");
}
long int frq;
void loop() {
FreqCounter::f_comp= 8; // Set compensation to 12
FreqCounter::start(100); // Start counting with gatetime of 100ms
while (FreqCounter::f_ready == 0) // wait until counter ready
frq=FreqCounter::f_freq; // read result
Serial.println(frq); // print result
delay(20);
}
実行結果です。kHzの100倍した数値が表示されました。
●キャリブレート
V to Hz clickボードは、10mVで10Hz、5Vで10kHzになるように、二つの半固定抵抗を回して校正します。
電圧発生器のTR6142で10.00mVを出力し、10.353Hzに合わせました。多回転の半固定抵抗ですが、10.0Hzちょうどにはできませんでした。周波数はDSOX3012Tの測定機能で測りました。
5.00226Vを実験用電源で発生させ、10kHzに合わせようとしましたが、半固定をどのように回しても設定できませんでした。とりあえず、7.758kHzにしました。もう一つの出力端子では逆に14kHz付近より下がりませんでした。使い方が間違っているのかもしれません。
Analog Discovery2を使ってもう一度校正します。しかし、電圧と周波数の関係が異なっていて、何が正しいかわからない状態です。V-Fコンバータの入力インピーダンスが高いのが原因かもしれません。
Analog Discovery2の電圧発生器で500mVを出します。DMMで699mVだったので、オフセット調整半固定抵抗を回して699Hzに合わせました。電圧発生器で5.0V、DMM実測で5.20Vは7.596kHzでした。
次の画面は、電圧発生器と周波数を測定しているオシロスコープです。
エクセルに測定値を入力して近似直線を求めると、次の式が導かれました。xは周波数、yは電圧です。
y = 0.6526x + 0.2428 |
この式をスケッチに加えました。
#include <FreqCounter.h>
void setup() {
Serial.begin(9600); // connect to the serial port
Serial.println("Frequency Counter");
}
long int frq;
void loop() {
FreqCounter::f_comp = 8; // Set compensation to 12
FreqCounter::start(100); // Start counting with gatetime of 100ms
while (FreqCounter::f_ready == 0); // wait until counter ready
frq = FreqCounter::f_freq; // read result
float Volts = (frq/100.0) * 0.6526 + 0.2428 ;
Serial.println(String(frq/100.0)+"kHz "+String(Volts)+"V"); // print result
delay(1000);
}
実行結果です。5V以下の電圧を発生しDMMの表示と比較しても、小数点第2位までは正しい値でした。
DMMと2種類の任意な電圧の発生器があれば校正でき、利用できることがわかりました。MikroElektronikaのボードはたくさんの種類があります。