« 2023年3月 | トップページ | 2023年5月 »

2023.04.30

FPGA真贋判定装置でバウンダリスキャンに成功!

IC真贋判定装置のGUIソフトもつくり、動作テストも佳境に入ってきました。

下の写真のように、BGA324のソケットを装着して1本1本に、細いワイヤーを挿して電圧を注入していきます。

Bscan5

すると、制御ソフトの画面上で配線を挿したBGAのピンの場所の電圧が高く表示されます。

Bscan6

この画面を見ながら1本1本のピンが正しい場所につながっているかを調べていくと首が疲れるので、Windowsのソフトに電圧がかかったピンの番号を読み上げてもらうことにしました。

 

こうして、全部のピンが正しくつながっていることを確認したら、ICを挿さずに電源を入れてみてBGAの各ピンに正し電圧が出ているかを何度も何度も念入りに確認します。

Bscan9

 

そして問題がないことが確かめられたら、いよいよFPGAの実機を装着して実験です。

Bscan3

いざ、電源をON!

Bscan4

使用したICは、Spartan-7のXC7S50のCSG324Cです。安全のためVCCIO=1.8Vとしています。

電源電流が90mAくらい増えたけれども、特にショートしているような感じはありません。イイ感じです。

 

そして、JTAGの配線をつないで自動検出してみると、

Bscan7

見事に認識されました!!!

バウンダリスキャンもできました。

Bscan8

バウンダリスキャンのEXTESTモードにして端子を動かすと、

Bscan2

対応するピンの電圧がVCCIOの電圧になりました。(ここではVCCIO=2.5Vにしています)

Bscan1   

大成功です。

これで、どんなICでもBGA324ピンであれば、任意の端子に電源やGNDを与えてJTAGバウンダリスキャンができます。

 

 

| | コメント (3)

2023.04.29

IC真贋判定装置の電源回路が動くようになったのでナイトライダーしてみた

IC真贋判定装置をアルミとアクリルのケースに収めました。

04291

GUIのデバッグアプリを作り、デバッグ用のLEDボードの形が表示されるようにしました。

04292

そして、ナイトライダー機能を作って、動かしてみました。

 

| | コメント (0)

2023.04.28

2022年度の仕事納め

特電は4月決算なので、今日が最後の平日となりました。

今年は赤字か黒字か・・・決算してみるまでわかりませんが、うーん、赤じゃないかな?

やっぱりコロナで半導体不足になって基板が全然作れなかったし、ドイツからの輸入も滞ったから、仕方がないですよね。

来年度は事業再構築の新事業を本格的にスタートさせるぞ!

あと、来年度の消費税は簡易課税不適用の届を出して、本則課税にしました。

売上があるわけじゃなくて大きな設備投資をするからです。

 

| | コメント (0)

2023.04.27

社会保険事務所から呼び出し

社会保険事務所の調査課から呼び出しがあったので行ってきました。

定時改定の用紙を出していないから調査するので支払い関係がわかるものをいろいろ持ってきてちょというわけです。

今は社長一人の会社なので、役員報酬だけで固定給だし、勤務時間もつけていないし、朝から晩まで休日関係なしに働いているよといったら何事もなくOKでした。その場で定時改定の時の用紙を終わりです。

緊張していったのにあっけなかったといえます

 

| | コメント (0)

2023.04.26

AD変換器のアナログ性能でお客様からお褒めの言葉をいただきました

Cosmo-Zのロックインアンプの件であるお客様とTeams会議したのですが、「どうしてこんなにアナログの性能が良いのか」と褒められました。

正直言って嬉しいですね。

低ノイズ、低歪のAD変換器を作るために8年くらい研究を重ねてきました。

 

| | コメント (0)

2023.04.25

360chのAD変換器のGUIアプリを開発中

IC真贋判定装置には360chのAD変換器が乗っているのですが、

04252

各端子の電圧が一目でわかるようにするためのGUIアプリを開発しています。

04251

毎秒50回程度、全ピンの電圧を測って画面に表示することができるようになりました。

電圧を測るだけではなく、GUIでポチポチしながら好きなピンからいろいろな電圧を出力できるようにもしました。

 

 

 

| | コメント (0)

