JP7FKFの備忘録

ヒトは,忘れる生き物だから.

ACS758を使ってカジュアルに電流計を作った話

電流を測りたくなったのでわりとカジュアルに電流計を作ってみた. 電流を測定するにあたって,使ったのはAllegroのACS758というもので,このうちの,ECB-200Bというモデルのホール効果を利用した電流センサを利用した. こいつは±200Aの電流を測定することができるというわりとスゴい代物.

こいつから10mV/Aの傾きでほぼリニアに測定値を得ることができる. こいつの出力電圧をADコンバータで受け,PICを使ってLCDに表示することにした.

ADコンバータはなるべく分解能の高いものを使いたい.ここで下記のような16bitでI2CなADCを用いてカジュアルに済ませることにした. こいつの特に便利なところは,差動入力が可能なところと,基準電圧内蔵なところである. ECB-200Bは,正負の電流が測定できるのだが,出力電圧にはバイアスがかかっており,そこから上下に電圧が動くことで正負電流を表現している. この動きの測定にADCの差動入力を大いに利用し,負側にECB-200Bの0点電位を与えることで,差動的に見て負の電圧(絶対的に/GND基準では正の電圧である)も上手にADC出力として表すことができ,余計なこと(バイアスを与えたり,ADC後に0点を考慮して値をオフセットしたり)をせずに簡単に出力値を得ることができるのだ.0点調整もボリュームをつけてやることで現場で0点調整を行うことができて,多少静磁場があるところでも0点を調整して測定ができる. MCP3425(16Bit ADC I2C 基準電圧内蔵)搭載モジュール

リファレンス電源内蔵で,I2Cで測定値を得ることができる代物である. これなら普通の8bitADCしか備えていない安物PICをMCUとして用いることができる.

さらにLCDには,これまたI2Cなキャラクタ液晶モジュールを用いる. 電流値を表示するだけなので8x2行で十分である.

I2C接続小型キャラクタLCDモジュール 8x2行

この2つのI2CなデバイスをPICのI2Cポートにバス接続させて動かすことにする.これならGPIOが少ないMCUが利用できる.

f:id:jp7fkf:20180108201338j:plain:w600
(写真は誤って制作中に液晶を割ってしまったときのもの....このあと新しいのに変えました.こいつは割れやすいので気をつけないといけない.)

I2Cで値をとって表示するだけなのでPICのお仕事はほとんどない. なので安物の8pinPICであるPIC12F1822を用いる.

こいつのI2CバスにADCのICと液晶のI2Cラインをぶら下げる.

あとはADCの測定値を整形して出すだけ. 簡単だ.

ケースはタカチの単四x2の電池ボックスがついたものを使った.液晶用の穴と,陸軍端子,スイッチ用の穴を開ける. 陸軍端子と電流センサはできるだけ太い配線で結ぶ.銅板を曲げたりしても良いと思う.

電源電圧は5Vで動かしているので,単4x2だと足りない.なのでステップアップコンバータで簡単に5Vに昇圧する.こいつはカジュアルに昇圧したいときに本当に便利である.何も考えなくてもきちんと電圧を吐いてくれる.ただし電流は200mAまでなのでそこそこ電流を食わせるときには多少の注意は必要である.

PFMステップアップDC/DCコンバーター HT7750A(5個入)

f:id:jp7fkf:20180108201407j:plain:w600

つーわけで,±200Aまで測れる電流計ができた. SANWAのそれなりのテスタで確度をざっくりみてみたけど,いい感じの値を出してくれている. ただし,ホール効果を用いている以上,周りに磁石等があるばあいは値が狂ってくる.強力な磁石を近づけると数十Aオーダーで誤差が出る.一定磁場の中ではキャリブレーション(0点調整)をすればよいが,磁場が変化する場合はこいつでは正確な測定ができないので注意をする必要がある.

なんにせよ,それなりの大きな電流がそれなりの精度で測定できる電流計を作ることができた.電池駆動なので持ち運びもできて小型に収められたので使い勝手が良い.めでたし.

