技術者見習いのメモ書き

電子工作や神社めぐりなどの趣味の話を中心に書いていきます。 Twitter:@hakura_riku

PSpice for TIを使用したパラメトリック解析について

はじめに

Texas Instrumentsが提供しているシミュレーションソフトのPSpice for TIについて日本語での使用方法説明が無かったのでメモとして残します. 記事の内容は参考文献[1],[2]に記載されているので正確な情報を知りたい方は参考文献をご参照ください.

パラメトリック解析とは

パラメトリック解析とは回路中の任意のパラメータを変化させて解析する手法であり, 変化させるパラメータの影響度合いやパラメータの最適値を決定する際に使用します[3]. 今回はRCローパスフィルタのコンデンサ容量を変化させカットオフ周波数がどの様に変化するか確認します.

PSpice for TIの基本的な使い方を知りたい方は過去の記事をご参照ください.

解析結果の事前検討

RCフィルタの抵抗を1kΩに固定してコンデンサを0.1uF, 0.5uF, 0.1uFと変化させカットオフ周波数の変化を確認します。 RCローパスフィルタのカットオフ周波数は下記の公式から求められます.

RCローパスフィルタ カットオフ周波数の公式


\begin{aligned}
f_c = \frac{1}{2 \pi CR}
\end{aligned}

解析するRCフィルタのカットオフ周波数

コンデンサ容量 カットオフ周波数
0.1uF 1.59kHz
0.5uF 318.30Hz
1uF 159.15Hz

解析条件の設定

AC電源を使用してRCフィルタを作成します.

※AC電源などの部品配置方法が分からない方は過去の記事をご確認ください.

f:id:hakura03:20210214171337p:plain
解析条件の設定1

コンデンサの定数の部分をダブルクリックしてDisplay Propertiesを表示させます. Valueの欄に{}を付けて任意の名前を設定します. 今回はcapに設定しました.

f:id:hakura03:20210214171646p:plain
解析条件の設定2

Place -> PSpice Component... -> Search...からPSpice Part Searchを表示させ, 検索バーからPARAMを探しシンボルを配置します.

f:id:hakura03:20210214204142p:plain
解析条件の設定3

f:id:hakura03:20210214204205p:plain
解析条件の設定4

PARAMのシンボルをダブルクリックするとProperty Editorが表示されます. Property EditorのNew Propert...を選択し設定を入力します.

f:id:hakura03:20210214205241p:plain
解析条件の設定5

f:id:hakura03:20210214205303p:plain
解析条件の設定6

Add New Propertyウィンドウが表示されたら初めにDisplay[ON/OFF]のチェックを入れます。Nameの部分にコンデンサのDisplay Propertiesで設定した名称を入力します. Valueには解析を始める値を入力します. 二つの条件を入力し, Display[ON/OFF]のチェックが入っていることを確認したらOKボタンを選択してください.

f:id:hakura03:20210214205758p:plain
解析条件の設定7

Display PropertiesウィンドウのName and Valueにチェックを入れOKボタンを押してください. 回路図の画面に戻ると先ほど設定した内容が表示されるようになります.

f:id:hakura03:20210214210417p:plain
解析条件の設定8

f:id:hakura03:20210214211343p:plain
解析条件の設定9

New Simulation Profileから解析条件を作成します. AC Sweep/NoiseのGeneral Settingsを設定後にParametric Sweepの設定をおこないます. Global parameterを選択しParameter nameを入力します. 今回は入力した値を順番に解析するValue Listを使用して解析をおこないます.

※General Settingsの設定方法が分からない方は過去の記事をご確認ください.

f:id:hakura03:20210214211652p:plain
解析条件の設定10

f:id:hakura03:20210214212053p:plain
解析条件の設定11

f:id:hakura03:20210214212115p:plain
解析条件の設定12

Pspice -> Markers -> Advanced -> dB Magnitude of Voltageを配置して解析条件の設定は完了です.

f:id:hakura03:20210214213718p:plain
解析条件の設定13
f:id:hakura03:20210214213743p:plain
解析条件の設定14

解析の実行

解析の実行ボタンを押すとAvailble Setionsが表示されるのでOKボタンを押します.

f:id:hakura03:20210214214413p:plain
解析の実行1

解析が完了するとグラフが表示されます. どのグラフがどの条件に対応しているかはグラフのマーカ表示をダブルクリックすると確認できます.

f:id:hakura03:20210214214752p:plain
解析の実行2

グラフ中に条件を記入したい場合はPlot -> Label -> Text...を使用します. 文字の色を変更したい場合はChange Fontから色の設定を変更します.

f:id:hakura03:20210214220251p:plain
解析の実行3
f:id:hakura03:20210214220310p:plain
解析の実行4

カットオフ周波数を測定するのに今回はToggle Measurement Results Windowを使用します. 選択するとMeasurement Resultsが表示されるのでClick here to evaluate a new measurement... をクリックします.

f:id:hakura03:20210214221955p:plain
解析の実行5
f:id:hakura03:20210214222016p:plain
解析の実行6

Evaluate Measurementウィンドウが表示されるのでCutoff_Lowpass_3dB(1)を選択しV(R1:2)を選択します. V(R1:2)という部分は作成した回路によって異なるのでマーカ表示の横に記載されている表記を確認して選択してください.

f:id:hakura03:20210214222512p:plain
解析の実行7

OKボタンを押すと結果が表示されます.

f:id:hakura03:20210214222740p:plain
解析の実行8

補足情報

定数の変更によって変化した特性をグラフにして表示することができます.

より滑らかなグラフにするためParametric Sweepの設定をLinearに変更します. LinearはStartとEndに設定した範囲をIncrementに入力した幅で解析することができる設定です.

f:id:hakura03:20210214224305p:plain
補足情報1
f:id:hakura03:20210214224345p:plain
補足情報2

Trace -> Performance Analysis..を選択すると Performance Analysisウィンドウが表示されるのでWizardを選択してください.

f:id:hakura03:20210214224554p:plain
補足情報3
f:id:hakura03:20210214224730p:plain
補足情報4

Performance Analysis Wizardが表示されます. Step 1 of 4はNextを選択, Step 2 of 4はCutoff_Lowpass_3dBを選択してNext, Step 3 of 4はName of trace to searchにマーカ表示の横に記載されている表記を選択してNext, Step 4 of 4はNextを選択するとグラフが表示されます.

f:id:hakura03:20210214225435p:plain
補足情報5
f:id:hakura03:20210214225450p:plain
補足情報6
f:id:hakura03:20210214225508p:plain
補足情報7
f:id:hakura03:20210214225525p:plain
補足情報8
f:id:hakura03:20210214225540p:plain
補足情報9

解析結果の考察

事前に予測していた値と解析の結果がほぼ一致するため結果は妥当であると判断します. 事前検討値と解析結果が若干異なる原因はAC解析で設定したステップ数の粗さだと考えます.

コンデンサ容量 事前検討した値 解析の結果
0.1uF 1.59kHz 1.58807kHz
0.5uF 318.30Hz 317.86220Hz
1uF 159.15Hz 159.42984Hz

おわりに

PSpice for TIを使用したパラメトリック解析方法を解説しました. PSpice for TIに限らず解析ソフト全体に言える事ですが, 実機で検証すると面倒なことを簡単にできるのが非常に便利で面白いです. しかし, 事前検討値との差からも分かるように解析結果は必ずしも正確な値とは限らないのでそれを理解した上で活用していきたいです.

参考文献

[1] Texas Instruments, ‘‘PSpice® for TI design and simulation tool, ” https://www.tij.co.jp/tool/jp/PSPICE-FOR-TI.

[2] Texas Instruments, ‘‘2.3 PSpice for TI: Parametric Sweep Analysis, ” https://training.ti.com/pspice-ti-parametric-sweep-analysis?context=1146489-1146488-1146449.

[3]Tsuyoshi Horigome, ‘‘LTspiceパラメトリック解析の基礎, ” https://www.slideshare.net/TsuyoshiHorigome/ltspice-46019101.