2023.04.24

360ch AD変換器の変換結果を画面表示してみた

開発中のIC真贋判定装置には360チャネルのAD変換器が乗っているわけなのですが、

04241

360本のピンをアナログスイッチで切り替えて、順番に測定したのをBRAMに記録することができるようになりました。

下の画面は計測した値を有効数字1桁で並べて表示したものです。3.3Vなら3と表示され、1.25Vなら1と表示されます。

04242

一周だいたい50msで計測できます。

コンソールアプリではこれが限界なので、そろそろGUIアプリの開発を始めます。

 

| | コメント (0)

2023.04.23

アナログスイッチを切り替えて360チャネルのAD変換器を作った

360個のアナログスイッチを切り替えて360入力チャネルのAD変換器ができました。

入力チャネルの切り替えでAD変換値がどう変化するかを見てみます。

まずは、Lレベルの信号を計測していた端子からHレベルの信号を計測していた端子に切り替わるときのようすです。結構すぐに切り替わります。

04231

 

次はGNDレベルに接続されている端子に切り替えた場合です。これも速やかに切り替わります。

04233

 

最後は弱プルダウンされている端子に切り替わったときです。なんと、70μ秒くらいの時間がかかってゆっくり変化あしていきます。

04232

 

つまるところ、アナログスイッチを切り替えて超多チャネルのAD変換器を作る場合、切り替えのたびにそれなりの時間を待たなければなりません。

 

| | コメント (0)

2023.04.22

90個のピンの電源電圧を測れるようになった

ADコンバータが動くようになったので、変換した値をAXIで読めるレジスタに出して、ソフトで読んでみました。

読める、読めるぞ!

Adc_measure2

これだとわかりにくいので、精度を1桁にして表示してみました。

ついでに、ナイトライダーのようにシフトさせながら電圧を表示してみました。

Adc_measure

LEDの動きにあわせて、電圧の高い部分が移動していくのが見えます。

 

 

| | コメント (0)

2023.04.21

喋る半導体検査プログラムを作りたい

BGAの端子を1本1本検査する際に、ピンにプローブを当てながらオシロを見たり、テスターを見たりするのは効率が悪いので、プログラムに喋らせることができないかと考えています。

音声合成はVisual C#(というか.NET)にもともとあるようで、簡単に使えることがわかりました。

やりかたはすごく簡単でした。

まず、

using System.Speech.Synthesis;

をします。

このままだとSystem.Speech.Synthesisが見つからないというエラーが出るので、System.Speechの参照の追加を行います。

ソリューションエクスプローラで、参照→参照の追加→アセンブリを行い、System.Speechを追加します。

Refspeech2

ソリューションエクスプローラにSystem.Speechが出てくればOKです。

Refspeech

C#のプログラムは、

SpeechSynthesizer speech;
speech = new SpeechSynthesizer();
speech.SetOutputToDefaultAudioDevice();
speech.Speak("A1 3.2ボルト");
speech.Speak("A2 0.03ボルト");
speech.Speak("A3 3.2ボルト");

とします。

これでSpeak関数の中身で書いたとおりに喋ってくれます。

どんな声が使えるかというと、speech.GetInstalledVoiceで調べられるのですが、戻りの型がよくわからいので、

Object var = speech.GetInstalledVoice();

とやってデバッガでウォッチしていみます。

調べてみると、

Microsoft Zira Desktop

Microsoft Haruka Desktop

という2つの音声がインストールされているようです。

話者は

speech.SelectVoice("Microsoft Haruka Desktop");

または

speech.SelectVoice("Microsoft Zira Desktop");

で切り替えられます。

デフォルトはHarukaのようです。萌え系的な要素はまったくありません。

Harukaは数字などを日本語で読み上げてくれますがZiraは英語で読むようです。

ちょっとぎこちないですが、無料でVisual Studioの機能だけで使えるので、超おすすめです。

 

| | コメント (0)

2023.04.20

ADコンバータMAX11198を動かす

非常に苦労しましたが、真贋判定装置のADCを動かすことができました。

当初作った回路にいろいろ問題があったので、こんな汚い回路になってしまいましたが、精いっぱい動いています。

Adc_dirty