References

MBPにSDカードを挿してストレージ問題を解消する話

わたしのMacBookProはMid2014な13inch retinaなやつ. もうしばらく使ってる.

私はメインPCをデータの倉庫にしてあり,そいつが最新になるように管理している. ラップトップにはそのメインPCからデータをコピーして持ち歩いている. コピーはバックアップを取る時にやるようにしてあり,メインPCで変更されたデータは,バックアップの時にラップトップにコピーされて更新される.それまでは前のデータがラップトップに入っていることになる.どうしても最新のデータが欲しい時はリモートデスクトップやらVPNやらでメインPCにアクセスしてデータを吸い出している.

基本的にデータを作ることよりも参照することの方が多いので,この方式を採用している. するとだんだんデータ量は増えて,ついに256GBなMBPのストレージを圧迫するようになってきた.

メインPCのデータを全てコピーしているわけではなく,持ち歩きたいデータを選別してコピーしているが,そのような状況だった.

macSSDを換装することも考えたが,このモデルはなかなか厳しいようである. 他にはUSB-HDDを持ち歩く方法であったり,小さいタイプのUSBメモリをさしっぱなしにしてストレージとして利用する方法などが考えられたが,私はSDカードのユニットが空いているのが気になって,そこを埋めようかと考えた.USBポートを使いたくないということもある.ただでさえ2ポートしかないのにUSBメモリさしっぱなしにすると1ポートしか使えなくて大変不便だ.

SDカードスロットに差し込むタイプのストレージとして販売されている,TrancendのJet Drive Liteなんてものもあるのだが,なんせこれが高価である.128GBで12000円ほど. 探してみると,SDカードスロットから頭が飛び出ないタイプのmicroSD->SD変換があるらしく,こいつにmicroSDを差し込んで使うことでそれなりに安価にできるのではないかという結論に至った.

ということでコイツらを買ってみた. iSlice Pro 13" MacBook Pro 13インチ Retinaディスプレイモデル (Late2012, Early2013, Mid2014, Early2015) 専用 microSDカードアダプター シルバー EAD-303ASV
Samsung microSDXCカード 128GB EVO Plus Class10 UHS-I U3対応 (最大読出速度100MB/s:最大書込速度90MB/s) Nintendo Switch 動作確認済 MB-MC128GA/ECO

f:id:jp7fkf:20171216154554j:plain:w600
f:id:jp7fkf:20171216154621j:plain:w600
f:id:jp7fkf:20171216154636j:plain:w600

値段は...JetDriveLiteと比べて大して変わらないかも...と思う.でも少し安い.さらに,microSDの容量を変えたく鳴った時に気軽に変えることができるし,もしこのmacを使わなくなったとしてもデジタルカメラ等でmicroSDを継続して利用できるメリットもある.なかなか良いと思う.

ということで,ストレージが圧迫することもなくなり,ストレージのことを気にして使う必要も無くなってすこぶる快適.まだこのMBPに頑張ってもらおうと思う.私はこのマシンに愛着があるし使いやすくて好きであるから.

勉強って難しいよねって言う話

ただ考えたことを書き殴る.読み手のことは考えていない.

勉強は2段階か3段階必要な気がする.ひとつはきっかけを作り,知る勉強.
そしてそれを確かめる勉強.確かめて自信になったものが自分のものとなる.

勉強することって難しいなって思った.

そもそも勉強ってなにさということにもなるしなんだこの哲学的な感じは.

いわゆる普通のお勉強って,いくつかの段階に分かれてる気がする.

  1. 知らないことを知るということ.
    無知の知ってやつなんだろうか

  2. 知らないことを知ったときにそれを知ること.
    知らないことを知りたいって思う好奇心みたいなものであったり,ある程度貪欲な姿勢だったり,知らないことに心を惹かれるかとか. そういう動機から,自分で自主的に知りたいから知ろうとしているか,それを実行して実際に知ることができたかとか,理解できたかとか.

  3. 知ったことを確かめるお勉強
    知ろうとして知ったことが本当に正しいかどうか.複数の情報源で確かめたかとか,実験してみたかとか.

  4. 人にある程度の自身を持って教えることができるかどうか.
    これくらいできるようになると,自分がきちんと知って,理解できたなっていうことだと思う. 「学びというのは人に教えることで成就する」ということばをもらったことがある.
    今は,この考え方で生きている.