PSpice for TIでのサードパーティーモデルの導入について

はじめに

Texas Instrumentsが提供しているシミュレーションソフトのPSpice for TIについて日本語での使用方法説明が無かったのでメモとして残します. 記事の内容は参考文献[1],[2]に記載されているので正確な情報を知りたい方は参考文献をご参照ください.

今回の記事では新日本無線製のオペアンプのモデルを導入して反転増幅器を作成します. 回路の作成後にAC解析を実施して導入したモデルが正常であるかの確認をおこないます. 紹介するPSpice for TIの操作方法については参考文献[2]とほぼ同じですが, 解析する回路は異なるので注意してください.

解析結果の事前検討

今回は参考文献[3]のNJM324Cを使用してAC解析をおこないます. このICを使用して10倍(20dB)の増幅率の反転増幅器を作成した場合, データシート記述より90kHz付近から増幅率の減衰が発生する図の緑点線の様なグラフになると想定されます.

f:id:hakura03:20210207092537p:plain
NJM324Cの周波数特性

他社モデルの導入

各社のサイトもしくは, PSpice.comから解析用のモデルをダウンロードします.

f:id:hakura03:20210207092928p:plain
他社モデルの導入1

ダウンロードしたファイルを解凍するとモデルのファイルが二つあります. この二つのファイルをプロジェクトファイルが格納されているフォルダにコピーします.

f:id:hakura03:20210207094016p:plain
他社モデルの導入2
f:id:hakura03:20210207094745p:plain
他社モデルの導入3

移動したlibファイルをメモ帳で開き, ファイル名と.SUBCKTの横に書かれている名称が一致しているか確認します. 異なる場合はlibファイルの名称を.SUBCKTの横に書かれている名称に変更してください.

f:id:hakura03:20210207101704p:plain
他社モデルの導入4
f:id:hakura03:20210207102008p:plain
他社モデルの導入5

PSpice for TIのDesign Resourcesを一度クリックした後でToolsを開くとGnerate Part...が選択できるようになります.

f:id:hakura03:20210207095654p:plain
他社モデルの導入6

Generate Partのウィンドウが出るので, Browse...を選択し, 先ほどプロジェクトファイルのフォルダに格納したlibファイルを選択して開くボタンを押します.

f:id:hakura03:20210207102314p:plain
他社モデルの導入7

Pick symbols manual...にチェックが入っていることを確認してOKボタンを押します. OKボタンを押すとUndo Warningが出るのでYesを選択してください.

f:id:hakura03:20210207102543p:plain
他社モデルの導入8
f:id:hakura03:20210207102812p:plain
他社モデルの導入9

Model Import Wizardが出るので導入しようとしているモデルのシンボルに問題がないかを確認します. 問題がなければ完了ボタンをクリックしてください. 完了ボタンを押すとLogファイルが出力されるのでOKボタンを押してください.

※Model Import Wizardのウィンドウが表示されない場合は, Generate PartウィンドウのPick symbols manual...にチェックが入っていない可能性が高いです.

f:id:hakura03:20210207103415p:plain
他社モデルの導入10
f:id:hakura03:20210207103604p:plain
他社モデルの導入11

※Model Import Wizardのウィンドウでシンボルが表示されない場合はlibファイルとシンボル用のファイルが関連付けができていないと考えられます. ダウンロードしたlibファイルの名称や.OLBファイルの名称が正しいか確認してください.

f:id:hakura03:20210207104004p:plain
他社モデルの導入12(失敗例)

ICに+マークが描かれたPlace Partボタンを押すとPlace Partのウィンドウが開きます. Librarieの項目にあるファイルマークをクリックして手動でプロジェクトフォルダ内にある.OLBファイルを参照してください.

f:id:hakura03:20210207121436p:plain
他社モデルの導入14

Librariesで部品名を選択後にPartの部分に表示されているシンボル名称をダブルクリックすると回路図にシンボルを配置できるようになります.

f:id:hakura03:20210207115549p:plain
他社モデルの導入15

シンボルを配置するとOnline DRCsでORCAP-2445が発生します. このワーニングはシンボルとPSpiceの解析モデルが関連付けされていない場合に発生します. このワーニングを解消するためには, Simuration SettingsでPSpiceモデルのライブラリの参照先を追加する必要があります.

f:id:hakura03:20210207112552p:plain
他社モデルの導入16

Simulation Settingsを新規に作成する場合は波線に+マークが描かれている表示を選択し, 過去に作成したSimulation Settingsを編集する場合は波線に鉛筆マークが描かれている表示を選択します. Simulation SettingsのConfiguration Filesを選択すると参照するライブラリなどの設定項目を見ることができます. CategoryのLibraryの項目を選択してください.

※波線に+マークを押した際に図のようなエラーが発生してPSpiceが強制終了する場合はプロジェクトファイルの作成に問題があります. 「Pspice for TIのプロジェクトファイル作成とトランジェント解析について」の記事を参考にしてプロジェクトファイルから作成し直してください.

f:id:hakura03:20210207114029p:plain
他社モデルの導入17
f:id:hakura03:20210207120409p:plain
PSpiceが強制終了するときのエラー表示

Filenameの横にあるBrowse...を選択し, 導入したモデルの.libファイルを選択して開きます.

f:id:hakura03:20210207122217p:plain
他社モデルの導入18

Configuraed Filesの欄に開いた.libファイルが追加されていることを確認してAdd to Designを選択しOKボタンを押します. 以上で他社モデルの導入は完了です.

※導入するモデルによっては.OLBの部品名称がlib部品名称が異なる場合があり, ORCAP-2445が解消されない事があります. その場合はProperty Editorなどから部品名称を修正する必要があります.

※この手法で導入したモデルはプロジェクトファイル単位でしか反映されません. プロジェクトファイルを作成し直した場合はモデルを再度導入する必要があります.

f:id:hakura03:20210207123006p:plain
他社モデルの導入19

解析の実行

※解析を実行した際にORSIM-15108エラーが発生する場合は, シンボルとPSpiceモデルの対応付けが上手くいっていない可能があります. Simulation SettingsのConfiguration Filesで追加した.libファイルが正しいかとOLBファイルの部品名が正しいかを確認してください.

f:id:hakura03:20210207134543p:plain
解析の実行0

他社製のモデルを使用した場合はマーカの配置数や種類に制限が発生します. 例として前回の記事で紹介した Plot Window TemplatesのBode Plot dB - dual Y axesマーカを他社モデルを使用した回路で配置するとORCAP-15098, ORPSIM-16592エラーが発生して解析を実行することができません.

f:id:hakura03:20210207132100p:plain
解析の実行1
f:id:hakura03:20210207132144p:plain
解析の実行2
f:id:hakura03:20210207132203p:plain
解析の実行3

dB計測用マーカにPSpice -> Advanced -> dB Magnitude of Voltageを使用し, 位相計測用マーカにPSpice -> Advanced -> Phase of Voltageを使用することでエラーを回避することができます. しかし, マーカを一度に配置してしまうと出力されるグラフのY軸が一つにまとめられてしまします.

f:id:hakura03:20210207133943p:plain
解析の実行4
f:id:hakura03:20210207134038p:plain
解析の実行5
f:id:hakura03:20210207134103p:plain
解析の実行6

dB値のY軸と位相のY軸を別々に表示するには, マーカを一つづつ配置してシミュレーションを実行する必要があります. シミュレーションが完了しグラフが表示されたらPlot -> Add Y Axisを選択しY軸一つを増やします.

f:id:hakura03:20210207135237p:plain
解析の実行7
f:id:hakura03:20210207135301p:plain
解析の実行8

この状態でもう一つのマーカを配置するとY軸を分けてプロットすることができます.

f:id:hakura03:20210207135707p:plain
解析の実行9

解析結果の考察