使ったADCはMAX11198という16bit 2Msps 2chのADCなのですが、まず、データシートが重くてChromeで読んでいると真ん中あたりのページでブラウザが不安定になったり落ちたりします。Acrobat Readerでも固まります。Edgeで開くと辛うじて読めます。なぜなんでしょうね。

というわけで、データシートはほとんど読んでいません。内部レジスタもなさそうだし、適当に動かしてみましょう。

MAX11198というのはこんな感じのICです。

Max11198

このREFINOUTというところからリファレンス電圧が出てくるみたいなので、抵抗で分圧してOPアンプの非反転増幅にいれてやりましょう・・・とやってみたら大失敗

データシートに書いていなさそうなのですが、REFINOUTから取り出せる電流はマイクロA以下のようです。1MΩの抵抗で分圧しても電圧が下がります。1kΩとかで分圧した日には何も出てきません。

全然REFINOUTじゃないですね。

REFINOUTは外部からリファレンス電圧を入れてやるべきで、取り出してはいけなかったのです。

それから、次の失敗は差動入力であるということ。差動入力ADCというのは入力の+と-の電圧の差をAD変換するのですが、データシートに乗っていたこの回路をそのまま作ってしまいました。

Adc_frontend

何が問題かというと、OPアンプのGND付近の特性に影響されてしまうことです。

OPアンプってGND付近やVCC-数Vは非常に苦手なんです。レール・ツー・レールと謳っているOPアンプも0Vが出せるわけではなく、最低電圧が30mVであってもレール・ツー・レールを謳っています。それに、電源電圧付近では歪が多くなったりします。

メーカーの言っているレール・ツー・レールとか、「真のレール・ツー・レール」なんて嘘ですよ。本当に0Vを出したいなら正負両電源にしなければいけなかったのです。だいいち、VREF/2で折り返して反転増幅させることが気持ち悪い。+側と-側で時間差が出来てしまうではないか。

やはり、ADCのフロントエンドを作るなら、完全差動アンプに限ると思った次第です。

やっとこさアナログ回路が動くようになって、AD変換ができて、正弦波を測ってみました。

AD変換した後のデータをFPGA内でパラレル化してFPGA内蔵ロジックアナライザで見てみました。

Adc_3

イイ感じの正弦波になっていますね。

次は矩形波。

立ち上がりと立下りの部分が歪んでいますが・・・

Adc_2

オシロで見ても歪んでいるので、素直にAD変換できているのでしょう。

Scope_281

のこぎり波もちゃんとAD変換できています。

Adc_1_20230423135101 

とりあえずADコンバータのMAX11198を動かすことはできるようになりましたが、測れる最低電圧は35mVくらいで、使っているレール・ツー・レールのOPアンプが出せる最低電圧とほぼ同じです。

このADCの本来の性能を発揮するには

  • THS4521とかの完全差動アンプと両電源でドライブする
  • ADR381とかの外部VREFを使ってREFINOUTをドライブする

とするべきなのでしょう。

Adcok

| | コメント (0)

2023.04.18

任意のピンから電源出力

4つの電源(1.8V 2.2V 2.5V 3.3V)を、好きな場所からONすることに成功。これでようやくLEDをじわっと光らせながらのナイトライダー(死語)ができる。

LEDの光が滲んでグラデーションしているのでも、カメラのシャッター時間の関係でグラデーションしているのでもなく、隣のLEDを本当に弱く光らせています。

Arbpower

プログラムはこんな感じで、任意の場所に1~4の数字を書き込めば、その場所にVCC1,VCC2,VCC3,VCC4が供給されるようになっています。

Code

GNDも含めると90×8=2880個の電源スイッチがあるのですが、長いシフトレジスタを作ってSPIで制御しています。1つのSPIのチェーンは980bitくらいあって、そのSPIのビット列の1つ1つが電源やGNDのスイッチにつながっています。

SPIの速度は最初は1MHzでやっていましたが、10MHzでも通ることがわかりました。

10MHzで通るなら100μ秒で切り替えられます。

| | コメント (0)

2023.04.17

電源基板の動作確認ができた

半導体検査装置を作っています。