こういったことを経て,やっと自分で身についた/理解したなって思うことが多いかなと感じている.それだけ.

System workbench for STM32の.runインストーラからのインストール方法 on macOS

前にSW4STM32の.runでのインストールでつまずいて結局jarで入れたとか書いたけど,ちゃんとinstruction読んだらrunですんなりできたので報告.

Installing on MAC OSX

Warning: To run System Workbench for STM32 on MAC OSX systems, XCode is required. To download it, please refer to the Apple developper website (registration as Apple Developer is required).
The downloaded installer is an executable binary file. Your web browser might have removed the execution right of the file. Please set the execution right to the installer file (chmod 755 install_sw4stm32.run then ./install_sw4stm32.run) Launch it with /bin/bash (/bin/bash install_sw4stm32.run)

ということで

$ chmod 755 [.runファイル]
$ /bin/bash [.runファイル]

あとはウィンドウが出てくるので,適切にNEXTとかAGREEとかやってFINISH.

できちんとできてしまうのでした.取説読め案件である.

テクトロニクスのオシロスコープTDS3012Bを修理する話

テクトロニクスのオシロスコープヤフオクで入手した.
DPOなTDS3012Bである.
帯域100MHzの2ch入力品.

一応起動することは確認されて販売されていたが,到着して開封して操作して見ると,HORIZONTAL(時間軸)のつまみがおかしい.何やらどちらに回しても10sec/div等になってしまって思うように操作ができない.うまいこと操作すると(タイミングとか運による),時間軸が拡大されることもあるが,これではストレスが溜まってしまってダメである. なんとか自分で治すことができないかとチャレンジしてみた.

まずは筐体を分解する. コンセントを抜いて,まずは取っ手を外していく.マイナスドライバーで横のカバーを開けるとこんな感じ. f:id:jp7fkf:20171214140128j:plain

中央のトルクスネジを外して,左下の周り止めピンをラジオペンチ等で抜く. すると白い部品が外れてその奥の黒いパーツが回るようになる.これを抜ける位置まで回して引き抜くと取っ手が外れる.これを左右両方やる.この黒いパーツがカバーの固定も兼ねているので,これを引き抜くと外側のカバーも外せるようになる.

背面パラレルポートの下のトルクスネジを外し,コミュニケーションモジュールも取り外す. そうすると背面のカバーがすっぽりとはずれる. f:id:jp7fkf:20171214140157j:plain

勘で分解していく.まずはFDユニットを取り外す. 電源モジュールまわりのトルクスネジを外し,モジュールと接続されているコネクタを全て抜いて取り外す.フレキもあるので慎重に. するとメイン基板が見えてくる. f:id:jp7fkf:20171214140223j:plain

正面付近にあるIF基板にアクセスするためにさらに分解を進める.

液晶との接続ケーブルを慎重に外してIFパネルとのケーブルも外す. 左下の入力モジュールの部分にもトルクスネジが隠れているので忘れずに外す. f:id:jp7fkf:20171214140757j:plain

メイン基板の裏はこんなかんじ.すごい. f:id:jp7fkf:20171214140336j:plain

メイン基板が外れたところ. f:id:jp7fkf:20171214140358j:plain さらに液晶モジュールを外す. シールドと一緒になっているので注意. ここはタッピングで止まっているらしい.

そうするとIFボードが見える. f:id:jp7fkf:20171214140422j:plain このIFボードに異常があるはずだ. 正面から見て右側のコントロールパネル部と左側のボタンユニット. f:id:jp7fkf:20171214140442j:plain
f:id:jp7fkf:20171214140453j:plain
f:id:jp7fkf:20171214140526j:plain