データシートのグラフを用いた事前検討で90kHz付近からdB値が低下すると推測していました. 今回のシミュレーションの結果も同様に90kHz付近で設定から増幅率の低下が発生しています. ことからこのシミュレーションは妥当であると判断します.

f:id:hakura03:20210207140713p:plain
事前検討したグラフの形状

f:id:hakura03:20210207140740p:plain
シミュレーションの結果

おわりに

新日本無線オペアンプNJM324Cの周波数特性解析をPSpice for TIを使用しておこないました. 他社製ICを使用するとマーカの設置条件に制約が発生しますが解析はできます. 使用していて不便な所は他社製IC配置によって使用できなくなるマーカをエラーが発生するまで確認できない所です. しかし, CadenceのPSpice向けに作られたモデルを簡単に読み込んで解析できる点は非常に魅力的なので, 解析するモデルに応じてLTSpiceと使い分けをしていくのが良いかと思います.

参考文献

[1] Texas Instruments, ‘‘PSpice® for TI design and simulation tool, ” https://www.tij.co.jp/tool/jp/PSPICE-FOR-TI.

[2] Texas Instruments, ‘‘2.6 PSpice for TI: 3rd Party Model Import, ” https://training.ti.com/pspice-ti-3rd-party-model-import?context=1146489-1146488-1146482.

[3]新日本無線株式会社, ‘‘NJM324C 4回路入り低消費オペアンプ, ” https://www.njr.co.jp/electronic_device/products/NJM324C.html.

[3]日清紡マイクロデバイス, ‘‘NJM324Cシリーズ 4回路入り低消費オペアンプ, ” https://www.nisshinbo-microdevices.co.jp/ja/products/operational-amplifier/spec/?product=njm324c.

PSpice for TIを使用したAC解析について

はじめに

Texas Instrumentsが提供しているシミュレーションソフトのPSpice for TIについて日本語での使用方法説明が無かったのでメモとして残します. 記事の内容は参考文献[1],[2]に記載されているので正確な情報を知りたい方は参考文献をご参照ください.

今回の記事では前回作成した反転増幅器の増幅率を100倍に変更しAC解析を実施します. 紹介するPSpice for TIの操作方法については参考文献[2]とほぼ同じですが, 解析する回路は異なるので注意してください.

TIが配信しているトレーニングビデオについて

前回の記事で参考文献として紹介していましたが, TIはPSpice for TIの使い方を下記のトレーニングビデオで紹介しています. すべて英語ですが記事では紹介できていない使い方を解説しているので視聴をおすすめします.

現在配信されているトレーニングビデオの一覧

1.1 PSpice for TI: A Brief Overview

1.2 PSpice for TI: Workspace Walkthrough

1.3 PSpice for TI: Cursor Operations

1.4 PSpice for TI: Waveform and Plot Settings

1.5 PSpice for TI: Measurement Functions

1.6 PSpice for TI: DC Bias Point Analysis

2.1 PSpice for TI: DC Sweep Analysis

2.2 PSpice for TI: AC Sweep Analysis

2.3 PSpice for TI: Parametric Sweep Analysis

2.4 PSpice for TI: Transient Analysis

2.5 PSpice for TI: Monte Carlo Histogram and Temperature Sweep Analysis

2.6 PSpice for TI: 3rd Party Model Import

解析結果の事前検討

解析を実施する前にOPA2743を使用した反転増幅器の解析結果がどのようになるかを検討します. 参考文献[3]OPA2743のデータシートから 周波数とゲインの特性についてのグラフを確認します. 反転増幅器の増幅率を100倍(40dB)に設定するので, 80kHz付近から徐々にゲインが下がる赤色の点線のようなグラフになると予想します.

f:id:hakura03:20210206221010p:plain
OPA2743の周波数とゲインの関係

解析用回路の編集

前回の回路からSine信号源と計測用マーカを削除します.

f:id:hakura03:20210206223427p:plain
回路の編集1

増幅率を100倍に変更するため, 抵抗R2を200kΩに変更します.

f:id:hakura03:20210206223637p:plain
回路の編集2

Independent Sources( 電源の設定画面)のSineタブを選択し, AC Sourceの設定画面から設定をおこない, Sine信号源を削除した部分にAC信号源を配置します.

f:id:hakura03:20210206230102p:plain
回路の編集3
f:id:hakura03:20210206230322p:plain
回路の編集4

解析条件の設定

New Simulation Profileを選択し, New Simulationのファイル名を記入してください.

f:id:hakura03:20210206231630p:plain
解析条件の設定1

Simulation Settingsの画面が表示されるのでAnalysis Typeの設定をAC Sweep/Noiseに設定します. 解析を始める周波数, 解析を終了する周波数, 解析のステップ数を画像のとおりに設定します.

f:id:hakura03:20210206231941p:plain
解析条件の設定2

※同じプロジェクトファイルで作成した解析条件は下記図のタブから参照し変更することができます.

f:id:hakura03:20210206232728p:plain
解析条件の設定3

dB値と位相差がプロットされた一般的なボード線図を表示するにはPSpice->Markers->Plot Window Templates...を選択します. Plot Window Templatesというウィンドウが表示されるので, Bode Plot dB - dual Y axesを選択します.

※ Bode Plot dB - dual Y axesはTI製ICを使用する場合のみ利用できます. 他社製ICのモデルが混在した状態でAC解析を実施する場合は, 「PSpice for TIでのサードパーティーモデルの導入について」の記事も確認してください.

f:id:hakura03:20210206233757p:plain
解析条件の設定4
f:id:hakura03:20210206234121p:plain
解析条件の設定5

測定用マーカを配置できるようになるのでオペアンプの出力に配置します.

f:id:hakura03:20210206234335p:plain
解析条件の設定6

解析の実行

Run PSpiceのボタンを押すと解析結果が表示されます.

f:id:hakura03:20210206234749p:plain
解析の実行1

出力されたグラフだとデータシートに記載されているグラフと比較しずらいので, グラフの軸を編集します.Plot -> Axis Settings...を選択してください.

f:id:hakura03:20210206235617p:plain
解析の実行2

Axis SettingsのY Axisタブから軸のレンジを編集します. 位相のY軸は1なので1を選択し, レンジを-20から180に変更します. また, dB値のY軸は2なので2を選択し, データシートに合わせて-20から140に変更します.

f:id:hakura03:20210207010801p:plain
解析の実行3
f:id:hakura03:20210207000426p:plain
解析の実行4
f:id:hakura03:20210207011240p:plain
解析の実行5

X軸の目盛表示少なすぎてグラフとして分かりずらいので, 目盛の数をデータシートに合わせて2刻みにします. 先ほどと同様の手順でAxis Settingsを表示させX Gridタブを開きます. Automaticのチェックを外し, MinorのIntervals between Majorを5に変更します.

f:id:hakura03:20210207080332p:plain
解析の実行6
f:id:hakura03:20210207081422p:plain
解析の実行7

詳細にデータを確認したい場合はToggle cursorを使用します. 任意の測定方法を選択することで, 右クリックと左クリックでカーソルを置くことができます. 測定結果は画面したの表に表示されます. カーソルを使って測定した結果, 80kHz付近のdB値は約36.6dBでした.

f:id:hakura03:20210207004339p:plain
解析の実行8
f:id:hakura03:20210207080815p:plain
解析の実行9

解析結果の考察

データシートのグラフを用いた事前検討で80kHz付近からdB値が低下すると推測していました. 今回のシミュレーションの結果も同様に80kHz付近で設定した40dBの増幅率から3.4dBの増幅率の低下が発生しています. ことからこのシミュレーションは妥当であると判断します.

f:id:hakura03:20210206221010p:plain
事前検討したグラフの形状
f:id:hakura03:20210207080835p:plain
シミュレーションの結果

おわりに

OPA2743を使用した反転増幅器のシミュレーションを用いてAC解析についての解説をおこないました. PSpice for TIでAC解析を実施した感想として, グラフを作るのにひと手間かかるので不便なところはありますが慣れれば問題なく使用できるシミュレーションソフトだと感じました.