最初の試作ではBGA324ピンまでのICを試験できるよう、360個のピンに1.0~3.3Vまでの任意の4種類の電圧やGNDを与える回路を作っています。

ようやく全モジュールの組み立てが完了して、任意のピンから電源を出すことができるようになりました。

 

| | コメント (0)

2023.04.16

超ロングJTAGチェーン

半導体真贋判定装置の開発をしています。

この電源子基板を32個並べて・・・

Chain32p

できた!自分史上最長JTAGチェーン!32個!!

Chain32

さらに1ユニット増やして48個のCPLD

Chain48p

うぉっしゃー!CPLD48個!超ロングJTAGチェーン!ネビュラチェーンより長い。

Chain48

そしてついに64個基板が並んだ。

Chain64p

JTAG神拳最終奥義!64デバイス!

あたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたたっ!!!

Chain64

書き込みオワタ!!!

 

Detect48

 

アプリケーションエラー!

Hidebu

ひでぶっ!

| | コメント (0)

2023.04.13

高速ADCの入力回路にOPアンプを追加したい

Cosmo-Zのアナログフロントエンドに高速OPアンプとアナログスイッチを追加したいと思い、数日前から回路の構成を考えています。

目的は、

  • 入力インピーダンス50Ωと1MΩを選べるようにしたい
  • 次段の差動アンプから流れてくるバイアス電流をカットしたい
  • ゲイン1とゲイン10を切り替えられるようにしたい

というものです。

そこでLMH6624などの高速OPアンプを検討していたのですが、どうしてもゲイン10以上で使わなければならないという縛りがあって、素直な回路構成が取れませんでした。

入力インピーダンスを高くしてバイアス電流が漏れないようにするには非反転増幅回路にして+側に入れなければなりませんが、ゲイン11でもOPアンプが飽和しないようにするために、OPアンプの入力を1/11にする分圧器をいれなければなりません。

そうすると、ゲイン1MΩというのがどうしても満たせなくなります。

Opamp10

また、追加のOPアンプを入れると歪やノイズは増加するので、切り離した構成も取れるようにしたい。

ゲイン10以上という縛りがある以上、どう頑張っても実現できませんね。

ゲイン1でも安定して動作するOPアンプがあれば、簡単に実現できます。

Opamp11

 

  • 入力を50Ωにしたい・・・Zin=50ΩをON
  • 入力を1MΩにしたい・・・Zin=50ΩをOFF、use opamp側
  • ゲイン10にしたい・・x10側にする、use opamp側にする
  • ゲイン1にしたい・・x1側にする、use opamp側にする
  • 入力OPアンプをバイパスして、歪率とノイズと周波数特性を向上させたい・・・bypass側にする(入力オフセット電流、オフセット電圧は増える。後段のアナログフロントエンドにつながるので1MΩにはならない)

というわけです。

Digikeyで高速OPアンプでGain1で使えてパッケージの小さいものを探してみると、Analog Devices(旧LiniarTechnology)にいろいろありますね。Texas InstrumentsのはGain10とかの縛りが多いように感じます。

LTC6252(GBW 720MHz,2.9nV/√Hz,3.6pA/√Hz,THD-90dBc)とか、LTC6228(GBW 845MHz,0.88nV/√Hz,3pA/√Hz,THD-100dBc)とか。消費電流はLTC6252が4.5mAのほうが少なくてよさそうです。

ゲイン10モードでの帯域が狭くなってもよいのであればADA4841(GBW 80MHZ+,  2.1nV/√Hz, 1.4pA/√Hz, THD-100dB)なんかもよさそうです。

探せばいろいろあるもんですね。

| | コメント (0)

2023.04.12

ADCの入力にOPアンプを追加した場合の雑音の増加について考える

さて、ゲイン11の非反転増幅回路をさまざまなOPアンプで実装して、ノイズの増加について調べてみました。

Opamp6

追加のOPアンプを使わない場合のノイズは0.56LSB(1LSB=244uV)程度ですが、OPアンプを入れることによって若干ノイズが増加します。

  • LMH6624・・・0.83LSB
  • LMP7715・・・0.74LSB
  • LMP7731・・・0.63LSB

です。この結果について考察していきましょう。

