プロが教えるわが家の防犯対策術!

初めて質問します。今、大学生で卒業研究しているのですが外部の機械からサンプリング(A/D変換)するという簡単なものなのです。A/D変換は2チャンネル使っています。その二つのデータが、16進数の4バイトで出しています。上位2バイトがチャンネル2、下位2バイトがチャンネル1になっています。16進数8000hが0V、FFFFhを10V、0000hを-10Vとしたいのですがどうすればいいかわかりません。
例えば8003C000hと出たとき8003が約0V、C000が約5Vとなるようにしたいのです。

Data1=Mid(Hex(SmplData(0,0)),5,4) '下位2バイトチャンネル1のデータ
Data2=Mid(Hex(SmplData(1,0)),1,4) '上位2バイトチャンネル2のデータ

これを上で書いたように変えたいのです。教えてください。使っているA/D変換機はインターフェイスのPCI-3178を使っています。簡単なことかもしれませんが、今月中に、この後もまだまだしなくてはいけないのでお願いします。文章も苦手なもので、わからないことがあるかもしれませんがその時は言ってください。

A 回答 (4件)

VB の環境がないので、記憶にたよって書きます。


誤りがあるかも知れません。
16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、

Voltage1 As Double '←適当な型にしてやってください
Voltage1 = (Val("&H" & Data1) + 32768) / 65536 * 20 - 10

のようにすれば、V 数に変換できると思います。

A/D 変換などについては全く分からないので自信はないのですが、単純に質問文に沿って数値の変換をするだけであれば、こんな感じだと思います。
頑張ってください。
    • good
    • 0
この回答へのお礼

ありがとうございます。出来るかどうかまだ試していませんが、今からやってみます。

お礼日時:2002/01/07 06:08

よく理解していませんが・・・



例で上げられている
(1)&HFFFF& = 65535 → 10V
(2)&H8000& = 32768 → 0V
(3)&H0000& = 0 → -10V
は、正確な例では無いように思えます。


(2)-(1)=65535 - 32768 = 32767
(3)-(2)=32768 - 0 = 32768
となり、10Vの等差になりません。

それが定まれば、あとは比率で算出できると思います
    • good
    • 0

とりあえずさっきの発言についての補足です。



比の定義が定まったら、#1のtailkuppaさんの発言を参考に行うと、できると思います。



さらにtailkuppaさんの発言についての補足です。

>16進数文字列の先頭に"&h" を付けて、 Val() 関数を使えば整数に変換できると思います。
たしかに、その通りだとおもいます。

>ただし、このままだと&H8000 以上の数が負の数になってしまうので、32768 を足して、
この処理はあまりお勧めしません。。。
いくつ以上の時・・・
いくつ以下の時・・・
と処理を分けるのではなく、符号無しへの変換をするようにしましょう。
符号無し定数とビット単位での比較を行う事により、符号ありから符号無しへの16進数へ変換が可能です。

Sub main()
  Const LNG_FFFF As Long = &HFFFF&'変換定数
  
  Dim lngWork As Long
  
  '取り敢えず値代入
  lngWork = &HFFF0
  
  '出力
  Debug.Print lngWork         '-16 (符号ありの状態なので、負の値)
  Debug.Print (lngWork And LNG_FFFF) '65520(符号なしの状態なので、正の値)
End Sub
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。一応できたのですが、上のやり方ではまだ出来てませんので今から試してみようと思います。

お礼日時:2002/01/07 19:58

文系人間でA/D変換など詳しく分からない者です。


16進数を10進数に変換する私の使うロジックを下記に書きます。
8バイトの文字(0からFのどれか)で2+2=4バイトを表しているとします。ファイルの中でA~Fが小文字のときはa~fに変えてください。
Private Sub Form_Click()
Dim s, x, y As String
Dim tbl As String
Dim w(5) As Long
Dim u As Long
Dim v As Long
tbl = "0123456789ABCDEF"
s = "FAC33FA8"  '1例として設定
x = Mid$(s, 1, 4)
y = Mid$(s, 5, 4)
Form1.Print x, y
'-------
For i = 1 To 4
 w(i) = InStr(tbl, Mid$(x, i, 1)) - 1
 Form1.Print w(i)
Next i
'----
u = w(1) * 4096 + w(2) * 256 + w(3) * 16 + w(4)
Form1.Print u
'--------
For i = 1 To 4
 w(i) = InStr(tbl, Mid$(y, i, 1)) - 1
 Form1.Print w(i)
Next i
'-----
v = w(1) * 4096 + w(2) * 256 + w(3) * 16 + w(4)
Form1.Print v
End Sub
ここでuとvのそれぞれに付いて65536/20=3276で
20等分してint(u/3276)-10を計算すると65536は+10、
32768は0、0は-10と出ます。さて
こんなものでいいのでしょうか。全く見当はずれでないか
心配ですが、その時は笑って許してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!