ロータリーエンコーダのはんだ当て直し,チップまでの配線の確認とチップへのはんだ当て直し等行ったが改善せず.信号ラインに問題があるのかと紫のケーブルをチェックしたが問題なし.途中のトランジスタが死んでいるのかと検討をつけたがどうも正常のようだった.最終的にはロータリーエンコーダのチャタリングと推測した.しかしながらこのロータリーエンコーダはそう簡単に手に入るものではないように思えた.よって今回はロータリーエンコーダの信号線とGNDの間にチップセラミックコンデンサを追加しバイパスコンデンサとして動作させ,チャタリングを抑えるような対策を行った. f:id:jp7fkf:20171214140621j:plain この対策の結果,ロータリーエンコーダは正常動作するようになり,HORIOZONTAL軸が思い通りに動かせるようになった.

各種ボタン部分の洗浄等も行い,綺麗に元どおりにした. これできちんと動作するオシロスコープになった.めでたし. f:id:jp7fkf:20171214140640j:plain

STM32/CubeMX/SW4STM32/ST-Linkv2(nucleo)でLチカする話

前回の記事でmacでのSTMマイコンの開発環境構築までを行った.
macでstm32な環境をとりあえず作る

今回は,構築した開発環境でプロジェクトを作成してプログラムを書き,プログラマ(ST-LINKv2)を利用してマイコンチップにプログラムの書き込みを行い,Lチカを動作させるところまでを紹介しようと思う.

前回の最後でDFUでの書き込みを行いたいと述べたが,ST-LINKを使った方が簡単だったので,まずはそちらの手法を述べたいと思う.

STM32CubeMXでコードを生成する

STMマイコンのプログラムを書くにあたって,ペリフェラルまわりの設定を簡単に行えて,それをコードとして吐き出してくれるのがこのSTM32CodeMXである.これを使うと初期設定がとても楽に行えるので,まずはこれで使うペリフェラルの設定を行う.

STM32CodeMXを開いて,New Projectを選択. f:id:jp7fkf:20171214090035p:plain

するとMCUを選択する画面が現れる.今回は秋月でも手に入る,STM32F042K6T6を利用する.PartNumberSearchから型番を選び,チップを選択してプロジェクトを作成する. f:id:jp7fkf:20171214090049p:plain f:id:jp7fkf:20171214090101p:plain

するとPinOutの画面が出る. 左側にはペリフェラルが並んでおり,使いたいペリフェラルがある場合はここで選択して欲しいペリフェラルを有効にする.すると右側のPinOutの画面にも出力/入力ピン等が反映されるようになっている. f:id:jp7fkf:20171214090117p:plain ここではLチカに最低限必要な設定を行う. 適当なGPIPピンを選択してGPIO_OutPutを選択する. すでに色が変化しているところは何かの機能がすでに予約されているピンなので注意する. f:id:jp7fkf:20171214093308p:plain すると選択したピンはGPIO_OutPutとして設定され,ピンの色が緑色に変化する. さらに,ピンの名前はピンを右クリックし,EnterUserLabelから自由に変更することが可能である. f:id:jp7fkf:20171214093415p:plain f:id:jp7fkf:20171214090301p:plain

次にMCUを動かすクロックの設定を行う. Clock Configurationタブをクリックしてクロックに関する設定を行う. f:id:jp7fkf:20171214090401p:plain 問題がなければそのままの設定で動作する. ペリフェラルによってはクロックの設定が誤っていると動作しないものがあるが,このソフトウェアはそのような状況の場合は警告を出し,自動で訂正する機能が備えてある. 今回は内臓クロック48MHzで動作させる.他にもConfigurationタブ等でペリフェラルの詳細設定ができるが,今回は行わない.参考までにUSBでDFUモードとして動作させる時はconfigurationタブでこんな設定をすれば良さそうである. f:id:jp7fkf:20171214090525p:plain