まず、OPアンプの非反転増幅回路のノイズは5つの要因で発生します。

  • 入力抵抗で発生する熱雑音 et
  • 入力抵抗で発生する電流雑音 in+
  • OPアンプの入力換算電圧雑音  en
  • 帰還抵抗の熱雑音 √(4kT(Rg||Rf)
  • 帰還抵抗で発生する電流雑音 in-

です。

Opamp7

順番に見ていきます。

まず、抵抗の両端には熱雑音が発生していますが、これは

et=√(4kTRB)

であるのは有名な話ですね。どのくらいの大きさになるかというと、ざっくり言って、10kHzの帯域幅で100kΩなら4μV。100MHzの帯域幅で100kΩならば400μVです。1MHzと1kΩで4μVというのを暗記しておけば、周波数を100倍したり抵抗を100分の1にしたりして暗算できますね。

100MHz 12bitのADCなら1LSB=244μVくらいなので、高速ADCで使うような数百Ωの抵抗ではそれほど問題にはなりません。

 

次にOPアンプのデータシートに乗っている値として入力換算電圧雑音というのがあります。1nV/√Hzなどとかかれたアレです。

これも1nV/√Hzなら、100MHzの帯域幅で10μVくらいにしかならないので、それほど大きな雑音にはなりません。

 

一番厄介なのは入力換算電流雑音です。データシートでは2.3pA/√Hzというふうに書かれますが、ピコアンペアのオーダーなら小さいだろうと思うかもしれませんが、実はこれが意外と大きいのです。

この雑音の意味は、OPアンプの入力端子からバイアス電流が流れ出ているのですが、そのバイアス電流に雑音が乗っているイメージです。バイアス電流は入力抵抗Rsに流れていくので、Rs=1kΩの場合、100MHz帯域ならば23μVになります。

バイアス抵抗だけではなく帰還部分の対GNDのインピーダンスが1kΩならそこでも23μVが発生します。

熱雑音とだいたい同じくらいの大きさに見えますが、熱雑音は√Rに比例するのに対し、電流雑音はRに比例します。

そのため、数pA/√HzクラスのOPアンプだと数kΩ以上で熱雑音よりも電流雑音の方が大きくなります

 

さて、電流雑音というのは半導体のPN接合層を電流が流れるときに生じるもので、その大きさは√(IqB)になります。Iは電流、qは素電荷(1.6×10^-19)、Bは帯域幅です。

だから、OPアンプの場合は、入力バイアス電流が小さいものほど、入力換算電流雑音も小さくなります

例えば、

  • LMP7715は入力バイアス電流は0.05pAで、電流雑音は0.01pA/√Hz
  • LMP7717は入力バイアス電流は0.05pAで、電流雑音は0.01pA/√Hz
  • LMH6624は入力バイアス電流は13μAで、電流雑音は2.3pA/√Hz
  • LMP7731は入力バイアス電流は1nAで、電流雑音は1.1pA/√Hz

個々のICの事情はありますが、入力バイアス電流が小さいほど電流ノイズも小さくなります。電流ノイズが1pA以上になると100MHzの回路で1kΩが無視できなくなります。

LMH6624の場合、電流ノイズが1pA以上ですので、帰還抵抗と入力抵抗を同じ値として計算すると雑音はほぼ電流雑音に起因するものであることがわかります。

Opamp8

対数を取ってみると、だいたい3kΩ以上で電流雑音が支配的になることがわかります。

Opamp8a

 

一方、LM7715の場合、抵抗の値が1MΩになっても熱雑音のほうが支配的です。0.01pA/√HzクラスのCMOS入力OPアンプでは電流雑音を気にする必要はあまりありません。

Opamp8b

トータルの雑音はあくまでも「入力換算」なので、ゲイン倍されて出てくるので注意が必要です。ゲインが大きいアンプほど入力換算雑音は大きく増幅されて出てきます。

3つのOPアンプの雑音を求めてみると、

  • LMH6624, 0.9nV 2.3pA 50MHz→168uV = 0.63LSB
  • LMP7715, 5.8nV 0.01pA 1.8MHz →89μV  = 0.36LSB
  • LMP7731, 2.9nV 1.1pA 8.8MHz →110μV = 0.45LSB

となります。(Cosmo-Zでは1LSBは244μVです。) また、LMP7715は本来は18MHz、LMP7731は88MHzのGB積がありますがゲイン11で使用しているので実際に使えるバンド幅は10分の1程度になります。

上記の雑音が、もとから各チャネルにあった雑音(0.56LSB)と二乗の和で加算されるので、

すると、

  • LMH6624, √(0.56^2+0.63^2)=0.84 LSB
  • LMP7715, √(0.56^2+0.36^2)=0.66 LSB
  • LMP7731, √(0.56^2+0.45^2)=0.71 LSB

となります。

この結果は最初に計測した

  • LMH6624・・・0.83LSB
  • LMP7715・・・0.74LSB
  • LMP7731・・・0.63LSB

とだいたい近い値になっているのがわかります。

このように、OPアンプの挿入によって増加するノイズの大きさを見積ることができました。

 

P.S. OPアンプの雑音計算シートを作りましたので共有します。ダウンロードして使ってください。

Opamp9

https://docs.google.com/spreadsheets/d/1nDz9KKRy0ic8bZzPsg_GH6UrhJKb7QhfMEOA7ixdMv4/edit?usp=sharing

 

 

 

| | コメント (0)

2023.04.11

ADCのプリアンプとしてオペアンプ4種類を評価してみた

次期Cosmo-Zでは、入力インピーダンスの1MΩ化と、入力バイアス電流の除去、入力オフセット電圧の除去のため、アナログ入力をOPアンプでバッファする構成を考えています。

そこで、手元にあったLMH6624、LMP7715、LMP7717、LMP7731を実装して特性を比較してみました。

Sot23opamp

目標は、低ノイズで低歪で周波数特性が良く、低消費電力なアナログフロントエンドを作るためですが、

はい、いきなり発振しました。

ただのボルテージフォロアを作り、入力をオープンにして測ってみた結果なのですが発振です。

Opamp1

元気よく発振しているOPアンプはおそらくLMP7717で、周波数はだいたい10MHzくらいで、指で触ると少し低くなります。

Opamp2

上で挙げたOPアンプはどれも「ゲイン10以上」で使うことを前提とされているので、多かれ少なかれ発振します。

Opamp3

この発振は、出力に抵抗を挿入するとか小手先のテクニックでは収まりません。

1kΩと100Ωで非反転増幅回路を作ったところゲイン11以上になるのでようやく発振は落ち着きました。

入力バイアス電流の影響も排除することができて、オフセットも小さくなりました。

Opamp4

若干ノイズが大きいようですが(LMP7717は故障寸前だったので、おそらく実力よりもかなり大きく出ている)、0.5LSBが0.8LSBになった程度で納まりました。

Opamp5

歪率についてはLMH6624は観測できないほど小さく(<90dBc以下)、LMP7715,7717,7731は70~80dBcくらいでしょう。

性能としては申し分ないのですが、やはりゲイン10以上という制約が大きく、ゲイン10にするならば入力でいったん10分の1にした後で10倍するという勿体ないこをしなければならなくなってしまいます。

 

| | コメント (0)

2023.04.09

C++で作ったDLLから配列をC#で安全に受け取る方法

コアのライブラリはC++で作ってDLL化し、上位層をC#で作りたいということがよくあります。

その場合のやり方を調べたのですが、まぁ、なんというかなかなか本質的な情報にたどり着かないですね。フリーランス向けのWeb塾みたいなページで広告が出てきてクリックしないと消せず、最後まで読んでも結局やりたいことが書いていないとか・・

 

さて、C++でこんな関数を作りたいと思います。

void get_hogehoge(int maxch, double* volts, double* phases)

maxch個の要素を持つvolts[]とphases[]に値をセットして返す関数だと思ってください。

 

プロトタイプの宣言は

CSZAPI void WINAPI get_hogehoge(int maxch, double* volts, double* phases);

として、頭にCSZAPIを、戻り値と関数名の間にWINAPIを付けておきます。

このCSZAPIは自分のライブラリ用に作った適当なマクロの名前で、 __declspec(dllexport) に解釈されます。

 

さて、C++の関数の中では、

for(int i=0;i<maxch;i++) volts[i] = ・・・;

などと書いて値をセットして戻ります。

 

C#のプログラムではDllImportとMarshalを使うために

using System.Runtime.InteropServices;

が必要です。

クラス内の宣言で、DLLの関数を呼び出すために

[DllImport("libほげほげ.dll")]
protected static extern void get_hogehoge(int maxch, IntPtr volts, IntPtr phases);

として、受け取る型はIntPtrにします。最初、out double[]でやとうとしたらクラッシュしました。

プログラムのメインの部分では、

double[] Volts = new double[32];
double[] Phases = new double[32];

として値が格納される配列を作っておき、

IntPtr pVolts = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(double)) * 32);
IntPtr pPhases = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(double)) * 32);