参考文献

[1] Texas Instruments, ‘‘PSpice® for TI design and simulation tool, ” https://www.tij.co.jp/tool/jp/PSPICE-FOR-TI.

[2] Texas Instruments, ‘‘2.2 PSpice for TI: AC Sweep Analysis, ” https://training.ti.com/pspice-ti-ac-sweep-analysis?context=1146489-1146488-1146480.

[3] Texas Instruments, ‘‘OPA2743, ” https://www.tij.co.jp/product/jp/OPA2743.

PSpice for TIのプロジェクトファイル作成とトランジェント解析について

はじめに

Texas Instrumentsが提供しているシミュレーションソフトのPSpice for TIについて日本語での使用方法説明が無かったのでメモとして残します. 記事の内容は参考文献[1],[2]に記載されているので正確な情報を知りたい方は参考文献をご参照ください.

Pspice for TIの概要

PSpice for TIは Texas InstrumentsがCadence の PSpiceに下記の機能制限を付けて配信しているシミュレーションソフトです. CadenceのPSpiceはTexas Instrument, Analog Devices, 東芝, 新日本無線, ロームなどと協力してモデルを作成しており, PSpice for TIでも他社メーカのモデルを使用して解析ができます[3].

Cadenceの有料版PSpiceからの機能制限

  1. C言語MATLABSimulinkモデルを使用したシステムレベルでの検証機能が利用できない

  2. PSpiceで作成した回路データをレイアウト設計用CADに引き渡す機能が利用できない

  3. PSpice上で使用できる製品がTIのICのみになっている(自分でモデルのインポートをすれば他社ICも利用可能)

  4. TI以外のICやダイオードなどをインポートして解析に使用した場合は配置できる測定用マーカの数と種類に制限が発生する

使用方法の説明

参考文献[2]のトレーニングビデオの内容に従ってプロジェクトファイルの作成とトランジェント解析の実行方法を説明します. 解析する回路はTI製オペアンプOPA2743を使用した反転増幅器で増幅率は20倍に設定します.

プロジェクトファイルの作成

Flie -> New -> Project...の順で選択します.

f:id:hakura03:20210206105616p:plain
プロジェクト作成1

New Projectというウィンドウが表示されるのでNameとLocationを入力します。

※ファイル名やフォルダパスに日本語が含まれると解析条件の設定時にエラーが発生してPspiceが強制終了するので注意してください.

f:id:hakura03:20210206105749p:plain
プロジェクト作成2

Create PSpice Projectというウィンドウが表示されるのでCreate a blank proje...を選択してOKボタンを押してください.

f:id:hakura03:20210206111228p:plain
プロジェクト作成3

部品の配置

抵抗やコンデンサなどの基本的な部品はPlace -> PSpice Componet..に入っています. 増幅器を作るために図のように抵抗を三つ配置してください.

f:id:hakura03:20210206113523p:plain
部品配置1
f:id:hakura03:20210206113950p:plain
部品配置2

DC電源の設定はPlace -> PSpice Componet.. -> Modeling Application...を選択すると出てくるModeling Applicationのウィンドウからおこないます. Sources -> Independent Sourcesを選択すると電源の設定画面が出るので, 今回はDCタブから12VのDC電源を設定し二つ配置します.

f:id:hakura03:20210206114637p:plain
部品配置3
f:id:hakura03:20210206115323p:plain
部品配置4
f:id:hakura03:20210206115340p:plain
部品配置5
f:id:hakura03:20210206115917p:plain
部品配置6

Sine信号の設定も同様にModeling ApplicationのウィンドウのSources -> Independent Sourcesからおこないます. 電源の設定画面のSineタブを選択すると周波数や電圧などを設定できます. 今回はVAMPL:100mA, Frequency:1000Hzに設定します.

f:id:hakura03:20210206121046p:plain
部品配置7
f:id:hakura03:20210206121324p:plain
部品配置8

TI製ICの配置はPlace -> PSpice Componet.. -> Search...からおこないます. Searchを選択するとPSpice Part Searchが出るので検索部分にOPA2743と入力して部品を探してください. 表示された検索結果の部分で右クリックをするとPlace Symbolという選択肢が出るので選択して配置してください.

f:id:hakura03:20210206121810p:plain
部品配置9
f:id:hakura03:20210206140808p:plain
部品配置10
f:id:hakura03:20210206140828p:plain
部品配置11
f:id:hakura03:20210206141307p:plain
部品配置12

GNDはキーボードのGキーを回路図上で押すことで設定画面を出すことができます。シンボルを選んでOKボタンを押すと配置可能になるので, 5つGNDを配置してください.

f:id:hakura03:20210206141732p:plain
部品配置13
f:id:hakura03:20210206141753p:plain
部品配置14

解析に使用する部品が全てそろったので, 図のように部品を再配置してください. 部品の回転は部品を選択した状態でキーボードのRキーを押すことでできます.

f:id:hakura03:20210206142721p:plain
部品配置15

部品間の配線はキーボードのWキーを押すことでできます. 図のように配線してください.

f:id:hakura03:20210206142958p:plain
部品配置16

部品の定数を変更する場合は数値をダブルクリックするとDisplay Propertiesが表示されるのでValueを編集してOKボタンを押してください. 今回はR1を2kΩ, R2を40kΩ, V2を-12Vに変更します.

f:id:hakura03:20210206143624p:plain
部品配置17
f:id:hakura03:20210206152715p:plain
部品配置18

配線に名前を設定する場合はキーボードのNキーを押してください. Place Net Aliasという画面が表示されるのでAliasに名称を入力することでネット名を配置できます.

※回路図中にテキストを配置を配置したい場合はTキーを押すとテキストの設定画面が表示されます.

f:id:hakura03:20210206144235p:plain
部品配置19
f:id:hakura03:20210206144259p:plain
部品配置20

解析条件の設定

シミュレーションの設定をおこなうためには, 波線マークに+が描かれているNew Simulation Profileを選択してください. 選択するとNew Simulationの画面が表示されるので英語でファイル名を記入してください.

f:id:hakura03:20210206145310p:plain
解析条件の設定1

※New Simulation Profileを選択した際に下記の図のエラーが表示される場合はプロジェクトファイルのフォルダパスやファイル名に日本語を使用している可能性が高いのでプロジェクトファイルを再度作成してください.

f:id:hakura03:20210206145722p:plain
解析条件の設定2

プロジェクトファイルの作成に問題がない場合はSimulation Settingsの画面が表示されます. 今回はトランジェント解析を実施するのでAnalysis Typeの設定は変更せず, Run To Timeの設定とMaximum Step Sizeの設定のみ変更しOKボタンを押します.

※OKボタン選択後に設定内容を変更したい場合は波線マークに鉛筆が描かれているEdit Simulation Profileを押すとSimulation Settingsの画面が表示できます.

f:id:hakura03:20210206150415p:plain
解析条件の設定3
f:id:hakura03:20210206151156p:plain
解析条件の設定4

測定ポイントの設定にはボルテージマーカを使用します. 今回はオペアンプのマイナス側入力端子と出力にマーカを設置します.

f:id:hakura03:20210206151558p:plain
解析条件の設定5
f:id:hakura03:20210206153006p:plain
解析条件の設定6

解析の実行

解析を実行する場合は, Run PSpiceのボタンを選択します.

f:id:hakura03:20210206153219p:plain
解析の実行1

解析を実行すると解析結果を表示するウィンドウが現れますが, View Simulation Resultsボタンを押さないと波形が表示されません.

f:id:hakura03:20210206153803p:plain
解析の実行2

表示されたシミュレーション結果を確認すると緑色の波形が赤色の波形が表示されます. どちらがどのマーカの波形を示しているかは回路図に配置したマーカの色を確認すると分かります.

f:id:hakura03:20210206154646p:plain
解析の実行3
f:id:hakura03:20210206154707p:plain
解析の実行4

