dBm、mW、mVppの変換ツールをExcelマクロで作ってみませんか?
Vppとは?
突然ですが、次のような波形があった場合、電圧振幅が何Vか分かりますか?
その通り。答えは1 [V]です。
では、あなたは、Vppという単位を見たことがありますか?
ボルトピーピーと読みます。Vp-pと書く人もいます。
この波形の振幅をVppで表すと、どんな値になりますか?
ボルトピーピーは略語です。本当は、「Volt Peak to Peak」で、最大値と最小値の差の値を示す言葉です。この波形例では、2[Vpp]になります。
高周波の分野では、扱う信号が小さいため、mVppという単位をよく使います。
dBmとは?
dB(ディービー、デシベル)は街中でもよく耳にする単語です。
1 [Vpp]の振幅が増幅器を通って5 [Vpp]になったとすると、
なので、「14デシのアンプが得られた」なんて感じで使います。
では、dBmという単位を見たことがありますか?
「ディービーエム」と読みます。僕は聞き間違えされないように、「デービーエム」と発音しています。
dBmは、1 [mW]の電力を基準とした単位です。P [mW]をdBmで表すと、
となります。
高周波回路は小さい電力値を扱うことが多いので、mWが良く使われます。また、アンプの利得やフィルタの損失はdBで表されます。dBmは、これらと整合性が良いためによく使われます。。
念のための注意ですが、dBは「比」を表しているので無次元です、dBmは「電力」という物理量を表します。くれぐれも間違わないようにしてください。
ちなみに、釈迦に説法だと思いますが、式(1)の係数は20、式(2)の係数は10を使っています。これは、次の理由によります。
Pを電力、Vを振幅、Rを抵抗値とすると、
であり、両辺の常用対数を取って10倍すると、
となります。電力比の常用対数は「ベル」であり、「デシ」は10倍なので、左辺はデシベルです。このとき、右辺の電圧比に対する係数は20になります。
dBm、mW、mVppの関係式を導こう
50[Ω]系において、1 [dBm]は1 [mW]であり、632 [mVpp]です。これは、高周波を扱うのであれば、知っておいて損のない値です。(最後の632 [mV]はの値を知っていれば、手計算で導けます。すなわち、
(ひとまるはみいろにならぶ)なので、これを200倍して、632.44です)
では、これらの関係を導いてみましょう。
電力P [mW]はx [dBm]であり、振幅v [mVpp]だとします。
まず、電力P [mW]からx [dBm]でへの換算は定義から、
です。これは簡単です。
逆に、x [dBm]から電力P [mW]への換算は、
です。
次に、系のインピーダンスがR[Ω]のとき、電力P [mW]を振幅v [mVpp]で表すと、
です。vを2で割る理由は、ppを振幅に直すためです。√2で割っているのは、実効値にするためです。1000で割ったり掛けたりしているのは、ミリ(m)を考慮するためです。
約分すると、
となります。
これをv[mVpp]について解くと、
となります。
これで、x [dBm]やv [mVpp]からP [mW]を計算することができ、逆にP [mW]からx [dBm]やv [mVpp]を計算することができるので、3形式間を自由に変換できるようになりました。
dBm、mW、mVppの変換フォームをExcelマクロで作ってみよう
変換方法が分かったら、これをExcelのマクロで表現してみましょう。
以下、手順を述べますが、マクロを使ったことが無い方は、まずこちらをご覧ください。「開発」タブの出し方から説明しています。
フォームの作り方
フォームを作る手順は次の通りです。
- Excelを立ち上げます
- 「開発」タブ→「Visual Basic」をクリック
- 「VBAProject (Book1)」を右クリック→「挿入」→「ユーザーフォーム」
- ツールボックスが見当たらない場合は、「表示」タブ→「ツールボックス」で、ツールボックスを出します
- テキストボックスを1つ配置します
- 配置したテキストボックスを選び、プロパティウインドウの(オブジェクト名)欄に「txtdBm」と入力して名前を付けます
※プロパティウィンドウが無い場合は、「表示」タブ→「プロパティウィンドウ」を選択して表示します
- さらに「text」の欄に「txtdBm」と入力すると、それがテキストボックスに表示されます
- 「font」欄の値をクリックすると「…」が現れるので、必要であればそれをクリックして、フォントやサイズを変更してください
- 同様に、「txtmW」、「txtmVpp」、「txtOhm」のテキストボックスを作り、図のように配置します。
- ラベルを4つ配置し、Caption欄にそれぞれ「dBm」「mW」、「mVpp」、「Ω系」と入力してテキストボックスの内容を表示します
- キャプション部等をクリックしてフォームを選びます
- (オブジェクト名)欄に、「frmdBmConversion」などと名前を付けます
※この名前は後でフォームを開くときに使います
- 「F7」キーを押してエディタを表示します
- エディタ上の全ての文字を消してから、以下のコードを貼り付けます
Option Explicit
'-----------------------------------------------------------------------
' Summary: 抵抗値のボックスを除いたテキストボックスをクリアする
'-----------------------------------------------------------------------
Private Sub TextBoxClear()
Me.txtdBm.Text = ""
Me.txtmW.Text = ""
Me.txtmVpp.Text = ""
End Sub
'-----------------------------------------------------------------------
' Summary: txtdBmでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtdBm_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
' Enterキーを押したときにdBmからの変換値を計算する
If KeyCode = vbKeyReturn Then
Dim dblmW As Double ' 電力[mV]
' 電力値をmW単位で計算する
dblmW = 10 ^ (Val(Me.txtdBm.Text) / 10)
' 電力値を表示する
Me.txtmW.Text = Format(dblmW, "0.00")
' 電圧振幅をmVpp単位で表示する
Me.txtmVpp.Text = Format( _
20 * Sqr(20 * dblmW * Val(Me.txtOhm.Text)), "0.000")
End If
End Sub
'-----------------------------------------------------------------------
' Summary: txtmVppでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtmVpp_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
' Enterキーを押したときにmVppからの変換値を計算する
If KeyCode = vbKeyReturn Then
Dim dblmW As Double ' 電力[mV]
' 電力値をmW単位で計算する
dblmW = Val(Me.txtmVpp.Text) ^ 2 / Val(Me.txtOhm.Text) / 8000
' 電力値を表示する
Me.txtmW.Text = Format(dblmW, "0.00")
' 電力値をdBm単位で表示する
Me.txtdBm.Text = Format(10 * Log(dblmW), "0.00")
End If
End Sub
'-----------------------------------------------------------------------
' Summary: txtmWでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtmW_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
' Enterキーを押したときにmWからの変換値を計算する
If KeyCode = vbKeyReturn Then
' 電力値をdBm単位で表示する
Me.txtdBm.Text = Format(10 * Log(Val(Me.txtmW.Text)), "0.00")
' 電圧振幅をmVpp単位で表示する
Me.txtmVpp.Text = Format( _
20 * Sqr(20 * Val(Me.txtmW.Text) * Val(Me.txtOhm.Text)), _
"0.000")
End If
End Sub
'-----------------------------------------------------------------------
' Summary: txtOhmでキーを押した時の処理
'-----------------------------------------------------------------------
Private Sub txtOhm_Change()
' 抵抗値のボックスを除いたテキストボックスをクリアする
TextBoxClear
End Sub
'-----------------------------------------------------------------------
' Summary: フォームの初期化
'-----------------------------------------------------------------------
Private Sub UserForm_Initialize()
' 系のインピーダンスを暫定的に50Ωにする
Me.txtOhm.Text = 50
' 抵抗値のボックスを除いたテキストボックスをクリアする
Call TextBoxClear
End Sub
フォームを呼び出すためのおまじない
- 「プロジェクト」欄で、「VBAProject (Book1)」を右クリック→「挿入」→「標準モジュール」
- 現れた標準モジュールのエディタに、以下のコードを貼り付けます
※「frmdBmConversion」は上でフォームに付けた名前です
Public Sub dBm変換フォームを表示()
frmdBmConversion.Show (vbModeless)
End Sub
実行方法
- Excelシート→「開発」タブ→「マクロ」→「dBm変換フォームを表示」を選択→「実行」をクリック
- 変換前の値を当該出来ストボックスに入力してEnterを押すと、他の欄に変換結果が表示されます。(図はdBmの欄に0を入力した時の実行結果)
- Excelのファイルを保存する際には、「Excel マクロ有効ブック(*.xlsm)」で保存してください
まとめ
マクロのコードの中を眺めると、ここで導いた式を使っていることが分かると思います。
同様にしてマクロを組めば、長さや圧力の変換フォームも作ることが出来ます。
標準モジュールに「Public」で呼び出し関数を作ると、「開発」タブの「マクロ」から呼び出すことが出来るようになります。フォームを「vbModeless」でShowすると、フォームを開いている最中に、Excelのシートの編集をすることができます。編集をさせたくなければ、「vbModal」でShowして下さい。
コメント