でIntPtr型の変数を作ります。

そして、

get_hogehoge(32, pVolts, pPhases);
Marshal.Copy(pVolts, Volts, 0, 32);
Marshal.Copy(pPhases, Phases, 0, 32);

とします。C#からC++を呼び出すときに、Marshalで作ったIntPtrのメモリにデータを格納して、それを普通に作った配列にコピーするというしくみです。C#のバッファって、たぶん、突然アドレスが変わったりすることが変わるのでしょう。newで普通に確保した配列にDLLの中から値セットしてはいけません。(unsafedとfixedを使えばできなくはない)

使い終わったら、

Marshal.FreeCoTaskMem(pVolts);
Marshal.FreeCoTaskMem(pPhases);

で解放します。

高速性を求めるならunsafeなコードでfixedを使うというやりかたもありますが、そこまで必要でなければMarshalを使うのが安全だと思います。

★補足説明

CSZAPIの定義は

#if defined (__cplusplus)
#ifdef CSZWIN_EXPORTS
#define CSZAPI extern "C" __declspec(dllexport)
#else
#define CSZAPI extern "C" __declspec(dllimport)
#endif
#else
#ifdef CSZWIN_EXPORTS
#define CSZAPI __declspec(dllexport)
#else
#define CSZAPI __declspec(dllimport)
#endif
#endif
#endif

