● 実験テーマ56
「PIC32MX_簡易6CHロジアナ_V1の製作」
(新たにユニバーサル基板を製作し、ケーシングまで含め、使えるようにしました。)
※ 160224: ソフトを更新しました。(Easy_6CH_LogAna_V1.c→ Easy_6CH_LogAna_V1a.c)
→ HOLD中の波形及び、SINGLEトリガでトリガが検出された時の波形に対し
拡大表示が出来るようにしました。
詳細は、2016.2.15からの記事を参照してください。
※ 171014: ハード+ソフトを更新しました。(Easy_6CH_LogAna_V1a.c→ Easy_6CH_LogAna_V2.c)
→ PIC32MX340Fファミリ(Fcy=80MHz)でも、新ファミリ370Fでの6chロジアナ機能追加(実験テーマ96を参照のこと)
+0.8uサンプルが可能か確かめてみました。→ 結果OKでした。
※ 詳細は、2017.10. 12の記事を参照してください。
■ 2014.8.7
・本番ハードは、新規に、ユニバーサル基板で作るので、次の点を変更しようと思う。
@ 波形整形と、PICの保護のために、ロジック入力に、8素子バッファIC:74HC541を追加
A 未接続入力のレベルを安定させるため、100kΩのプルダウン抵抗を追加
B サンプル周期に、400uS(20mS/D)と、1.0mS(50mS/D)を追加
C SW類のプルアップを、全て、PICの内部プルアップに変更
・回路図作成の前に、主要な部品から決めてみる。
まず、ロジアナ・プローブらしくしたいが、いわゆる、グラバー・クリップ(ICクリップ)は、
高価(秋月で、10色セット20個入りが、2000円なり)なので、いつも使っている安価な、タイプの
ICクリップ(秋月: MT-248-*(赤・緑・黄・シアン・黒の各色) 単価:50円)を使うことにした。
ただ、黒は、ミノ虫クリップにするので、赤・緑・黄・シアンの、4色しか揃えられない。
しょうがないので、橙と、青(5,6CH)は、マルツの白色のICクリップを使い、それにカラーラベル
で識別ができるようにした。
ロジック入力コネクタは、ライトアングルタイプのナイロンコネクタのイメージで探してみた。
まあ、この手のタイプは、ハウジングとコンタクトが別になっているので、割高になってしまうが・・
これに関しては、マルツで偶然安売り(現品限り品)していた、タイコエレクトロニクスの
EIL7P(オス・メス・コンタクト7個セット)を、185円で手に入れることができた。
■ 2014.8.8
・ケーシング構造を検討してみた。
いつものアクリル板+スタッド構成にする。
ただ、操作部は、1枚の、小基板に一括実装し、メイン基板とスタックコネクタ接続することにした。
そうすることによって、丁度良い、高さになり、操作性が向上する。
また、タクトSWに、正方形サイズ(10*10)のものを使えば、3個のSWを隙間なく並べられるので
外観的にもスマートになる。
そのタクトSWには、以前、PIC32MX_MP3プレーヤにも使った、秋月の、P-03654を使うことにした。
LED内蔵タイプもあるが、デザイン面で好ましくないので、LEDは別に付けることにした。
■ 2014.8.10
・部品が、ほぼ決まったので、水魚堂にて回路図を作成した。
■ 2014.8.11
・部品全て手配済
今回も、PIC32MXの、Q064基板への実装は、マルツへ依頼をかけた。
■ 2014.8.12
・秋月分のパーツが到着した。
ここで、操作部の、部品を、加工前の小基板に並べて、ざっと感じを見てみた。
まあ、こんなものか・・
■ 2014.8.14〜 2014.8.17
・パーツが、QFP064以外、全て揃ったので、基板類の加工と、アクリル板の加工を行い
仮組みをしてみた。
■ 2014.8.18〜 2014.8.19
・PIC32MX(Q064)の実装を除き、全て実装が完了し、電源チェックも済ませた。
また本番ソフトの整備〜 HEXまで準備できた。
尚、基板サイズは、106 x 91mmと結構なスモールサイズになりました。(まあ、アナログ部が無いので当然か・・・)
後は、PIC32MX(Q064)の実装上がり待ちとなった。
■ 2014.8.22
・PIC32MXの、ダイセン電子:Q064基板への実装がマルツより上がってきた。
早速、メイン基板へハンダ実装した。
・ここで、カラーQVGA液晶を取付ける段になって初めて、取付け状態で
74HC541の表面と、QVGAの、SDカードスロット表面の、隙間が殆どないことに気が付いた。
丁度、面一といったところ。
まあ、SDカードスロットは未使用で、配線もしてないので、このままでも特に問題はないのだが、
QVGAを固定している、L=10mmのスタッドの高さ調整として入れている、0.5tの平ワッシャを
もう一枚入れて、隙間を確保するようにした。(何時もは、計2枚のところ、3枚入れた)
・この状態で、HEX書込みOK!!
電源電圧を確認
5V→ 5.20V
3.3V→ 3.26V
NORMALモード、入力オープンの状態で電源を入れると、液晶画面上に
「Waiting for trigger」と表示され、トリガ入力待ちとなっているし、新たに追加したサンプル周期
の、400uSと、1.0mSも、ちゃんと切替えられているようなので、大方、動いているようである。
・予め加工を済ませておいた、前後アクリル板を取付け、サンプル波形取りを行った。
その時の様子は、このページ頭の写真を参照してください。
---<ここから、追試:「拡大表示」追加の記事>-------------------------------------
■ 2016.2.15
・以前から、HOLD中に拡大表示が出来るようにしてみたいと思っていたが、敷居が高そうなので
なかなか着手出来ずにいた。
参考になるサイトの記事も見当たらないので、今迄書いた私のソースをベースに考えてゆくしかない。
しかし全く拠り所が無いわけではない。
これを試す以前に、実験テーマ74のオシロで、時間軸を拡大しての表示を試している。(2016.2.5)
現状の最速レンジ:10uS/D(サンプル周期= 0.25uS)に、5uS/Dと、
2.5uS/Dを追加してみた。
ハード的な制限から、0.25uSが最大の、サンプル周期になるので、表示分解能は低下するが、
X軸(時間軸)を、ソフト的に拡大して波形表示した。
結果的に拡大表示が出来ることを確認できた。
しかし、実際に表示分解能が落ちた波形表示を見ると、これを使う気にはなれなかった。
まあ、5uS/Dは、まだ良いが、2.5uS/Dは使えない。
元々のQVGAの分解能が、X方向:320dotと少ないので無理があるようだ。
なのでオシロでの拡大表示は却下することにした。(詳細はHP未公開)
以下にオシロでの拡大表示例を示した。
・しかしロジアナでは、Hi, Low,
立上りエッジ、立下りエッジの表示しかしないので、ソフトで時間軸(X軸)を
拡大して表示させても表示分解能の影響はない。
なので基本的な考えはオシロの時と同じでよいはずである。
そう考えたらロジアナでも拡大表示が出来そうな気がしてきたので、早速拡大表示の仕様から考えて
みることにした。
次のような仕様にした。
<拡大表示仕様>
@ HOLD中の波形及び、SINGLEトリガでトリガが検出された時の波形に対し拡大表示が可能。
A 通常時に使っている、トリガ・スロープ切替SW(SLOPE
SW)を、拡大率選択SW(MAG SW)
として兼用する。(ハードの変更は無し。)
拡大率は、MAG SWを押す毎に、x1, x2, x5, x10 の4種類を選択可能。
通常モードから、拡大モードに移ると、まず何かしらの波形をホールドしている。
この状態から、MAG SWを押すと、押す毎に、x2→
x5→ x10→ x1 を繰返しそれぞれの
倍率で拡大表示する。
B その拡大率を、画面左隅に表示する。(ただし通常時の画面には、x1は表示しない。)
尚、時間軸レンジ表示は等倍表示の時のレンジのままとし変えない。
例えば、等倍で、50uS/Dの時に、倍率を、x2にした時は、読み値は、半分の25uS/D
と読むことで対応する。
・まずは、HOLD中の波形に対する拡大表示に限って、ソフトを考えて行くことにした。
■ 2016.2.16〜 2016.2.22
・2月22日の時点で、何とか、HOLD中の拡大表示までは、上手く行った。
以下に、いろいろ修正(苦労)した点を列記してみた。
@ 最初、拡大表示時の、エッジ検知後にレベル検知した場合のレベル描画の座標がずれて
ラインが途切れる症状が出た。
<対策>
・プログラムの流れ上、無条件で拡大表示の場合、MAGメイン関数で、Xpos=
Xpos+mag(magは拡大率)
としているが、これは、レベルが連続している場合は良いが、エッジ検知後にレベルを検知した
場合、+magした点が始点になるため、mag分のブランクが生ずる。
これを無くすため、ライン描画関数の引数の方で、Xpos-magを始点とし、Xpos+magを終点とするように
補正した。
A @の対策は、CH1のみのループでは問題ないが、全チャンネルをループさせると同じような現象が
ぶり返す。
<対策>
・エッジ検知した時のフラグ(edg_flag)を1つで全体を操作していたので、CH毎にフラグを用意し、CH毎に
拡大表示関数を分けて書いたら、うまく行った。
(ただこれだと6つサブ関数が必要になるので効率よい書き方とは言えない。後日、1つの関数で書き直した。)
B Aの対策でも、細かい所で不具合が出た。
B-1:電源ONから、HOLDモードに入り、何回も拡大率を変えながら拡大表示させると、時々画面クリア
の時にいくつかのCHで、右画面隅にドットが残ってしまうことがあった。
<対策>
・6CH分の表示終了後、全CHの、edg_flagをリセットすることで解決した。
B-2:HOLDモードから一旦抜けて、再度、拡大表示をひつっこくやっていると、エッジ描画が、2〜3重に
になることがあった。
<対策>
・HOLDモードを抜けた後にも、全CHの、edg_flagをリセットを追加することで解決した。
■ 2016.2.23〜 2016.2.25
・2月25日の時点で、SINGLEモードでの拡大表示もうまく行ったが、順調には事は進まなかった。
まず、23日に、HOLDモードでの拡大表示サンプルを取ってみた。
この時はもう動作OKと思って気が付かなかったが、24日から、SINGLEモードでの拡大表示
をやっている時に、ある不具合に気が付いた。
→ 拡大表示モードの時に、MAG SWを押す毎に、スロープ表示が立下り表示→ 立上がり表示と
いう具合にトグルに変化してしまっていた。
上のサンプル例の写真をよく見ると、立下りトリガなのに拡大表示は、立上り表示になってNGです。
→ これは拡大モードの時は、MAG SW(SLOPE兼用)をメインで、レベル検知で見ているのはよいの
のだが、同時にCN割込みも入ってしまうためで、CN割り込み中で、hold_statusと、ready_status
が共にセットされている時は、割込みでの、SLOPE SWの読込みはパスするように修正で解決した。
・以下に、HOLD中の波形に対する拡大表示例を示しました。
・24日に、SINGLEモードでの、拡大表示を考えた。
まずは、自分の考えたプログラムだが、再度フローを整理してみて、どのループに拡大処理を入れれば
よいかを検討してみた。
SINGLEモードの流れは以下である。
@ SINGLEモードになると、まず、ready_status= 1にして、レディ待ちループに入る。
A レディ待ち状態にて、READY SWを押すと、READY
flag= 1にする。
B そうするとループを抜け、512バイト分のサンプルを開始する。
C サンプル終了待ちにする。
D サンプルが終了すると、座標表示後、トリガチェックし、トリガ検知してたら、6CH分のロジック表示を行う。
E ロジック表示が終了したら、READY_flag= 0にする。
F 再び@に戻り、レディ待ちループになる。
つまりこのループが、メインのHOLDモード中のループと同じことになる。
なので、x_temp < 128(x_tempは、トリガ検知点のバッファ位置になる)の条件が真の時(トリガ検知した時)
のみ波形が表示されているので、この時に限り、このループで、MAG
SWが有効になるようにする。
(未トリガの時は、MAG SWは無視する。)
後は、HOLDモード中のMAG処理と同じで良いようだ。
・SINGLEモードでの、拡大表示は、この考えで特に問題なしに上手く行った。
以下にこのモードでの拡大表示例を示した。
SINGLEモードなので、トリガソースも、それに相応しいものにした。
実験テーマ18で行った、MIDI音源を、PICでコントロールする実験の時、作ったMIDIメッセージ送出治具
の送信中信号(データ・フレーム)と、送信データのタイミングを測定例とした。
MIDIメッセージは、送信SWを押したらワンショットで出力するので、この例としては相応しい。
具体的には、Note ONメッセージの、3バイト送信時の、UART出力(PIC出力側)を確認することにした。
MIDI規格で、RS2332Cの転送スピードは、31250bpsと決められている。
つまり、1bit当たり32uSで送信する。
シリアルのデータフォーマット設定は、Data:8bit, Statビット:1bit,
Stopビット:1bit, Party:なし
なので、1バイト10bitになり、320uSで転送することになる。
そして、送信は、LSB→ MSBの順で送られる。
尚、その3バイトデータは、0x90, 0x30, 0x64 である。
これを頭に置いて、以下の表示例を見れば、正しく送信されているかが解ると思うが・・・
---<ここから、追試:「ハード・ソフト更新:V2」の記事>-------------------------------------
■ 2017.10.12
・実験テーマ96で、PIC32MXの新ファミリ:PIC32MX370F(Fcy=100MHz)での、6CHロジアナの、2つの
新機能:0.8uサンプル+5121byteレコード取得後のシフト表示は実現できた。
これを、このテーマで使っている、PIC32MX340F(Fcy=80MHz)でも可能か確認してみることにした。
ロング・メモリ化の方は実現出来るだろうが、0.8uサンプルの方はやってみないと判らない。
・左右シフトSWを追加しないといけない。
実験テーマ96:370Fでは、RB8,9を使ったが、340Fのこのポートには内部プルアップ機能(CN*)が
備えられてないので、RC13(CN1)と、RC14(CN0)を使うことにした。
ソフト更新の方は、ベースが出来ているので、そんなに問題なく記述出来た。
ペリフェラル・ライブラリのマクロで設定出来るので記述は、レジスタ直接よりは楽である。
ところが、実際に動かしてみたら、左シフト:RC13(CN1)は良いのだが、右シフト:RC14(CN0)の方の
動きがおかしい?
トリガが掛かった途端に、SWを押してないのに右シフトが始まり、バッファ読出し開始点を示す、P=****
の数値が勝手にディクリメントしてしまう?
調べたら、RC14は、SOSCO(2nd発振器出力ピン)と共用ピンとなっていて、ここには、内部の反転インバータIC
の出力が内部接続(外部のRTCクロック用水晶がフィードバック・ループに接続)されている。
この反転インバータICにはゲート端子:FSOSCENがあり、ここをソフトの、pragma命令を使って、
#pragma config FSOSCEN=OFF
を追記しないと、SWがオープン時でも、Lowに引っ張られてしまう為に、入力ピンとして機能しなくなる。
この追記でOKになる。
これ以外は、懸念していた、0.8uサンプルの方も問題なかったです。
追加機能については、実験テーマ96の記事も併読されるとより解りやすいと思います。
<最終回路図>
・こちらから、どうぞ→ 「PIC32MX_簡易6CHロジアナ_V1
回路図」
「PIC32MX_簡易6CHロジアナ_V2
回路図」 ※ 171014:ロングメモリ・シフト表示+0.8uサンプル追加版(ハード的には左右シフトSWの追加のみ)
<最終ソース>
・こちらから、どうぞ→ Easy_6CH_LogAna_V1.c
Easy_6CH_LogAna_V1a.c
(拡大表示追加版:160224 追加)
Easy_6CH_LogAna_V2.c
(ロングメモリ・シフト表示+0.8uサンプル追加版:171014 追加)
(この他に、カラーQVGA液晶用のライブラリソースとヘッダーファイル+フォントデータファイルが必要ですが、これらは、実験テーマ53のものと同様です。)