シミュレーションの結果から出力信号は入力信号と比較して位相が反転した状態で20倍されていることが分かり, 正常にシミュレーションができていると言えます.

おわりに

PSpice for TIを使用したトランジェント解析の方法を解説しました. 実際に使用してみて解析の条件設定がUI化されているので設定方法がLTSpiceより分かりやすかったです. また, 暗号化されてLTSpiceでは読み込むことができなかった他社製ICのモデルがPSpice for TIでは読み込んで使用することが出来たので非常に便利なツールだと感じました. しかし, 日本語の資料や参考になる情報が乏しいので最初の導入時やエラーが発生したときの対処が困難でした. TIから公式の日本語資料や解説するサイトが配信されることを期待します.

参考文献

[1] Texas Instruments, ‘‘PSpice® for TI design and simulation tool, ” https://www.tij.co.jp/tool/jp/PSPICE-FOR-TI.

[2] Texas Instruments, ‘‘1.2 PSpice for TI: Workspace Walkthrough, ” https://training.ti.com/pspice-ti-workspace-walkthrough?context=1146489-1146487-1146481.

[3]Cadence , ‘‘Browse Cadence PSpice Model Library, ” https://www.pspice.com/amplifiers-and-linear-ics/operational-amplifiers/cmos.

USB機能付き格安マイコンCH552TのUSBシリアル通信プログラム解説

はじめに

前回の記事ではUSBディスクリプタの解説を主におこないました. 今回の記事ではCH552TのUSBシリアルプログラムの解説をおこなっていきます.

USB通信の構造

アプリケーションレベルのUSB通信では仮想の通信線を「パイプ」と呼び, 必要に応じてパイプの数を設定します. パイプを使った通信ではホスト(パソコンなど)からデータを転送することを「OUT」, デバイス(マイコンなど)からデータを転送することを「IN」と呼びます. アプリケーションレベルでの通信構造を図に示します.

f:id:hakura03:20190430152826p:plain
アプリケーションレベルの通信構造

(参考文献[3] より引用)

USBデバイスを接続した直後はデフォルトパイプ(エンドポイント0)でコントロール転送のみが可能な状態となっています. コントロール転送を用いてコンフィギュレーション(ディスクリプタを用いた初期設定)を行い, デバイスの使用方法を設定します. 設定後はエンドポイントが追加され, パイプが構築されます[3].

USBSerialプログラムについて

USBSerialのプログラムはUSB_Serial.cに書かれています.

github.com

分かりづらい部分

はじめに, このプログラムを最初に見たときに私が分からなかった部分を解説します.

以下に示すプログラムはKeil C51でメモリの絶対アドレスを指定するためのコードです. ここではエンドポイントという通信用のFIFOバッファのメモリを確保しています. SDCCで同じプログラムをコンパイルする場合はメモリ指定の書き方が異なるので注意してください.

UINT8X   Ep0Buffer[THIS_ENDP0_SIZE] _at_ 0x0000;
UINT8X  Ep2Buffer[2*MAX_PACKET_SIZE] _at_ 0x0008;
UINT8X  Ep1Buffer[MAX_PACKET_SIZE] _at_ 0x00a0;

以下に示すプログラムは「UsbSetupBuf」の定義です. CH554.Hで定義している型「PUSB_SETUP_REQ」を用いて, 先ほど定義したメモリ「Ep0Buffer」のデータをキャストしています. このプログラムでは「PUSB_SETUP_REQ」で指定されている名称が出てくるのでプログラムを見る際には「PUSB_SETUP_REQ」を確認しておくといいです.

#define UsbSetupBuf     ((PUSB_SETUP_REQ)Ep0Buffer)

数値の送信方法

紹介したシリアル通信プログラムではASCIIコードでの通信を前提としています. つまり, ASCIIコードに則った数字は送受信できますが, 純粋な数値を送受信することはできません. 数値を送信するためには以下に示す変換プログラムを用いる必要があります. このプログラムは数値を「i_data」に入れると, ASCIIの文字コードに変換して「str_t」に入れてくれるプログラムです. このプログラムはUSB_Serial.c内に書かれているのでそれを使用してください.

void u16str(UINT16 i_data, char *str_t)
{
    int n,i;
    if(str_t)
    {
        str_t[0] = '\0';
        n = 0;
        
        do
        {
            i = n;
            do
            {
                str_t[i+1] = str_t[i];
            } while (i--);
            str_t[0] = 0x30+(i_data % 10);
            i_data /= 10;
            n++;
        } while (i_data);
    }
}

USBの割り込み処理

CH552TをパソコンのUSBポートに接続すると, 始めに「case UIS_TOKEN_SETUP | 0:」(エンドポイント0を使ったコントロール転送)に入りデバイスの設定をおこないます. 「case UIS_TOKEN_SETUP | 0:」内では「UsbSetupBuf」に入った値に応じた初期設定をおこないます. この設定を完了すると他のエンドポイントが使用可能になります.

「case UIS_TOKEN_OUT | 2: 」,「case UIS_TOKEN_IN | 2: 」はエンドポイント2で実際の通信処理をおこなうための部分となっています.

void USBInterrupt( void ) interrupt INT_NO_USB using 1                       
{   
    UINT8 len; 
    if(UIF_TRANSFER)                                                           
   {
    switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))
    {
          case UIS_TOKEN_OUT | 2:                                                              
                        LEN = USB_RX_LEN; 
                       RecieveData();
                      //EcoSendData(RecBuf);             
                        break;
           case UIS_TOKEN_IN | 2:                                                 
                      UEP2_T_LEN = 0;                                                                            
                     UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK;                           
                        UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;            
                        break;
            case UIS_TOKEN_SETUP | 0:                                                 
            len = USB_RX_LEN;
            if(len == (sizeof(USB_SETUP_REQ)))
            {   
       SetReqtp = UsbSetupBuf->bRequestType;
               SetupLen = UsbSetupBuf->wLengthL;
                            
               len = 0;                                                                                                                        
               SetupReq = UsbSetupBuf->bRequest;
               if(SetReqtp == 0xc0)
                           {
                                  Ep0Buffer[0] = DataBuf[num];
                                  Ep0Buffer[1] = DataBuf[num+1];
                                  len = 2;
                                  if(num<24)
                                  { 
                                    num += 2;
                                    }
                                    else
                                    {
                                        num = 24;
                                    }
                           }
                         else if(SetReqtp == 0x40)
                           {
                                len = 9;                                                        
                           }
                           else
                           { 
                                switch(SetupReq)                                                
                                {
                                     case USB_GET_DESCRIPTOR:
                                                switch(UsbSetupBuf->wValueH)
                                                {
                                                       case 1:                                              
                                                                 pDescr = DevDesc;                                
                                                                 len = sizeof(DevDesc);                                    
                                                       break;    
                                                       case 2:                                                              
                                                                 pDescr = CfgDesc;                                
                                                                 len = sizeof(CfgDesc);
                                                       break;   
                                                       default:
                                                                 len = 0xff;                                      
                                                       break;
                                                 }
                                             if ( SetupLen > len ) SetupLen = len;                  
                                             len = SetupLen >= 8 ? 8 : SetupLen;                    
                                             memcpy(Ep0Buffer,pDescr,len);                          
                                             SetupLen -= len;
                                             pDescr += len;
                                               break;                        
                                    case USB_SET_ADDRESS:
                                               SetupLen = UsbSetupBuf->wValueL;                       
                                               break;
                                    case USB_GET_CONFIGURATION:
                                             Ep0Buffer[0] = UsbConfig;
                                             if ( SetupLen >= 1 ) len = 1;
                                             break;
                                    case USB_SET_CONFIGURATION:
                                             UsbConfig = UsbSetupBuf->wValueL;
                                             break;
                                    default:
                                               len = 0xff;                                            
                                               break;    
                                   }
                            }
                      }
                        else
                        {
                                len = 0xff;                                                     
                        }

                          if(len == 0xff)
                          {
                                  SetupReq = 0xFF;
                                  UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL                    
                          }
                          else if(len <= 8)                                                   
                          {
                                  UEP0_T_LEN = len;
                                  UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;  
                          }
                          else
                          {
                                  UEP0_T_LEN = 0;                                                       
                                  UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;                       
                          }
                        break;
                 case UIS_TOKEN_IN | 0:                                                         //endpoint0 IN
                          switch(SetupReq)
                          {
                               case USB_GET_DESCRIPTOR:
                                      len = SetupLen >= 8 ? 8 : SetupLen;                               
                                            memcpy( Ep0Buffer, pDescr, len );                                 
                                            SetupLen -= len;
                                            pDescr += len;
                                            UEP0_T_LEN = len;
                                            UEP0_CTRL ^= bUEP_T_TOG;                                          
                                      break;
                               case USB_SET_ADDRESS:
                                            USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen;
                                            UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
                                      break;
                               default:
                                      UEP0_T_LEN = 0;                                                
                                      UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
                                      break;
                          }
                          break;
                 case UIS_TOKEN_OUT | 0:                                                 // endpoint0 OUT
                            len = USB_RX_LEN;
                            UEP0_T_LEN = 0;                                                    
                            UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_ACK;                                                          
                          break;
                    default:
                          break;
                }
                UIF_TRANSFER = 0;                                         
    }
    if(UIF_BUS_RST)                                             
    {
            USB_DEV_AD = 0x00;
            UIF_SUSPEND = 0;
            UIF_TRANSFER = 0;
            UIF_BUS_RST = 0;                                     
    }
      if (UIF_SUSPEND) 
        {                                                      
            UIF_SUSPEND = 0;
            if ( USB_MIS_ST & bUMS_SUSPEND ) 
            {                                                                          
                while ( XBUS_AUX & bUART0_TX );                                          
                SAFE_MOD = 0x55;
                SAFE_MOD = 0xAA;
                WAKE_CTRL = bWAK_BY_USB | bWAK_RXD0_LO;                                  
                PCON |= PD;                                                              
                SAFE_MOD = 0x55;
                SAFE_MOD = 0xAA;
                WAKE_CTRL = 0x00;
            }
    } 
      else 
      {                                                                            
          USB_INT_FG = 0x00;                                                         
      }      
}