です。

関数のプロトタイプを集めたヘッダファイルの先頭で宣言しておきます。このヘッダファイルをincludeする前にCSZWIN_EXPORTSをあらかじめdefineしておけばdllexportになり、CSZWIN_EXPORTをdefineしていなければdllimportになります。

これで、DLLのソースか、DLLを使うプログラムかで使い分けられるようになっています。

このマクロは、

  • C++なら、extern "C" __declspec(dllexport)になり
  • Cなら、__declspec(dllexport)になります

これで関数名の先頭に_(アンダーバー)が付いたりすることなく、引数に@数字とか付かず、CとC++で名前が一致するようになります。

 

 

 

| | コメント (2)

2023.04.08

Trenz社 UltraScale+ SOM新シリーズ「AM0010」が登場

Trenz社のUltraScale+モジュールに、「AM0010」シリーズが新しく登場しました。

見た感じはTE0720やTE0820と同じような大きさなのですが・・

Am0010023bi21ma-1

 

Am0010023bi21ma_2

 

残念ながら後ろのコネクタに互換性はなく、TE0720やTE0820のベースボードには刺さりません。

Am0010023bi21ma_3

AM0010は何種類かラインナップされていて今後のTrenz製品の主流になっていくのだと思いますが、現時点で在庫があって入手可能なものはAM0010-02-3BI21MAです。

AM0010-02-3BI21MAは、UltraScale+ ZU3EGと、ECC 付き 4G バイト DDR4 SDRAMを搭載していて、ギガビットイーサやUSBホストもボード上に搭載しているとのことです。

I/Oは

  • 最大 204 PL IO
  • 最大 22 PS MIO
  • 4GTR
  • 4 GTH

が取り出せます。

基板のサイズは4cm×5.6cmとのことで、クレジットカードより小さいサイズとのことです。

現時点ではメーカーに在庫が豊富にあるので、注文後1週間程度で入手可能だと思われます。

ベースボードはまだ発売されていませんが、今後登場するでしょう。

新製品のため情報がまだあまりないのですが、追加の情報などがあった場合はこちらのページで紹介していきたいと思います。

 