ここまでできたら,Generate Codeアイコンをクリックしてコードを生成するが,初回はsetting画面が出る. ToolChain/IDEは,System Workbench for STM32を使う場合はSW4STM32を選択する.
(出てこなかったらProject->Settingsを開いて設定する) f:id:jp7fkf:20171214090720p:plain OKをクリックするとコードが生成される. これで基本的なコードの生成は完了だ.

WorkbenchでSTM32CubeMXで生成されたコードを開いてLチカコードを挿入!

ここからは,STM32CubeMXで生成したコードをSystem Workbench for STM32で読み込んでプログラムを記述する過程を紹介する. まずは先ほどCubeMXで生成したコードをインポートする. インポートは下記のofficialのサイトが説明をしてくれているので参照する.
OpenSTM32 Community Site | Importing a STCubeMX generated project

Fileからimportを選択する. Existing Projects into Workspaceを選択して,先ほど生成したコードのディレクトリの該当ファイルをopenする. f:id:jp7fkf:20171214090900p:plain

するとimportされ,Src->main.cを見るとこのようになっている. これらがCubeMXで生成されたコードになる. f:id:jp7fkf:20171214090924p:plain

/* USER CODE BEGIN 〜 */

/* USER CODE END 〜 */

という範囲があるがこのBEGINとENDの中にコードを記述していく. この範囲に記述することで,あとでCubeMXに戻って再度ペリフェラル等の設定を変更してCode Generate を再度行っても,この範囲にあるコードは変更されずに残り,ペリフェラルの初期化コード等がキチンと追加されるようになっている.つまりこの範囲外に書いたコードは再びCode Generate すると消えてしまうことになるので注意する.

ここでコードを一瞥してもらうと,下の方にGPIOのinitがあり,先ほど定義したRED_LED等が見える. f:id:jp7fkf:20171214091011p:plain

これらのGPIOを繰り返しON/OFFするコードを追加しよう.

mainループのwhile内に,

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

という記述があるが,この/* USER CODE BEGIN 3 */の下に

HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);
HAL_GPIO_TogglePin(GPIOF, RED_LED_Pin);
HAL_Delay(1000);

を追加しよう. f:id:jp7fkf:20171214091048p:plain

これらメソッドは,HAL Driverを使ってMCUのGPIOとDelayを制御するメソッドである. STM32CubeMXをつかうと自動的にHALなコードが生成され,以前のStdPeriphではなく,HALを使ってコードを書いていくことになるらしい.StdPeriphと比べ,HALは抽象化されており,よりオブジェクト指向的な要素が強いようである.これからの開発にはHALを用いることが推奨されているようなので,今回はHALを用いて書いていく.

HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_0);

はGPIOFのGPIO_PIN_0のOUTPUTを反転させるメソッドである. この辺りの引数に何を入れるかは,先ほど見たMX_GPIO_Initメソッドを覗くことで理解できると思うので割愛する. ピン名には先ほどCubeMXで自分が変更したRED_LEDというPinもLED_RED_Pinという形で指定することができるようだ.

ここまで終了したらBuildをする. とんかちのアイコンをクリックすることでBuildできる. 正しくBuildされるとプロジェクトツリーにBinariesの下に.elfという拡張子でバイナリファイルが生成されているはずである.こいつを次のセクションでMCUに書き込む.

書き込み!

ST-LINKv2をつくる

書き込みをするにあたってwriterを必要とする. 今回はST-LINKv2を使って書き込みを行っていこうと思うが,この書き込み機を買うと結構なお値段となる.今回はSWD方式での書き込みをやっていこうと思うが,SWD方式の書き込み機であれば秋月でも手に入るnucleo boardという開発ボードの一部がこの書き込み機となっており,分離して使用することができる.お値段的にもこちらのほうがリーズナブルなので,今回はこちらのnucleo boardの書き込み機部分(ST-LINKv2部分)を分離して書き込み機に変身させる. とはいっても作業はものすごく簡単で,パキッと折るだけである. 作業自体は下記の記事を参考にすると良いと思う.