おわりに

シリアル通信プログラムについての解説をおこないました. 次回はUSBマウスのプログラムについて紹介します.

参考文献

[1]べーた, ‘‘Cerevo TechBlog [21日目]激安中華USBマイコンは使えるのか, ” https://tech-blog.cerevo.com/archives/6068/.

[2]江苏沁恒股份有限公司, ‘‘8 位增强型USB 单片机CH552、CH551,” https://datasheet.lcsc.com/szlcsc/Jiangsu-Qin-Heng-CH552T_C111367.pdf.

[3]USB通信プログラミングテクニック, ‘‘USBの基本アーキテクチャ, ” http://www.picfun.com/usb02.html.

USB機能付き格安マイコンCH552TでUSBシリアル通信をおこなう方法

はじめに

前回までの記事でCH552Tの回路と開発環境について解説しました. 今回はCH552のUSBシリアルのプログラムを紹介します.

マイコンプログラムの最初はLチカをおこなうことが多いですが, 参考文献[1]のブログでLチカとタイマ割り込みのプログラムが紹介されているのでHello Worldのプログラムを公開したいと思います. 

 ※Lチカとタイマ割り込みのプログラムの解説記事がコメント欄などから要望があれば作成します.

プログラム

作成したサンプルプログラムを以下のリンクに置いておきます.

github.com

このプログラムは公式が配布しているCH554用シリアル通信プログラムをCH552, CH551用に改造したプログラムです. CH55Xシリーズのサンプルプログラムは互換性があり基本的に流用可能ですが, 使用するマイコンによっては実装されていない機能があるので適時修正が必要です.

もしもCH554のプログラムをCH552, CH551で利用する場合はUSBホスト機能に関するコードを削除してください.

※そのままCH554のプログラムをCH552, CH551に書き込んだ場合はブートローダーが破損するため書き込みが二度とできなくなります.

改造元のプログラムは一番初めの記事で紹介したサンプルプログラムの中にあります.

e_dragon / WCH / source / — Bitbucket

サンプルコードの使い方

サンプルコードが置いてあるgithubのリンクからサンプルプログラムをダウンロードします.

第1回の記事を参考にプロジェクトファイルを作成してください.

hakura03.hatenablog.com

作成したプロジェクトファイルの中にダウンロードしたファイルをコピーします.

f:id:hakura03:20190418222425p:plain
ダウンロードしたファイルをコピー

uVision5を起動し, 「Souse Group 1」の項目で右クリックして画像で示す「Add Existing Files to Group 'Source Group 1'」を選択します.

f:id:hakura03:20190418222711p:plain
ファイルの追加

「Add Existing Files to Group 'Source Group 1'」の画面が出てくるので, 「main.c」「USB_Serial.c」を追加します. そして, 「Public」フォルダ内にある「Debug.C」を追加します.

f:id:hakura03:20190418223550p:plain
ファイルの追加2

「main.c」をダブルクリックして開き, 「Rebuild」「Translate」を押してください. エラーが出なければコンパイルが成功しています.

f:id:hakura03:20190418224237p:plain
ビルド

f:id:hakura03:20190418224446p:plain
translate

書き込み

書き込みにはWCHISPToolが必要です. インストールしたWCHISPToolを起動し, 「8 Bit CH55X series」のタブを開きます.

f:id:hakura03:20190418225531p:plain
タブを開く

次に「Chip model」の欄からCH552を選択します.

f:id:hakura03:20190418225742p:plain
チップ選択

最後に「User File」の部分で自分が作成したプログラムのヘックスファイルを参照します. ヘックスファイルは作成したプロジェクトフォルダの「Objects」内にあります.

f:id:hakura03:20190418230024p:plain
ヘックスファイル参照

これで書き込み準備は完了です. 第2回の記事で紹介した回路を作成し書き込みをおこないます.

hakura03.hatenablog.com

USBをPCに差し込む際にCH552T書き込み回路についているボタンを押しながら差し込みます. 適切にブートローダーが起動できた場合は, WCHISPToolにCH552の表示が出ます.

f:id:hakura03:20190418230720p:plain
CH552の表示

「Download」ボタンを押すことでCH552に書き込むことができます.

プログラムの動作確認

今回のプログラムではボーレートが「57600bps」に設定されています. Arduino IDEのシリアルモニタで確認した結果を画像に示します.

f:id:hakura03:20190418231412p:plain
シリアルモニタ

USBデバイスクラスについて

サンプルプログラムを理解するために「USB_Serial.c」に記述されているUSBデバイスクラスについて解説します. 完全新規のUSBデバイスを開発する場合は本来なら, USBホスト(パソコン側など)とUSBデバイス(マイコン側など)双方のプログラムを作成する必要があります. しかしUSBデバイスクラスの規格に基づいてUSBデバイスを製作する場合はUSBホスト側のプログラムを作成する必要は基本的にありません. デバイスクラスが用いられる代表的な製品としてキーボードやマウスなどのパソコン用のデバイスがあります.デバイスクラスの表を以下に示します.

表1 USBのデバイスクラスコードについて

バイスクラス名 クラスコード(bDevice Class)
Audio 0x01
CDC(Communication Data Class) 0x02
HID(Human Interface Devices) 0x03
Image 0x06
MTP(Media Transfer Protocol) 0x06
Printer 0x07
MSC(Mass Storage Class) 0x08
USB Hub 0x09
CCID 0x0B
UVC(USB Video Class) 0x0E
PHDC 0x0F
Wireless Controller Bluetooth 0xE0

(参考文献[4] より引用)

WCHが販売するUSBシリアル変換IC「CH340」としてCH552Tを認識させるため一部のディスクリプタで異なる設定をおこないますが, 基本的にはCDCクラスと同じプログラムを作成します. CDCクラスはUSBを利用して通信をおこなうために規定された規格でシリアル通信をおこなうことができます[4].