| | コメント (0)

2023.04.07

見積2倍キャンペーン実施中

最近、受託案件の引き合いが増えています。

特電は、現在は、基本的に私一人でやっているので手が足りません。

回路図描いて基板の設計をしてソフトを作って・・・というのを何社もしていたら、おそらくすべての案件が中途半端になってしまってご迷惑をおかけすることになるでしょう。

そこで、派遣社員で戦力を探すことはできないだろうかと考えてみました。

「3カ月くらいかかる案件があって回路設計のCAD入力のオペレータが欲しい」ということで、派遣会社さんの何社かに問い合わせてみました。

それと並行して受託案件の見積づくりです。

派遣社員の費用は月100万円として、3カ月で300万円。パソコン買ったり作業のための部屋を借りたりとか、一般事務さんも雇うとして、3カ月で100万円。

部品代で50万円。おっと。CADのライセンス費用も必要だなと思って150万円。トータルで600万円くらいになるかなと概算で出しました。

自分でチャチャッとやれば1か月でできそうな基板でも、人を集めて、誰かにやってもらって、さらに会社としての利益も出さなければいけないとなると、このくらいかかってしまいますね。

お客様に提案したら高いということでナシになりました。

別の案件では、基板の設計とソフトの設計で1000万円くらいになるという見積を出しました。返事はまだありませんが、おそらく高いと言われるでしょう。

こういった案件を100万円とか200万円で請けてきたから、貧乏暇なしの状態になっていたんだなとつくづく思います。

 

いままで、「自分でやればすぐできる」と思って自分の給料程度しか見積に乗せてこなかったのですが、そうすると、会社に利益が残らないだけでなく、社会保険料や消費税も出ないし、どんどんじり貧になっていくのです。

そういう感覚で見積を書いてきたから、今までの2倍や3番の金額の見積を出すことに抵抗がありました。

「見積が高いと言われたらどうしよう・・」と思うからです。

そんな悩みは、「派遣社員・契約社員を雇ったらこのくらいかかる」というのを金額の算定根拠にすれば、勇気と自信をもって見積を2倍、3倍で出せることがわかりました。

万が一受注してしまったら、本当に派遣社員を雇って仕事をしてもらえばいいだけのことですし、高いと言われたら初めから請けなければいいだけのことです。

あと、派遣社員を雇うとしたら派遣会社に払う費用をそのまま見積に出したらダメですよ。1.5倍~2倍くらいにしないと「利益」が出ません。人を集めて仕事をするボランティアになってしまいますからね。

自分でやりたい楽しい仕事だけ請ければいいのです。

 

| | コメント (0)

2023.04.06

Trenz社UltraScale+ボード、在庫あります

なかなか入手が困難なTrenzElectronic社のUltraScale+ボードですが、

 

取り寄せた際に余分に何個か買っていたので、

の在庫がございます。

お早めにどうぞ!

| | コメント (0)

2023.04.04

Cosmo-Z 32ch ロックインアンプの動作確認

特注機器として作成してきたCsomo-Z 32ch ロックインアンプの調整を行いました。

32chのロックインアンプですが、こんな感じで32ch分の交流電圧が測れます。

Lockin2_20230408175101

 

それで、やはりチャネルごとの誤算というのは、抵抗やコンデンサの精度で生じてきてしまうので、キャリブレーションできるようにします。

まずは、ファンクションジェネレータからの出力電圧を0V~1mVまで増やしていって、それをCosmo-Zで何Vとして測定されるかを記録します。

Photo_20230408175502

最小二乗で直線にフィットさせて、その係数とオフセットを引き、真の電圧を推定します。

Photo_20230408175501

そうすると、±2uV以内の誤差で交流電圧を計測できます。

 

しかし、キャリブレーションをする端からどんどんずれていくのですね。

どうやら、人の手が同軸ケーブルの外皮に触れているかどうかとかで容易に変動してしまうようです。

1mVを作るために1VのFG出力を抵抗で1/1000にしているから外乱に弱いというのもあると思います。

人がいない深夜に7時間ほど測ったらそれなりに安定していました。

7h

 

| | コメント (0)

« 2023年3月 | トップページ | 2023年5月 »