2015年4月27日月曜日

ヘッドルームとフットルーム

3年位前のトラブルの話を整理。
ヘッドルームは図の電源電圧5Vまで使えない部分。ゼロ側のことをフットルームと表現するようだ。

【現象】
さて、トラブルは、既存設備への追加改造で外部付加回路として電流検出アンプを片電源回路で設けた。
極力ゼロ付近まで正しく測定値が得られるように、入力レールツーレールのオペアンプを使った。
ところが、測定端オープン時に、ゼロにならずプラス側の値が表示され、その値がアンプのスペックより大きい。
原因は、フルスケールが204.7nAだったので感度が高く、拾ってしまうハムが整流され非対称波形となって測定値をプラス側に振らす。

【解決策】
  • ハムの重畳は物理的に対策するしかない。
  • 両極性の回路にすれば、後段でも除去できる(普通はこうなっている)
  • フットルームによるゼロがゼロにならない問題は、出力負荷を軽くして、アンプのスペック通りの性能を引き出すしかない
  • よりよいアンプに交換する(してもゼロにはならない)
  • オフセット値を設定する機能は設けたが、全測定範囲で誤差になるので使えない
  • マイナス側へ電源電圧範囲を広げた回路にすればOK
実際は、良否判定値の10nA付近の精度が重要なだけなので、「ゼロにはなりませんと」と事情を説明し、説明書に明記した。(オフセットのような全範囲の誤差ではないことも)

【余談・単電源用オペアンプとレールツーレール】
「レールツーレールのオペアンプは、0V~VCCの範囲まで扱うことができ、 ほぼ入出力の関係は直線です。」とあったりするが、「ほぼ」であって全範囲ではない。ACのアンプを想定した記述になっている場合が多い。
ただし、片電源用オペアンプの中にはマイナス側入力も出来るタイプがあり、全てが図の様になるわけではない。

【余談・回路はバイポーラだけどAD変換はユニポーラ】
昔の計測回路はこれ。この場合オフセット分が、マイナスへずれていても分からない。
AD変換をバイポーラにすると、逆極性の値が示されて、「逆に流れているのかと」騒ぐ人が出てくる。高感度回路の場合は、ハムの波形の対称性までも影響する。

【余談・リーク電流】
集積回路全体の静止時のリーク電流は機能的な不具合や、ウェハーレベルの性能低下などを察知できたりするようで、この検査を省略するにはリスクが伴うようだ。

2015年4月23日木曜日

Excel VBA 変数一覧表を作る

【一覧表にしてみると】
その時々の思いつきで変数名や、関数名を振ってしまっていたが、リリース前に全体的な統一性、整合性、同名の型違い、プリフィックス(一文字か二文字の)の有無などチェックする目的で書き出してみた。最初はExcelのシートに貼り付けて、一行ずつ消しての手作業だったが、プログラムを眺めるという観点ではなく、異なる観点で見直すことが出来て有用だった。(一年前のこと)
バージョンの更新を重ねたので、再度やってみることにした。

【変数一覧表を作成するマクロ】
変数一覧表を作成するマクロを見つけたので使ってみたが、途中でエラー停止したことや、変数の型も、引数についても同様に知りたいので、改造することにした。
ところが、手を加えているうちにはまってしまった。それというのも、元の作者が「・・・。こうすれば、簡単に変数の値を共有できます。」という流儀で広域変数ばかりで作ってあり、私とは真逆の考えの方。

【変数一覧表を作成するマクロを改造】
フィルタ部分はそのまま使用させてもらうつもりだったが、関数の引数部分も取り出す機能を入れ始めた頃から削る部分と、追加部分が入り交じっておかしくなってしまい、丸一日がかりになるはめに。オリジナルにあった、関数名との対応表を作成する部分は削った。

【出来たマクロは】
自分の記述法は、変数名、関数名の行が、二行に分かれたり一行にコロンで区切り、複数書いたりするケースが無いので、対応はしなかった。
左端から順に数えて進めるというオリジナルの方法には従ったが、もっとスマートな方法がありそうな気がする(パターンを登録して、それを見つけるとか) 検出キーワードは、
  • Sub, Function,
  • ByRef, ByVal
  • Dim, Public
 以下の定数関係は無視(定義モジュールに集中しているので、コードをみれば済むこと)
  • Enum, Type, Const
【使用結果】
一瞬で書き出しが終わり、シート上、手作業で同名をカウントする式を貼り付けた後、重複するセルを削り、変数一覧表が出来上がる。
今回リリースしたマクロの書き出し結果は
  • 広域変数16個(条件定義の配列や動作モードや動作ステップ)を除いて
  • 269個有り、重複を削除したら107個残った
  • 一番多いもので30回登場(通信結果を受ける変数)
  • 一回限りの登場が 62 個
ざっとみたところで、同じ目的での一字違いとか、同名で型違いとか、いくつか見つかる。Variant は二つ。一回限りが多いということは、同じ処理を何度も書いていなから、とも言える。

【変数名・自分流】
自分なりの名前付けルールを厳密にしているわけではないが、その場限りのカウント等の汎用的な変数は抽象的なものでもいいが、後から見て、操作している内容まで伝わるような具体的な名前にした方がいい。種類を減らそうとか、短くしようとかにこだわりすぎないこと。

2015年4月8日水曜日

Excel VBA OnTime が使いこなせず

【タイマ経過後実行】
OnTime(EarliestTime, Procedure, LatestTime, Schedule)
  • EarliestTime: マクロを実行する時刻を指定
  • Procedure: 指定時刻に実行するプロシージャ名
  • Schedule: True の指定で OnTimeメソッドの設定有効/Falseで設定を取り消す
【不具合】
  • OnTime ソメッドを使い、ボタン操作がされなくなって一定時間経過後、フォームを自動的に閉じるプログラムを作ったが、時間を短くしてデバッグすると時々うまくいかない
  • 4つあるボタンの操作の度に、タイマ設定を取り消して、再度タイマの設定を行う、というように単純に考えて作ったのだが・・
  • 押されている間繰り返すというボタン処理(Do Event有り)のせいなのか、クリックして一秒もかからないボタン処理が入るからなのかわからない
  • 「取り消し」が不完全で、複数のタイマが発生してしまう模様
  • 指定した時刻を過ぎて「取り消す」とエラーになる
【注意点】
  • 「今から○分後」の実行する時刻指定(EarliestTime)が異なると別モノのタイマが準備されてしまい、活きている
【改良版】
  • 「取り消し」しなくても済むやり方
  • 取り消す処理を入れるとややこしいので、指定時刻になったら呼び出すが、その時「処理」を実行するかしないかは別の条件で判断する
  • タイマは1分間隔のインターバルタイマとすることで、タイマは必ず一つになる
  • インターバルは経過時間の誤差になるので、間隔をあまり開けられない
  • タイマはカラ実行して終わらせればよく、取り消す処理を入れる必要は無い
【再帰処理】
  • インターバルタイマ/繰り返し=自分自身の関数を呼び出す
【余談】
  • タイマが日付をまたげるか、を忘れがち
  • ハード回路に置き換えて考えたらすっきりまとめられた
    (モノマルチ×、同期処理○)