NucleoとかいうST-LinkをFRISKケースに入れる - STM32 - Tokoro's Tech-Note
STM32に手を出してみた

あとはピンヘッダ等が邪魔なので取り除く. ジャンパピン部分はジャンパする必要は特にない. CN4という左側の6本のピンヘッダがMCUと接続するピンとなっているので,書き込み機として使いやすいようなコネクタ等に付け替えておくと便利だ. 私は普通のピンヘッダのメスを横につけており,そこからオスオスの延長ケーブル経由で書き込んだりということもできるようにしてある.なかなか便利だ. f:id:jp7fkf:20171214092704j:plain f:id:jp7fkf:20171214092727j:plain 書き込み機の準備はこれで完了である.

チップに配線!

ST-LINKのCN4は上(1番ピン)から下記のようなピンアサインとなっている.

Pin No. Name
1 VDD_TARGET
2 SWCLK
3 GND
4 SWDIO
5 NRST
6 SWO

これらをチップの適切な端子に接続する. 接続するピンに関してはデータシートを参照する.

電源ライン,およびBOOT0ピンの配線も行う. BOOT0ピンはGNDレベルにすることでFlashからロードするモードとなるので,今回はGNDに落とす.

いよいよ書く!

書き込むにはデバイスにあらかじめ3.3Vの電源を供給しておく必要がある.これを忘れると書き込み時にWrong Device Detectedと言われて書き込むことができない.

書き込みを実行するにあたり,Debugのconfigurationを行う. Run -> Debug Configurations を選択し,Ac6 STM32 Debuggingにプロジェクトが設定されていることを確認する.DebugをクリックするとBuildされ,書き込まれる. なお上部のバーの虫のアイコン(BUGだ)でも同様のことができる. f:id:jp7fkf:20171214091450p:plain 書き込みするときのコンソールはこんな感じ.

Open On-Chip Debugger 0.10.0-dev-00275-gd486ac2-dirty (2017-03-06-15:17)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
srst_only separate srst_nogate srst_open_drain connect_assert_srst
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v23 API v2 M v10 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 0.007890
Error: target voltage may be too low for reliable debugging
Info : STM32F042K6Tx.cpu: hardware has 4 breakpoints, 2 watchpoints
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
adapter speed: 950 kHz
STM32F042K6Tx.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0xc1000000 pc: 0x08000e74 msp: 0x20001800
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
adapter speed: 4000 kHz
** Programming Started **
auto erase enabled
Info : device id = 0x10006445
Info : flash size = 32kbytes
STM32F042K6Tx.cpu: target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20001800
wrote 5120 bytes from file Debug/led_test.elf in 0.310023s (16.128 KiB/s)
** Programming Finished **
** Verify Started **
STM32F042K6Tx.cpu: target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20001800
verified 4612 bytes in 0.047620s (94.580 KiB/s)
** Verified OK **
** Resetting Target **
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
adapter speed: 950 kHz
shutdown command invoked

きちんとSTLINKv2として認識されて書き込みとVerifyができた. 正しく書き込めるとnucleoなST-LINKv2のLEDが緑色に光るようだ. 書き込み機をマイコンから外して,電源ON/OFFまたはリセットをしてもきちんと動く.

f:id:jp7fkf:20171214092958j:plain

これでLチカまで到達できた. Lチカができたということは開発の一通りの流れが理解できたということなので,ここまでくればこっちのものである.あとは自由にペリフェラルを追加して自分の思うままにコードを書くだけだ.めでたし.

ちなみに種々のペリフェラルに関しては下記の記事がとても参考になる. CubeHALでSTM32を使うお勉強 : しろうさぎのblog

References

TDR測定用のパルス生成器を作ってみた話

TDRって.