USB・シリアル変換IC CH340G: 半導体 秋月電子通商-電子部品・ネット通販

サンプルプログラムのUSBディスクリプタについて

USBディスクリプタとはUSBの属性などを記述する部分です. ディスクリプタの設定を適切におこなうことで, USBデバイスのデバイスクラスや エンドポイントの設定などをおこなうことができます. 今回のサンプルプログラムに記述されているディスクリプタを以下に示します.

UINT8C DevDesc[18]={0x12,0x01,0x10,0x01,0xff,0x00,0x02,0x08, 0x86,0x1a,0x23,0x55,0x04,0x03,0x00,0x00,0x00,0x01};

UINT8C CfgDesc[39]={0x09,0x02,0x27,0x00,0x01,0x01,0x00,0x80,0xf0,0x09,0x04,0x00,0x00,0x03,0xff,0x01,0x02,0x00,0x07,0x05,0x82,0x02,0x20,0x00,0x00,0x07,0x05,0x02,0x02,0x20,0x00,0x00,0x07,0x05,0x81,0x03,0x08,0x00,0x01};  

バイスディスクリプタ

以下に示すデバイスディスクリプタの表を用いて「DevDesc[18]」の解説をおこないます.

表2 デバイスディスクリプタの解説とサンプルプログラムでの設定

Field Offset Size(byte) 詳細 今回の設定値
bLength 0 1 ディスクリプタの全体長。デバイスディスクリプタは 18(0x12)Byte 固定。 0x12
bDescriptorType 1 1 ディスクリプタの種別番号。DEVICE は 1。 0x01
bcdUSB 2 2 USB のバージョン(BCD)。0x100(USB 1.0?)、0x110(USB 1.1)、0x200(USB 2.0)、0x300(USB 3.0) 0x10,0x01
bDeviceClass 4 1 クラス番号 (USBクラス)。0x0 と 0xFF 以外は USB-IF が予約している。 0xff
bDeviceSubClass 5 1 サブクラス番号。0x0 と 0xFF 以外は クラス番号に依存する。 0x00
bDeviceProtocol 6 1 プロトコル番号。0x0 と 0xFF 以外は クラス、サブクラス番号に依存する。 0x02
bMaxPacketSize0 7 1 エンドポイント0の最大パケットサイズ(Byte)。速度別に規定がある。 0x08
idVendor 8 2 ベンダID(VID)。USB-IF より ID を発行(有償)してもらう必要有り。 0x86,0x1a
idProduct 10 2 プロダクトID(PID)。ベンダー各社がプロダクト毎に ID を自由に振りふれる。 0x23,0x55
bcdDevice 12 2 バイスのバージョン番号(BCD)。 0x04,0x03
iManufacturer 14 1 製造者の ストリングディスクリプタ の Index 番号。0の場合、指定無し。 0x00
iProduct 15 1 Product の ストリングディスクリプタ の Index 番号。0の場合、指定無し。 0x00
iSerialNumber 16 1 シリアルナンバーのストリングディスクリプタの Index 番号。0の場合、指定無し。複数接続を前提とするならば指定が必要。 0x00
bNumConfigurations 17 1 コンフィグレーションディスクリプタの個数。複数の Configuration より複数の Interface の方が好まれるケースが多い。 0x01

(参考文献[5] より引用)

バイスディスクリプタの4バイト目「bDeviceClass」の部分でCDCクラスを意味する「0x02」ではなく「0xff」となっています. 今回のプログラムでは「CH340」としてデバイスを認識させるためWCHが公式で出しているCH340のデバイスドライバを使用するからです. Windowsで使用する場合はWindows7以前のOSの場合別途デバイスドライバをインストールする必要があります. Windows8, Windows10ではCH340が標準サポートになっているので必要ないと考えられます[6].

wch.cn

コンフィグレーションディスクリプタ

以下に示すデバイスディスクリプタの表を用いてコンフィグレージョンディスクリプタの解説をおこないます. コンフィグレーションディスクリプタは「CfgDesc[39]」に含まれています. 「CfgDesc[39]」にはインターフェイスディスクリプタ, エンドポイントディスクリプタも含まれているので注意が必要です.

//「CfgDesc[39]」に含まれるコンフィグレーションディスクリプタ
0x09,0x02,0x27,0x00,0x01,0x01,0x00,0x80,0xf0

表3 コンフィグレージョンディスクリプタの解説とサンプルプログラムでの設定

Field Offset Size(byte) 詳細 今回の設定値
bLength 0 1 Descriptorの全体長。CONFIGURATIONは9(0x09)Byte固定 0x09
bDescriptorType 1 1 Descriptor Types。CONFIGURATIONは2。 0x02
wTotalLength 2 2 当該、および従属ディスクリプタの全長 0x27,0x00
bNumInterface 4 1 インターフェイスディスクリプタの個数 0x01
bConfigurationValue 5 1 Configuration番号。SET_CONFIGURATION時のID。 0x01
iConfiguration 6 1 ConfigurationのストリングディスクリプタのIndex番号。0の場合、指定なし 0x00
bmAttribures 7 1 bit7:予約(1), bit6:Self Power(0/1), bit5:Remote Wakeup機能(0/1), bit4-0:予約(0) 0x80
bMaxPower 8 1 必要とするバスからの電流の1/2(mA)。最大 500(=0xFA*2)mA。値の1/2を設定するのは 1 byte に収めたかったため。USB 3.0では消費電流量bMaxPowerの単位が2mAから8mAへ変更されている 0xf0

(参考文献[5] より引用)

インターフェイスディスクリプタ

//「CfgDesc[39]」に含まれるインターフェイスディスクリプタ
0x09,0x04,0x00,0x00,0x03,0xff,0x01,0x02,0x00

表4 インターフェイスディスクリプタの解説とサンプルプログラムでの設定

Field Offset Size(byte) 詳細 今回の設定値
bLength 0 1 ディスクリプタの長さ。INTERFACE は 9(0x9)Byte 固定。 0x09
bDescriptorType 1 1 ディスクリプタの種別。INTERFACE は 4。 0x04
bInterfaceNumber 2 1 インターフェイスの識別番号。複合デバイス(Composite device)の場合、異なった値が設定されなければならない。デフォルトは 0。 0x00
bAlternateSetting 3 1 代替設定を選択するための値。bInterfaceNumberが同じで bAlternateSetting が異なる別々のディスクリプタを持っている場合、ホスト側からのSET_INTERFACEコマンドで切り替えることが出来る。デフォルトは 0。 0x00
bNumEndpoints 4 1 エンドポイント数(ただし エンドポイント0 は除く) 0x03
bInterfaceClass 5 1 クラス番号(USBクラス)。bDeviceClass(デバイスディスクリプタ) の設定が 0 だった場合、この設定が参照される。0x0 は未定義、0xFF は Vendor-specific。 0xff
bInterfaceSubClass 6 1 サブクラス番号。0x0 と 0xFF 以外は クラス番号に依存する。HIDの時はブートプロトコルに対応しているかどうかのフラグとして使われる。 0x01
bInterfaceProtocol 7 1 プロトコル番号。0x0 と 0xFF 以外は クラス、サブクラス番号に依存する。HIDのときはbInterfaceSubClassが指定されている時だけ意味を持つ。 0x02
iInterface 8 1 Interface の STRING Descriptor の Index 番号。0の場合、指定無し。 0x00

(参考文献[5] より引用)

エンドポイントディスクリプタ

//「CfgDesc[39]」に含まれるエンドポイントディスクリプタ
0x07,0x05,0x82,0x02,0x20,0x00,0x00   

0x07,0x05,0x02,0x02,0x20,0x00,0x00  

0x07,0x05,0x81,0x03,0x08,0x00,0x01  

エンドポイントディスクリプタは複数あるので表5には今回の設定値を記載しません.

表5 エンドポイントディスクリプタの解説

Field Offset Size(byte) 詳細
bLength 0 1 Descriptor の全体長。ENDPOINT は 7(0x7)Byte 固定。
bDescriptorType 1 1 ディスクリプタの種別番号。ENDPOINT は 5。
bEndpointAddress 2 1 bit 7 : IN=1, OUT=0, bit 6-4 : 予約(0), bit 3-0 : エンドポイント番号
bmAttributes 3 1 bit 7-2 : 予約(0), bit 1-0 : 00=コントロール転送、01=アイソクロナス転送、10=バルク転送、11=インタラプト転送
wMaxPacketSize 4 2 最大パケット長。
bInterval 6 0 最大待ち時間。転送方式、速度によって意味合いが異なる。

(参考文献[5] より引用)

以上が今回のプログラムのディスクリプタです. CH55Xシリーズを用いてオリジナルの機器を作ることを考えた場合, 自分でディスクリプタの設定を決める必要があるのでディスクリプタについて頭の片隅に置いておくと開発がスムーズに進むと思います.

おわりに

サンプルプログラムの導入方法とディスクリプタについて解説をおこないました. 次回はサンプルプログラム「USB_Serial.c」について解説しようと考えています.

参考文献

[1]べーた, ‘‘Cerevo TechBlog [21日目]激安中華USBマイコンは使えるのか, ” https://tech-blog.cerevo.com/archives/6068/.

[2]江苏沁恒股份有限公司, ‘‘8 位增强型USB 单片机CH552、CH551,” https://datasheet.lcsc.com/szlcsc/Jiangsu-Qin-Heng-CH552T_C111367.pdf.

[3]Infinitegra, ‘‘Infinitegra TechBlog USBデバイスクラス,” http://www.infinitegra.co.jp/blog/?p=43.

[4]AVR-CDC, ‘‘ソフトウェア USB による仮想 COM ポート,”http://www.recursion.jp/prose/avrcdc/driverj.html.

[5]おなかすいたwiki, ‘USB/ディスクリプタ,”http://wiki.onakasuita.org/pukiwiki/?USB%2F%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF.

[6]ネクストステップ サポートBlog, ‘‘Arduino NANO 互換品(CH340チップ使用)のデバイスドライバー,”https://support.next-step.asia/tag/ch340-usb%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E5%A4%89%E6%8F%9B%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90/.

[7]Electrodragon, ‘‘Electrodragon Wiki,”https://www.electrodragon.com/w/WCH.

USB機能付き格安マイコンCH552Tの開発環境構築について

はじめに

CH552Tの開発環境構築について解説します.

CH55Xシリーズはintel8051というマイコン魔改造した物なので8051の開発環境でコンパイルしたコードならWCH社公式のISPToolでマイコンにプログラムを書き込むことができると思います.

今回はElectrodragon WikiでCH55Xシリーズのサンプルプログラムが公開されているKeilC51(uVision)を使って開発環境を構築します[1].

無料評価版Keil C51(uVision)の入手方法

無料評価版Keil C51(uVision)のインストーラはarm Keilの公式サイトからダウンロードすることができます.

※無料評価版ではオブジェクトサイズが32KBまで制限されています[3].

Keil Product Downloads

f:id:hakura03:20190330150457p:plain
Fig. 1 arm Keil公式サイト画面

C51を選択するとFig. 2の登録画面が出ます. 必要事項を記入するとインストーラをダウンロードできます.

f:id:hakura03:20190330150453p:plain
Fig. 2 登録画面

あとはインストールするだけです.

注意事項

windowsのユーザー名が日本語だとユーザーフォルダ名が日本語になるためKeil C51(uVision)のインストールに失敗します. ユーザー名が日本語の場合は英語名のユーザーアカウントを作ってインストールしてください.

Keil C51の有料版はKeil C51 COMPLER ASSEBLER KIT LICの場合241,560円でPK51 PROFESSIONAL DEVELOPER'SKIT LIC(1年間のライセンス)の場合154,430円だそうです. ※アメリカからの輸入品扱いとなるため価格は為替によって変動します.

学生ライセンスなども存在しないため個人で有料版を購入することはあまり現実的ではありません. コードサイズ上限以上のプログラムを作成する場合はSDCCを利用した方がいいと思います.

CH55Xシリーズ用のプロジェクトファイルの作り方

uVisionを起動したら赤丸で示す部分を選択してください.

f:id:hakura03:20190330153214p:plain
Fig. 3 uVison起動画面

赤丸で示す部分を選択するとプロジェクト製作画面がでるので好きな名前をつけてください.

f:id:hakura03:20190330153137p:plain
Fig. 4 プロジェクト名称決定画面

Keil C51は公式でCH55Xシリーズをサポートしているわけでは無く, intel8051系のマイコンAT89C51やAT89S51用のコンパイラを持っているだけです[1][4]. そのためプロジェクトファイルを作る際にはAT89C51もしくはAT89S51を選択してください. OKを選択するとプロジェクトファイルが作られます.

f:id:hakura03:20190330153935p:plain
Fig. 5 CPU選択画面

uVisionの標準設定ではHEXファイルを出力してくれません[1]. HEXファイルを出力するように設定を変更する必要があります. Fig. 6に示すOptions for Tergetを選択してください.

f:id:hakura03:20190330155436p:plain
Fig. 6 HEXファイル出力設定1

Options for Tergetを選択するとFig. 7に示す画面が出てきます. 赤線で示すOutputタブを開き, 赤丸で示すCreate HEX Fileのチェックボックスにチェックをつけてください.

f:id:hakura03:20190330155923p:plain
Fig. 7 HEXファイル出力設定2

HEXファイルの出力とは関係ありませんが, TargetタブのMemory Model をLarage : variables in XDATAに設定しておくと便利です.

f:id:hakura03:20190330160212p:plain
Fig. 8 メモリサイズ設定

※HEXファイルの設定とメモリサイズの設定はプロジェクトファイルごとにおこなう必要があります.

サンプルプログラムの入手先

Electrodragonが配布しているサンプルプログラムは以下のリンクにあります.

e_dragon / WCH / source / — Bitbucket

ファイルをダウンロードしたら「e_dragon-wch-ed9fe291571d\CH55x\EVT\CH554EVT\EXAM」内にあるCH554.uvproj以外を作成したプロジェクトフォルダ内にコピーしてください.

f:id:hakura03:20190330230518p:plain
Fig. 9 プロジェクトフォルダへコピー

CH554はCH55Xシリーズの一つでCH552にUSBホスト機能を追加したマイコンとなっています. そのためCH554のプログラムはUSBホスト機能などCH552に実装されていない機能のプログラムを削除もしくは使用しないことでCH552でも利用できます.

WCHISPToolの入手先

WCHISPToolはWCH社が公式で提供しているプログラムです. CH55Xシリーズなどにプログラムを書き込むために使用します.

WCHISPTool_Setup.exe - 江苏沁恒股份有限公司

WCHISPToolのSetup.exeをダウンロードしてインストールしてください.

おわりに

CH552の開発環境構築について解説をおこないました. Lチカなどの基本的なプログラムについては参考文献[1]のブログで紹介されているので, 次の記事ではCDCクラスを用いたUSBシリアル通信をCH552でおこなう方法について解説したいと考えています.

参考文献

[1]べーた, ‘‘Cerevo TechBlog [21日目]激安中華USBマイコンは使えるのか, ” https://tech-blog.cerevo.com/archives/6068/.

[2]江苏沁恒股份有限公司, ‘‘8 位增强型USB 单片机CH552、CH551,” https://datasheet.lcsc.com/szlcsc/Jiangsu-Qin-Heng-CH552T_C111367.pdf.

[3]boochow, ‘‘楽しくやろう。ARMの開発環境「MDK」と「µVision」でmbedのデバッグを試してみた,” https://blog.boochow.com/article/441231592.html

[4]Electrodragon, ‘‘Electrodragon Wiki,”https://www.electrodragon.com/w/WCH.