TDRとはTime Domain Reflectometryの略で,TDR測定というものは,時間領域反射測定ということになる.これで何をしようかというと,ケーブル類の障害点などがわかったりするのだ.なぜそのようなことができるのかというと,ケーブル類にパルス状の電気信号を入力すると,ケーブル内を伝搬する.ここで単一のインピーダンスを持つ同軸ケーブル内で障害があると,インピーダンスが不連続になったりする.このインピーダンス不連続点で,入力したパルスの信号の反射が起こる.この反射を検知し,入力したパルスと反射して戻ってきたパルスの時間差と,ケーブルの速度係数等を用いると,入射端から障害点(インピーダンス不連続点)までのケーブルの長さを求めることができる.

これは実際の通信の現場でも用いられており,例えば世界中に張り巡らされている光ファイバーがあるが,光ファイバーの障害を検知するためにこのTDRが用いられている.これはOTDR(Optical Time Domain Reflectometry)と呼ばれており,電気信号の代わりに,光を入射しその波形をモニタすることで,反射減衰量や,光損失,長さの測定ができるというものである.銅や樹脂で構成されている同軸ケーブル等でも,同じような測定が可能である.

今回は同軸ケーブル等の測定が行える,電気信号のパルスを出力するパルス生成器を製作してみた.

参考にしたのはこの記事である.
Nano Sec Pulser for TDR Measurement: アナログ回路のおもちゃ箱
この記事をもとに,回路図のトポロジはほぼ変えずに作った. 使ったものは,パルス発振器NE555,4回路入りコンパレータNJM2901,ANDゲート74HC08である.これは手近な部品を漁った結果,上記の記事にあるような高速コンパレータ等を用意できなかったことがある.とりあえず手近な部品で作ってみたという感じである. ただ,一つコンパレータの遅延用の抵抗値を変更している.少々高い抵抗に変更をしたので,立ち上がり時間が遅くなる原因になっているかもしれない.ちなみに,このパルス生成機で重要なのは立ち上がりが素早いことなのである.これにより分解能が上がり,より正確に距離を求めることができる.あと,使ったこのコンパレータはオープンコレクタ仕様になっていることに組み上げた後に気づいて発狂した.適当に出力ポートを抵抗を介して電源に接続してプルアップしておいた.

完成したモノはこんな感じ. f:id:jp7fkf:20171110171303j:plain
f:id:jp7fkf:20171110171335j:plain
電源供給用のDCコネクタ,電源SWとLED,出力用のBNCコネクタをケースに取り付け,内部の回路は適当にユニ基盤に実装してホッドメルトで固定している. これで測定を行うとこのような感じになる.
f:id:jp7fkf:20171110171518j:plain
一つ目のパルスと二つ目のパルスが見て取れると思う.この間隔を読み取ると約nsである.この測定したケーブルは1.5mのRG316のSMAケーブルをSMA-JJで2連結したものであり,末端は解放となっている.このRG316ケーブルの速度係数は0.7らしい.
パルス間隔は読み取ると約30nsであるから,これをもとに計算を行うと
length[m] = cvt/2
(ここで,c: 光速[m/s], v: 速度係数, t:遅延時間[s]である.)
から,
0.2998 * 0.7 * 30 / 2 = 3.1479[m]
ということで,BNCの変換ケーブルやら,SMA-JJの長さ等を考えると,ある程度の誤差がありつつも,大体のケーブル長が求められたと思う.

このように,インピーダンスの不連続点が電気的な測定で求めることができるのである. 例えば特性インピーダンス50Ωの同軸ケーブルの先に75Ωの特性インピーダンス同軸ケーブルを接続したりすると,合計3つのパルスが得られ,接続点で振幅が変化したりする.ちなみに末端をショートすると,振幅が逆になったパルスが帰ってくる.これは反射係数が1から-1までであり,ショート状態の場合は反射係数が-1となり,信号の符号が逆転するということを端的に表しているわかりやすい例だと思う.

という感じで,パルス生成器を作って,TDR測定ができることが確認できました.同軸が怪しかったりしたらこいつで測定して修理の目安になったりしてよさそうです.

References